[Valgrind-developers] valgrind --track-fds, fuse and other issues

Mark Wielaard mark@klomp.org
Sat Sep 21 23:31:44 GMT 2024


Hi Florian,

On Sat, Sep 21, 2024 at 11:40:43PM +0200, Florian Weimer wrote:
> * Mark Wielaard:
> > The readlink system call should work, but I see the readlinkat system
> > call doesn't have a fuse marker in the valgrind PRE handler.
> 
> That's odd.  It's really using the readlink system call as far as I can
> tell.
> 
> To reproduce:
> 
> git clone --depth=1 https://sourceware.org/git/glibc.git
> cd glibc
> mkdir build
> cd build
> ../configure --prefix=/usr --disable-nscd --disable-mathvec MAKEINFO=:
> make -j`nproc`
> make -j`nproc` subdirs=support check run-built-tests=no
> 
> On Fedora 40 (glibc 2.39), it's still possible to run the test directly
> because the version difference is not too great, so you can run the test
> directly:
> 
> valgrind --leak-check=full --sim-hints=fuse-compatible \
>   support/tst-support_fuse --direct

Interesting. I see valgrind reports:

==1530594== Syscall param mount(type) points to unaddressable byte(s)
==1530594==    at 0x498C8FE: mount (syscall-template.S:117)
==1530594==    by 0x10EC4E: support_enter_mount_namespace (support_enter_mount_namespace.c:36)
==1530594==    by 0x10BDB4: support_fuse_init (support_fuse.c:236)
==1530594==    by 0x10B095: do_test (tst-support_fuse.c:238)
==1530594==    by 0x10DF81: support_test_main (support_test_main.c:413)
==1530594==    by 0x10A67A: main (test-driver.c:171)
==1530594==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

But in this case we should ignore the mount (filesystem)type argument.

> If you terminate the FUSE service using
> 
> echo 1 | tee /sys/fs/fuse/connections/*/abort
> 
> the failure strongly suggests that readlink is at fault:
> 
> error: xreadlink.c:34: readlink ("/tmp/glibc-tst-fuse.264432.1/264432.1//symlink"): Software caused connection abort
> 
> And strace shows there is really a readlink system call.

You are right. It is the plain readlink syscall. The problem is that
valgrind tries to intercept it for /proc/self/exe so it returns the
actual binary instead of the valgrind "wrapper". Because of that it
seems to do a direct, "blocking" syscall. I am working on a
workaround/fix.

> > I found several other (at) syscalls missing the fuse marker so I filed
> > a bug and submitted a patch:
> > https://bugs.kde.org/show_bug.cgi?id=493454
> 
> The copy_file_range system call has a FUSE event, too.  If I understand
> it correctly, it should probably be marked as blocking unconditionally
> because as a file system operation, it can potentially take quite some
> time.

Yes, you are probably right.

> Furthermore, I think fcntl and fcntl64 do not handle the OFD locks:
> 
> #  if defined(VGP_x86_linux)
>    if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64)
> #  else
>    if (ARG2 == VKI_F_SETLKW)
> #  endif
>       *flags |= SfMayBlock;

Nice catch. We seem to handle the File Locks and Open File Descriptor
Locks mostly identical except here.

Thanks,

Mark


More information about the Libc-alpha mailing list