[PATCH] D83834: Add test utility 'split-file'

Rainer Orth via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 10 13:57:13 PDT 2020


ro added a comment.

In D83834#2208059 <https://reviews.llvm.org/D83834#2208059>, @MaskRay wrote:

> 



> @ro Can you set a breakpoint while running split-file, checking whether split-file can delete an existing file and replace it with a directory on Solaris?
> This behavior is intentionally added to support changing `%t` from a file to a directory. It appears to work well on macOS, Linux and Windows.

Here's what I found: the failing call to `split-file` is like this:

  ./bin/split-file --no-leading-lines /vol/llvm/src/llvm-project/local/llvm/test/tools/split-file/empty.test /var/llvm/local-sparcv9-A/test/tools/split-file/Output/empty.test.tmp

Running under `truss` shows

  19028:  fstatat(AT_FDCWD, "/var/llvm/local-sparcv9-A/test/tools/split-file/Output/empty.test.tmp", 0xFFFFFFFF7FFFE380, AT_SYMLINK_NOFOLLOW) = 0
  19028:      d=0x0000010600010012 i=212407 m=0042750 l=2  u=2110  g=4620  sz=3
  19028:          at = Aug 10 11:21:41 MEST 2020  [ 1597051301.681593645 ]
  19028:          mt = Aug 10 01:46:42 MEST 2020  [ 1597016802.271083280 ]
  19028:          ct = Aug 10 01:46:42 MEST 2020  [ 1597016802.271083280 ]
  19028:      bsz=512   blks=3     fs=zfs
  19028:  unlinkat(AT_FDCWD, "/var/llvm/local-sparcv9-A/test/tools/split-file/Output/empty.test.tmp", AT_REMOVEDIR) Err#17 EEXIST

i.e. it tries to remove a directory.  However, this cannot work since the directory in question isn't empty:

  $ ls -la /var/llvm/local-sparcv9-A/test/tools/split-file/Output/empty.test.tmp
  total 4
  drwxr-s--- 2 ro gcc  3 Aug 10 01:46 ./
  drwxr-sr-x 5 ro gcc 11 Aug 10 18:32 ../
  -rw-r--r-- 1 ro gcc  0 Aug 10 01:46 empty

When I run `split-file` in `gdb` with a breakpoint in `rmdir`, I get

  #0  0xffffffff7eeb7388 in rmdir () from /lib/64/libc.so.1
  #1  0xffffffff7ee2c47c in remove () from /lib/64/libc.so.1
  #2  0x000000010025069c in llvm::sys::fs::remove (path=..., 
      IgnoreNonExisting=true)
      at /vol/llvm/src/llvm-project/local/llvm/lib/Support/Unix/Path.inc:442
  #3  0x00000001001821ac in main (argc=4, argv=0xffffffff7fffeb38)
      at /vol/llvm/src/llvm-project/local/llvm/tools/split-file/split-file.cpp:168

So `llvm::sys::fs::remove` tries to call `::remove` on a non-empty directory, while the man page clearly states:

  The  remove() function causes the file or empty directory whose name is
  the string pointed to by path to be no longer accessible by that  name.
  A  subsequent  attempt  to  open  that  file using that name will fail,
  unless the file is created anew.
  
  For files, remove() is identical to unlink(). For directories, remove()
  is identical to rmdir().

and in turn `rmdir(2)` says

  The  rmdir()  function  removes  the  directory  named by the path name
  pointed to by path. The directory must not have any entries other  than
  "." and "..".

This just cannot work!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83834/new/

https://reviews.llvm.org/D83834



More information about the llvm-commits mailing list