kern/55993: getcwd() breaks on unionfs mounted directories
Ulrich Spoerlein
q at uni.de
Tue Aug 26 07:00:29 PDT 2003
>Number: 55993
>Category: kern
>Synopsis: getcwd() breaks on unionfs mounted directories
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Aug 26 07:00:26 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator: Ulrich Spoerlein
>Release: FreeBSD 5.1-RELEASE i386
>Organization:
>Environment:
System: FreeBSD roadrunner 5.1-RELEASE FreeBSD 5.1-RELEASE #1: Mon Aug 11 15:27:16 CEST 2003 q at roadrunner:/usr/obj/usr/src/sys/ROADRUNNER i386
>Description:
Inside a chroot, a simple 'pwd' will fail, if it is run on a unionfs mounted
directory. truss shows the following:
readlink("/etc/malloc.conf","aj",63) = 2 (0x2)
issetugid() = 0 (0x0)
getuid() = 0 (0x0)
mmap(0x0,4096,0x3,0x1002,-1,0x0) = 671449088 (0x28058000)
break(0x805c000) = 0 (0x0)
break(0x805d000) = 0 (0x0)
__getcwd(0x805c000,0x3fc) ERR#20 'Not a directory'
stat("/",0xbfbff4e0) = 0 (0x0)
lstat(".",0xbfbff4e0) = 0 (0x0)
stat("..",0xbfbff400) = 0 (0x0)
open("..",0x4,00) = 3 (0x3)
fstat(3,0xbfbff400) = 0 (0x0)
fcntl(0x3,0x2,0x1) = 0 (0x0)
break(0x805e000) = 0 (0x0)
__sysctl(0xbfbff2b0,0x2,0x8059084,0xbfbff2ac,0x0,0x0) = 0 (0x0)
fstatfs(0x3,0xbfbff300) = 0 (0x0)
break(0x805f000) = 0 (0x0)
getdirentries(0x3,0x805e000,0x1000,0x805d014) = 512 (0x200)
getdirentries(0x3,0x805e200,0xe00,0x805d014) = 512 (0x200)
getdirentries(0x3,0x805e400,0xc00,0x805d014) = 0 (0x0)
fstat(3,0xbfbff4e0) = 0 (0x0)
lseek(3,0x200,0) = 512 (0x200)
close(3) = 0 (0x0)
lstat("../",0xbfbff4e0) = 0 (0x0)
stat("../..",0xbfbff400) = 0 (0x0)
open("../..",0x4,04) = 3 (0x3)
fstat(3,0xbfbff400) = 0 (0x0)
fcntl(0x3,0x2,0x1) = 0 (0x0)
fstatfs(0x3,0xbfbff300) = 0 (0x0)
fstat(3,0xbfbff4e0) = 0 (0x0)
getdirentries(0x3,0x805e000,0x1000,0x805d014) = 512 (0x200)
getdirentries(0x3,0x805e000,0x1000,0x805d014) = 0 (0x0)
lseek(3,0x0,0) = 0 (0x0)
close(3) = 0 (0x0)
pwd: write(2,0xbfbfedd0,5) = 5 (0x5)
.write(2,0xbfbfedf0,1) = 1 (0x1)
: write(2,0x80568cc,2) = 2 (0x2)
No such file or directory
write(2,0xbfbfedd0,26) = 26 (0x1a)
exit(0x1)
process exit, rval = 256
This also renders 'make' in any port of choice unuseable.
>How-To-Repeat:
cd /usr/src && make world DESTDIR=/livefs
mkdir -p /livefs/usr/ports && mount -t unionfs /usr/ports /livefs/usr/ports
Doing a pwd in /livefs/usr/ports/editors/vim works just fine, however doing a
'make' fails. Running truss on both processes shows that both processes should
fail to get getcwd(). I don't know why a simple pwd prints the correct directory,
a 'truss pwd' does not.
Now chroot to /livefs
# chroot /livefs /bin/tcsh
# cd /usr/ports/editors/vim && pwd
pwd: .: No such file or directory
So here pwd "correctly fails" to call getcwd() (It always returns ERR#20), make is
broken too.
>Fix:
Please don't tell me that unionfs is buggy, I know that and I read the manpages.
However I think that (when working) unionfs is a real cool tool and can obviously
do more than an union-mount. I will try to get into debugging this, but my skills
are severly limited with respect to that area :(
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list