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)

Reply via email to