On Tue, Feb 10, 2015 at 9:31 AM, Andreas Grünbacher
<[email protected]> wrote:
> 2015-02-10 9:05 GMT+01:00 László Böszörményi (GCS) <[email protected]>:
>> Still fails on kFreeBSD.
>
> Then I will need a little help, please: can you debug what happens
> when patch tries to traverse_path() "dir/foo/bar"? It should try to
> openat() subdirectory "foo" in "dir", the openat() should fail with
> errno == ELOOP, and patch should terminate. But maybe FreeBSD returns
> some other errno like ENOTDIR.
I attach the symlink test output with 2.7.6.4 and the syscall log
when I've tried _only_ the failing test from CLI. Run on kFreeBSD/x86,
but if I can install the x64 variant as well for you.
> Maybe it's as simple as the attached patch.
I didn't apply this, hopefully you'll get enough information anyway.
Hope this helps. Regards,
Laszlo/GCS
[26] ln -s f l -- ok
[28] patch < create.diff || echo "Status: $?" -- ok
[34] cat f -- ok
[42] ln -s f l -- ok
[52] patch < modify.diff || echo "Status: $?" -- ok
[58] patch --follow-symlinks < modify.diff || echo "Status: $?" -- ok
[62] cat f -- ok
[66] cat l -- ok
[74] ln -s f l -- ok
[83] patch < delete.diff || echo "Status: $?" -- ok
[102] patch -p1 < create-symlink.diff || echo "Status: $?" -- ok
[106] echo a > target1 && cat symlink -- ok
[109] echo b > target1 && cat symlink -- ok
[126] patch -p1 < modify-symlink.diff || echo "Status: $?" -- ok
[130] echo a > target2 && cat symlink -- ok
[133] echo b > target2 && cat symlink -- ok
[149] patch -p1 < delete-symlink.diff || echo "Status: $?" -- ok
[153] test ! -L symlink -- ok
[174] patch -p1 < symlink-target.diff || echo "Status: $?" -- ok
[197] patch -f -p1 < follow-symlink.diff || echo "Status: $?" -- FAILED
--- expected
+++ got
@@ -1,3 +1,3 @@
patching symbolic link dir/foo
-Refusing to follow symbolic link dir/foo
+/home/gcs/compile/patch/patch-2.7.4.6/src/patch: **** Can't create temporary file dir/foo/bar.o8jjkwC : Too many links
Status: 2
[214] patch -p1 < bad-symlink-target1.diff || echo "Status: $?" -- ok
[229] patch -p1 < bad-symlink-target2.diff || echo "Status: $?" -- ok
[237] patch -p1 --backup < create-symlink.diff || echo "Status: $?" -- ok
[241] test -f symlink.orig && test ! -s symlink.orig -- ok
[245] patch -p1 --backup < modify-symlink.diff || echo "Status: $?" -- ok
[249] echo a > symlink.orig && cat target1 -- ok
[252] echo b > symlink.orig && cat target1 -- ok
[259] patch -p1 --backup < delete-symlink.diff || echo "Status: $?" -- ok
[263] echo a > symlink.orig && cat target2 -- ok
[266] echo b > symlink.orig && cat target2 -- ok
[274] mkdir d -- ok
[282] ln -sf d l -- ok
[284] patch -p1 -i l/ab.diff -- ok
33 tests (32 passed, 1 failed)
2530 patch CALL fstat(0,0xbfbfe730)
2530 patch STRU struct stat {dev=76, ino=3853157, mode=0100644, nlink=1, uid=0, gid=1000, rdev=7709703, atime=1423591583, stime=1423591287, ctime=1423591287, birthtime=1423591287, size=293, blksize=32768, blocks=8, flags=0x0 }
2530 patch RET fstat 0
2530 patch CALL mmap(0,0x8000,0x3<PROT_READ|PROT_WRITE>,0x1002<MAP_PRIVATE|MAP_ANON,0xffffffff,0,0)
2530 patch RET mmap 673128448/0x281f2000
2530 patch CALL lseek(0,0,SEEK_SET,0x1)
2530 patch RET lseek 0
2530 patch CALL lseek(0,0,SEEK_SET,0)
2530 patch RET lseek 0
2530 patch CALL read(0,0x281f2000,0x8000)
2530 patch GIO fd 0 read 293 bytes
"diff --git a/dir/foo b/dir/foo
new file mode 120000
index 0000000..cad2309
--- /dev/null
+++ b/dir/foo
@@ -0,0 +1 @@
+..
\\ No newline at end of file
diff --git a/dir/foo/bar b/dir/foo/bar
new file mode 100644
index 0000000..2ab772d
--- /dev/null
+++ b/dir/foo/bar
@@ -0,0 +1 @@
+created in ..
"
2530 patch RET read 293/0x125
2530 patch CALL openat(AT_FDCWD,0xbfbfe750,0x20100<O_NOFOLLOW|O_DIRECTORY>,<unused>0)
2530 patch NAMI "dir"
2530 patch RET openat -1 errno 2 No such file or directory
2530 patch CALL fstatat(AT_FDCWD,0x8075a88,0xbfbfe700,0)
2530 patch NAMI "dir"
2530 patch RET fstatat -1 errno 2 No such file or directory
2530 patch CALL fstatat(AT_FDCWD,0x8075ab8,0xbfbfe700,0)
2530 patch NAMI "dir"
2530 patch RET fstatat -1 errno 2 No such file or directory
2530 patch CALL lseek(0,0x125,SEEK_SET,0)
2530 patch RET lseek 293/0x125
2530 patch CALL gettimeofday(0xbfbfe9e8,0)
2530 patch RET gettimeofday 0
2530 patch CALL getpid
2530 patch RET getpid 2530/0x9e2
2530 patch CALL openat(AT_FDCWD,0xbfbfe8d0,0x20100<O_NOFOLLOW|O_DIRECTORY>,<unused>0)
2530 patch NAMI "dir"
2530 patch RET openat -1 errno 2 No such file or directory
2530 patch CALL mkdirat(AT_FDCWD,0x8075b10,0x1ff<S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH>)
2530 patch NAMI "dir"
2530 patch RET mkdirat 0
2530 patch CALL openat(AT_FDCWD,0xbfbfe8d0,0x20100<O_NOFOLLOW|O_DIRECTORY>,<unused>0)
2530 patch NAMI "dir"
2530 patch RET openat 3
2530 patch CALL getrlimit(RLIMIT_NOFILE,0xbfbfe90c)
2530 patch RET getrlimit 0
2530 patch CALL openat(0x3,0x8075afc,0xa01<O_WRONLY|O_CREAT|O_EXCL>,0x1b6<S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH>)
2530 patch NAMI "foo.oNmSf8R"
2530 patch RET openat 4
2530 patch CALL fcntl(0x4,F_GETFL,0x1)
2530 patch RET fcntl 1
2530 patch CALL fstat(0x4,0xbfbfe7b0)
2530 patch STRU struct stat {dev=76, ino=3853159, mode=0100644, nlink=1, uid=0, gid=1000, rdev=0, atime=1423591701, stime=1423591701, ctime=1423591701, birthtime=1423591701, size=0, blksize=32768, blocks=0, flags=0x0 }
2530 patch RET fstat 0
2530 patch CALL mmap(0,0x8000,0x3<PROT_READ|PROT_WRITE>,0x1002<MAP_PRIVATE|MAP_ANON,0xffffffff,0,0)
2530 patch RET mmap 673161216/0x281fa000
2530 patch CALL lseek(0x4,0,SEEK_SET,0x1)
2530 patch RET lseek 0
2530 patch CALL fstat(0x1,0xbfbfe350)
2530 patch STRU struct stat {dev=1895890688, ino=57, mode=020600, nlink=1, uid=0, gid=5, rdev=57, atime=1423591701, stime=1423591701, ctime=1423591701, birthtime=-1, size=0, blksize=4096, blocks=0, flags=0x0 }
2530 patch RET fstat 0
2530 patch CALL ioctl(0x1,0x402c7413,0xbfbfe3a4)
2530 patch RET ioctl 0
2530 patch CALL mmap(0,0x1000,0x3<PROT_READ|PROT_WRITE>,0x1002<MAP_PRIVATE|MAP_ANON,0xffffffff,0,0)
2530 patch RET mmap 673193984/0x28202000
2530 patch CALL write(0x1,0x28202000,0x1f)
2530 patch GIO fd 1 wrote 31 bytes
"patching symbolic link dir/foo
"
2530 patch RET write 31/0x1f
2530 patch CALL write(0x4,0x281fa000,0x2)
2530 patch GIO fd 4 wrote 2 bytes
".."
2530 patch RET write 2
2530 patch CALL fstat(0x4,0xbfbfe9f0)
2530 patch STRU struct stat {dev=76, ino=3853159, mode=0100644, nlink=1, uid=0, gid=1000, rdev=7709709, atime=1423591701, stime=1423591701, ctime=1423591701, birthtime=1423591701, size=2, blksize=32768, blocks=8, flags=0x0 }
2530 patch RET fstat 0
2530 patch CALL close(0x4)
2530 patch RET close 0
2530 patch CALL __sysctl(0xbfbfe9b8,0x2,0x281eeb24,0xbfbfe9b4,0,0)
2530 patch SCTL "hw.pagesize"
2530 patch RET __sysctl 0
2530 patch CALL munmap(0x281fa000,0x8000)
2530 patch RET munmap 0
2530 patch CALL sigprocmask(SIG_BLOCK,0x807368c,0x807369c)
2530 patch RET sigprocmask 0
2530 patch CALL fstatat(0x3,0x8075a7c,0xbfbfe850,0x200)
2530 patch NAMI "foo"
2530 patch RET fstatat -1 errno 2 No such file or directory
2530 patch CALL openat(0x3,0x8075afc,0<O_RDONLY>,<unused>0)
2530 patch NAMI "foo.oNmSf8R"
2530 patch RET openat 4
2530 patch CALL read(0x4,0x8076ba8,0x400)
2530 patch GIO fd 4 read 2 bytes
".."
2530 patch RET read 2
2530 patch CALL read(0x4,0x8076baa,0x3fe)
2530 patch GIO fd 4 read 0 bytes
""
2530 patch RET read 0
2530 patch CALL close(0x4)
2530 patch RET close 0
2530 patch CALL unlinkat(0x3,0x8075a7c,0)
2530 patch NAMI "foo"
2530 patch RET unlinkat -1 errno 2 No such file or directory
2530 patch CALL symlinkat(0x8076ba8,0x3,0x8075a7c)
2530 patch NAMI "foo"
2530 patch RET symlinkat 0
2530 patch CALL fstatat(0x3,0x8075a7c,0xbfbfe870,0x200)
2530 patch NAMI "foo"
2530 patch STRU struct stat {dev=76, ino=3853160, mode=0120755, nlink=1, uid=0, gid=1000, rdev=11822, atime=1423591701, stime=1423591701, ctime=1423591701, birthtime=1423591701, size=2, blksize=32768, blocks=0, flags=0x0 }
2530 patch RET fstatat 0
2530 patch CALL sigprocmask(SIG_SETMASK,0x807369c,0)
2530 patch RET sigprocmask 0
2530 patch CALL lseek(0,0x125,SEEK_SET,0)
2530 patch RET lseek 293/0x125
2530 patch CALL openat(0x3,0xbfbfe750,0x20100<O_NOFOLLOW|O_DIRECTORY>,<unused>0)
2530 patch NAMI "foo"
2530 patch RET openat -1 errno 31 Too many links
2530 patch CALL fstatat(AT_FDCWD,0x80765e8,0xbfbfe700,0)
2530 patch NAMI "dir"
2530 patch STRU struct stat {dev=76, ino=3853158, mode=040755, nlink=2, uid=0, gid=1000, rdev=7709702, atime=1423591701, stime=1423591701, ctime=1423591701, birthtime=1423591701, size=512, blksize=32768, blocks=8, flags=0x0 }
2530 patch RET fstatat 0
2530 patch CALL fstatat(0x3,0x80765ec,0xbfbfe700,0)
2530 patch NAMI "foo"
2530 patch STRU struct stat {dev=76, ino=3852748, mode=040755, nlink=3, uid=0, gid=1000, rdev=7707917, atime=1423298737, stime=1423591701, ctime=1423591701, birthtime=1423043865, size=3584, blksize=32768, blocks=8, flags=0x0 }
2530 patch RET fstatat 0
2530 patch CALL fstatat(AT_FDCWD,0x8076600,0xbfbfe700,0)
2530 patch NAMI "dir"
2530 patch STRU struct stat {dev=76, ino=3853158, mode=040755, nlink=2, uid=0, gid=1000, rdev=7709702, atime=1423591701, stime=1423591701, ctime=1423591701, birthtime=1423591701, size=512, blksize=32768, blocks=8, flags=0x0 }
2530 patch RET fstatat 0
2530 patch CALL fstatat(0x3,0x8076604,0xbfbfe700,0)
2530 patch NAMI "foo"
2530 patch STRU struct stat {dev=76, ino=3852748, mode=040755, nlink=3, uid=0, gid=1000, rdev=7707917, atime=1423298737, stime=1423591701, ctime=1423591701, birthtime=1423043865, size=3584, blksize=32768, blocks=8, flags=0x0 }
2530 patch RET fstatat 0
2530 patch CALL lseek(0,0x125,SEEK_SET,0)
2530 patch RET lseek 293/0x125
2530 patch CALL unlinkat(0x3,0x8075afc,0)
2530 patch NAMI "foo.oNmSf8R"
2530 patch RET unlinkat 0
2530 patch CALL gettimeofday(0xbfbfe9e8,0)
2530 patch RET gettimeofday 0
2530 patch CALL getpid
2530 patch RET getpid 2530/0x9e2
2530 patch CALL openat(0x3,0xbfbfe8d0,0x20100<O_NOFOLLOW|O_DIRECTORY>,<unused>0)
2530 patch NAMI "foo"
2530 patch RET openat -1 errno 31 Too many links
2530 patch CALL write(0x2,0x8071580,0x3b)
2530 patch GIO fd 2 wrote 59 bytes
"patch: **** Can't create temporary file dir/foo/bar.o8ZGZhA"
2530 patch RET write 59/0x3b
2530 patch CALL write(0x2,0x8071580,0x12)
2530 patch GIO fd 2 wrote 18 bytes
" : Too many links
"
2530 patch RET write 18/0x12
2530 patch CALL exit(0x2)