On Fri, Oct 03, 2008 at 09:43:19PM -0400, Joe Malicki wrote: > This faked-link2.diff (patch to fakeroot 1.5.10) passes tests and holds up > through > reasonable testing. > > It should fix all cases noted in this bug, which were probably all caused by > ldconfig.
Forward-ported to 1.10 so I can get back to it later. Also I want to add trap handlers to the tests to rm -rf tmp on premature abort.
diff --git a/faked.c b/faked.c index a98b0b5..1e38853 100644 --- a/faked.c +++ b/faked.c @@ -662,12 +662,17 @@ void process_chmod(struct fake_msg *buf){ cache stale file information. mknod() creates a regular file, everything else should have the same - file type on disk and in our database. Therefore, we check to see if - it's a regular file before blindly applying the new file type. + file type on disk and in our database. Therefore, we check the file's + type first. If we have something in our database as a device node and + we get a request to change it to regular file, it might be a chmod of + a device node that was created from within fakeroot, which is a device + file on disk - there's no way to distinguish. For anything else, we + trust the new type and assume the inode got unlinked from something that + wasn't using the LD_PRELOAD library. */ - if ((buf->st.mode&S_IFMT) != S_IFREG && - (buf->st.mode&S_IFMT) != (st->mode&S_IFMT)) { + if ((buf->st.mode&S_IFMT) != (st->mode&S_IFMT) && + ((buf->st.mode&S_IFMT) != S_IFREG || (!st->mode&(S_IFBLK|S_IFCHR)))) { fprintf(stderr,"FAKEROOT: chmod mode=%lo incompatible with " "existing mode=%lo\n", buf->st.mode, st->mode); st->mode = buf->st.mode; diff --git a/test/Makefile.am b/test/Makefile.am index 9a03d6f..e22b978 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,7 +1,7 @@ AUTOMAKE_OPTIONS=foreign TESTS = t.echoarg t.mknod t.tar t.truereturn t.falsereturn t.option \ - t.touchinstall t.no_ld_preload + t.touchinstall t.no_ld_preload t.no_ld_preload_link t.chmod_dev suffix = TESTS_ENVIRONMENT = libfakeroot=libfakeroot-0.so suffix=$(suffix) posixshell=$(SHELL) diff --git a/test/t.chmod_dev b/test/t.chmod_dev new file mode 100755 index 0000000..34d8c63 --- /dev/null +++ b/test/t.chmod_dev @@ -0,0 +1,8 @@ +#!/bin/sh + +mkdir tmp +../scripts/fakeroot${tcp} -f ../faked${tcp} -l ../.libs/${libfakeroot} -- \ + ${posixshell} -c 'mknod tmp/hda3 b 3 0 && chmod 644 tmp/hda3 && ls -ld tmp/hda3' | grep "^b" +TEMP=$? +rm -rf tmp +exit $TEMP diff --git a/test/t.no_ld_preload b/test/t.no_ld_preload index b5cd729..64a20f2 100755 --- a/test/t.no_ld_preload +++ b/test/t.no_ld_preload @@ -1,4 +1,8 @@ #!/bin/sh +mkdir tmp ../scripts/fakeroot${tcp} -f ../faked${tcp} -l ../.libs/${libfakeroot} -- \ - ${posixshell} -c 'touch justafile; LD_PRELOAD= rm justafile; mkdir justafile; ls -ld justafile' | grep "^d" + ${posixshell} -c 'touch tmp/justafile && LD_PRELOAD= rm tmp/justafile && mkdir tmp/justafile && ls -ld tmp/justafile' | grep "^d" +TEMP=$? +rm -rf tmp +exit $TEMP diff --git a/test/t.no_ld_preload_link b/test/t.no_ld_preload_link new file mode 100755 index 0000000..be32114 --- /dev/null +++ b/test/t.no_ld_preload_link @@ -0,0 +1,8 @@ +#!/bin/sh + +mkdir tmp +../scripts/fakeroot${tcp} -f ../faked${tcp} -l ../.libs/${libfakeroot} -- \ + ${posixshell} -c 'touch tmp/justafile && ln -s justafile tmp/alink && LD_PRELOAD= rm tmp/alink && touch tmp/alink && ls -ld tmp/alink' | grep "^-" +TEMP=$? +rm -rf tmp +exit $TEMP