1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-07 16:59:22 +00:00

unfs3: Fix race issue causing a glibc test hang

When running glibc tests under user mode NFS, tst-syslog was causing a hang. The
hang was traced to unfsd exitting with a buffer overflow being detected.

This was traced down to mksocket() where we'd see:

socket path '/media/build/poky/build/build-st-2118464/tmp/work/x86-64-v3-poky-linux/glibc-testsuite/2.42+git/build-x86_64-poky-linux/testroot.root/dev/log' is too long at 141 vs 108

There is a length check in mknod_args() but obj may not be setup at this point by
cat_name() since the functions can be executed out of order according to C.

To avoid this, make the order explict. This means the length is checked and we
avoid the buffer overflow. This will likely cause the glibc test to fail however
it won't hang, which is a win.

[YOCTO #16113]

(From OE-Core rev: 34f34512e5eeefc24b36b102a36fc90f14e2f7d2)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Hemanth Kumar M D <Hemanth.KumarMD@windriver.com>
(cherry picked from commit e51d5e19cb1ba1d5ad7442064b64821d178bc9ca)
Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
Signed-off-by: Paul Barker <paul@pbarker.dev>
This commit is contained in:
Hemanth Kumar M D
2026-04-02 01:21:35 -07:00
committed by Paul Barker
parent 6916cc525e
commit 8e82d7a9bf
2 changed files with 39 additions and 0 deletions
@@ -0,0 +1,38 @@
When running glibc tests under user mode NFS, tst-syslog was causing a hang. The
hang was traced to unfsd exitting with a buffer overflow being detected.
This was traced down to mksocket() where we'd see:
socket path '/media/build/poky/build/build-st-2118464/tmp/work/x86-64-v3-poky-linux/glibc-testsuite/2.42+git/build-x86_64-poky-linux/testroot.root/dev/log' is too long at 141 vs 108
There is a length check in mknod_args() but obj may not be setup at this point by
cat_name() since the functions can be executed out of order according to C.
To avoid this, make the order explict. This means the length is checked and we
avoid the buffer overflow. This will likely cause the glibc test to fail however
it won't hang, which is a win.
Upstream-Status: Pending
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Hemanth Kumar M D <Hemanth.KumarMD@windriver.com>
diff --git a/nfs.c b/nfs.c
index 3e92f87..784089a 100644
--- a/nfs.c
+++ b/nfs.c
@@ -776,9 +776,11 @@ MKNOD3res *nfsproc3_mknod_3_svc(MKNOD3args * argp, struct svc_req * rqstp)
PREP(path, argp->where.dir);
pre = get_pre_cached();
- result.status =
- join3(cat_name(path, argp->where.name, obj),
- mknod_args(argp->what, obj, &new_mode, &dev), exports_rw());
+ result.status = cat_name(path, argp->where.name, obj);
+ if (result.status == NFS3_OK)
+ result.status = mknod_args(argp->what, obj, &new_mode, &dev);
+ if (result.status == NFS3_OK)
+ result.status = exports_rw();
cluster_create(obj, rqstp, &result.status);
+1
View File
@@ -18,6 +18,7 @@ SRC_URI = "git://github.com/unfs3/unfs3.git;protocol=https;branch=master \
file://0001-locate.c-Include-attr.h.patch \
file://0001-fix-building-on-macOS.patch \
file://0001-attr-fix-utime-for-symlink.patch \
file://fixrace.patch \
"
SRCREV = "c8f2d2cd4529955419bad0e163f88d47ff176b8d"
UPSTREAM_CHECK_GITTAGREGEX = "unfs3\-(?P<pver>\d+(\.\d+)+)"