NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

lib/48879: libquota in threaded programs



>Number:         48879
>Category:       lib
>Synopsis:       libquota in threaded programs has problems
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    lib-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Jun 06 12:25:00 +0000 2014
>Originator:     Martin Husemann
>Release:        NetBSD 6.99.41
>Organization:
The NetBSD Foundation, Inc.
>Environment:
System: NetBSD seven-days-to-the-wolves.aprisoft.de 6.99.41 NetBSD 6.99.41 
(GENERIC) #75: Wed May 14 13:08:11 CEST 2014 
martin%seven-days-to-the-wolves.aprisoft.de@localhost:/usr/src/sys/arch/amd64/compile/GENERIC
 amd64
Architecture: x86_64
Machine: amd64
>Description:

When doing automatic test runs on diskless machines (with an NFS server w/o
quotas configured), lots of tests fail like this:

Test case: fs/ffs/t_getquota/get_be_1_both

Duration: 6.538409 seconds
Termination reason

FAILED: atf-check failed; see the output of the test for details
Standard output stream

Executing command [ newfs -q user -q group -B be -O 1 -s 4000 -F fsimage ]
Executing command [ /usr/tests/fs/ffs/h_ffs_server -b fsimage unix://test ]
Executing command [ env LD_PRELOAD=/usr/lib/librumphijack.so 
RUMPHIJACK=vfs=getvfsstat,blanket=/mnt quota -u -v ]

Standard error stream

Fail: stderr not empty
--- /dev/null   2014-05-06 14:43:04.000000000 +0000
+++ /tmp/check.08212a/stderr    2014-05-06 14:44:33.000000000 +0000
@@ -0,0 +1,2 @@
+quota: /: quota_get (objtype 0): Result too large or too small
+quota: /: quota_get (objtype 1): Result too large or too small


The exact path of failure is a bit tricky, but the net effect is simple:
libquota uses rpc calls, libc is compiled with _REENTRANT defined, while
libquota is compiled without it being defined.

Now when the quota query rpc fails, clnt_com_create() sets 
rpc_createerr.cf_stat to RPC_PROGNOTREGISTERED. It uses the _REENTRANT version
of rpc_createerr for that.

The caller sees clntudp_create() returning a NULL pointer and checks the
non-_REENTRANT version of rpc_createerr, and is confused by the failure
without error code. Later a switch for the rpc error code runs into the
"default" case and forces errno to ERANGE.


>How-To-Repeat:
Use a diskless client with non-quota aware NFS server and do:

cd /usr/tests/fs/ffs/t_getquota && atf-run t_getquota

>Fix:

Not sure if this is the correct fix, but it avoids the problem.

Index: Makefile
===================================================================
RCS file: /cvsroot/src/lib/libquota/Makefile,v
retrieving revision 1.10
diff -u -r1.10 Makefile
--- Makefile    21 Mar 2012 05:37:43 -0000      1.10
+++ Makefile    6 Jun 2014 12:09:25 -0000
@@ -8,6 +8,8 @@
 
 LIBDPLIBS+=     rpcsvc  ${.CURDIR}/../librpcsvc
 
+CPPFLAGS+= -D_REENTRANT
+
 SRCS+= quota_open.c
 SRCS+= quota_schema.c
 SRCS+= quota_get.c quota_put.c quota_delete.c



Home | Main Index | Thread Index | Old Index