Re: Re: Still having lstat trouble

From: Date: Fri, 25 May 2007 16:17:41 +0000
Subject: Re: Re: Still having lstat trouble
References: 1 2 3 4 5 6 7  Groups: php.internals 
Request: Send a blank email to internals+get-29759@lists.php.net to get a copy of this message
On 5/24/07, Rasmus Lerdorf <rasmus@lerdorf.com> wrote:
Which filesystems is /tmp on on the various boxes? tmpfs related perhaps? -Rasmus
Nice idea, but I don't think it's a problem there, I think it's a configuration problem. I've build my own linux, and so I have all configuration like I want. I'm running php-5.2.3RC1 as Apache 2.2.3 module. I've split up my USB stick in a few file systems, and they worked all for me, except for msdos&vfat file systems, as they don't support symlinks. Test results here: http://86.86.80.41/fs_test.php and source for the test is here: http://86.86.80.41/fs_test.phps Tijnema
Brian Moon wrote: Works as expected on my Mac (no strace on my Mac). On my Gentoo 64-bit server, I get the wrong data from Apache2 and CLI. On my 32-bit Gentoo server, without Apache 2, I get the correct answer from apache and cli. On my 32-bit Gentoo server with Apache 2 I get a wrong answer from Apache and cli. We build our PHP on these servers with the same options via emerge. The only difference is Apache 2. What the hell? # uname -a Linux proxy1 2.6.18-gentoo-r6 #1 SMP Thu Feb 8 07:32:31 EST 2007 x86_64 Dual-Core AMD Opteron(tm) Processor 2210 AuthenticAMD GNU/Linux # php foobar.php dir not a link same lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
access("/tmp/pear", F_OK)               = 0
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/link-test", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0 readlink("/tmp/link-test", "/tmp/pear", 4096) = 9 lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
access("/tmp/pear", F_OK)               = 0
unlink("/tmp/link-test")                = 0
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/link-test", 0x7fff3f48fb70) = -1 ENOENT (No such file or directory) lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 symlink("/tmp/pear", "/tmp/link-test") = 0 lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/link-test", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0 readlink("/tmp/link-test", "/tmp/pear", 4096) = 9 lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b906b634000
write(1, "dir", 3dir)                      = 3
write(1, "\n", 1
)                       = 1
write(1, "not a link", 10not a link)              = 10
write(1, "\n", 1
)                       = 1
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 stat("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
write(1, "same", 4same)                     = 4
32-bit Gentoo however acts as expected. $ uname -a Linux deadpool 2.6.11-gentoo-r6 #1 SMP Thu Apr 14 07:52:09 EDT 2005 i686 Intel(R) Xeon(TM) CPU 3.20GHz GenuineIntel GNU/Linux php test.php link link differ
access("/tmp/pear", F_OK)               = 0
access("/tmp/link-test", F_OK)          = 0
unlink("/tmp/link-test")                = 0
time(NULL)                              = 1179959743
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=14416, ...}) = 0 lstat64("/tmp/link-test", 0xbfff5e4c) = -1 ENOENT (No such file or directory)
time(NULL)                              = 1179959743
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=14416, ...}) = 0 lstat64("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=72, ...}) = 0 symlink("/tmp/pear", "/tmp/link-test") = 0 lstat64("/tmp/link-test", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78b1000
write(1, "link", 4link)                     = 4
write(1, "\n", 1
)                       = 1
write(1, "link", 4link)                     = 4
write(1, "\n", 1
)                       = 1
stat64("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=72, ...}) = 0
write(1, "differ", 6differ)                   = 6
Rasmus Lerdorf wrote:
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat64("/tmp/link-test", 0xbff229ec) = -1 ENOENT (No such file or directory) lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat64("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 symlink("/tmp/pear", "/tmp/link-test") = 0 lstat64("/tmp/link-test", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0
write(1, "link", 4link)                     = 4
write(1, "\n", 1
)                       = 1
write(1, "link", 4link)                     = 4
write(1, "\n", 1
)                       = 1
stat64("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
write(1, "differ", 6differ)                   = 6
Scott MacVicar wrote:
I'm getting similar results from a RHEL 4 box we have here, its running 5.2.3-dev. scott@scarlet [/tmp] # cat /etc/redhat-release Red Hat Enterprise Linux ES release 4 (Nahant Update 4) scott@scarlet [~] # uname -a Linux scarlet 2.6.9-42.0.2.ELsmp #1 SMP Thu Aug 17 18:00:32 EDT 2006 i686 i686 i386 GNU/Linux scott@scarlet [/tmp] # php test.php dir not a link same strace for the during execution is. lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat64("/tmp/link-test", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0
That means /tmp/link-test exists already, otherwise lstat returns -1. Here is what I see if the link already exists when I run my script:
access("/tmp/pear", F_OK)               = 0
access("/tmp/link-test", F_OK)          = 0
unlink("/tmp/link-test")                = 0
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat64("/tmp/link-test", 0xbff229ec) = -1 ENOENT (No such file or directory) lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0 lstat64("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 symlink("/tmp/pear", "/tmp/link-test") = 0 lstat64("/tmp/link-test", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0
write(1, "link", 4link)                     = 4
write(1, "\n", 1
)                       = 1
write(1, "link", 4link)                     = 4
write(1, "\n", 1
)                       = 1
stat64("/tmp/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
write(1, "differ", 6differ)                   = 6
So did you leave out those access() calls, and did they fail, or did the unlink() fail perhaps? -Rasmus
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php


« previous php.internals (#29759) next »