Skip to content

Commit 9126275

Browse files
committed
build: don't just warn if libcap is missing
Problem: if libcap is not found by configure but multi-user is enabled, diod runs without it, leading to test failures noted in chaos#103. Make that a hard error unless configured with --disable-multiuser. Also, use pkg-config to find libcap. Don't build the libnpfs/capability unit test if multi-user is disabled.
1 parent 729830b commit 9126275

File tree

9 files changed

+24
-23
lines changed

9 files changed

+24
-23
lines changed

configure.ac

+3-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ AC_CHECK_FUNCS( \
8080
)
8181
AC_FUNC_STRERROR_R
8282
X_AC_CHECK_PTHREADS
83-
X_AC_CHECK_COND_LIB(cap, cap_get_proc)
8483
X_AC_TCMALLOC
8584
X_AC_RDMA
8685

@@ -120,6 +119,9 @@ AS_IF([test "x$enable_auth" != "xno"], [
120119
])
121120

122121
AS_IF([test "x$enable_multiuser" != "xno"], [
122+
PKG_CHECK_MODULES([CAP], [libcap], [], [
123+
AC_MSG_ERROR([Install libcap or configure with --disable-multiuser])
124+
])
123125
AC_DEFINE([MULTIUSER], [1], [service files to multiple users])
124126
])
125127

src/cmd/Makefile.am

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ AM_CFLAGS = @WARNING_CFLAGS@
33
AM_CPPFLAGS = \
44
-I$(top_srcdir) \
55
$(MUNGE_CFLAGS) \
6+
$(CAP_CFLAGS) \
67
$(LUA_INCLUDE)
78
AM_CPPFLAGS += $(ncurses_CPPFLAGS)
89

@@ -18,7 +19,7 @@ common_ldadd = \
1819
$(top_builddir)/src/libnpfs/libnpfs.a \
1920
$(top_builddir)/src/liblsd/liblsd.a \
2021
$(top_builddir)/src/libdiod/libdiod.a \
21-
$(LIBPTHREAD) $(LUA_LIB) $(MUNGE_LIBS) $(LIBCAP) \
22+
$(LIBPTHREAD) $(LUA_LIB) $(MUNGE_LIBS) $(CAP_LIBS) \
2223
$(LIBIBVERBS) $(LIBRDMACM) $(LIBTCMALLOC) $(ncurses_LIBS)
2324

2425
common_sources = \

src/libdiod/Makefile.am

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ AM_CFLAGS = @WARNING_CFLAGS@
33
AM_CPPFLAGS = \
44
-I$(top_srcdir) \
55
$(MUNGE_CFLAGS) \
6+
$(CAP_CFLAGS) \
67
$(LUA_INCLUDE)
78

89
noinst_LIBRARIES = libdiod.a
@@ -41,7 +42,7 @@ test_ldadd = \
4142
$(builddir)/libdiod.a \
4243
$(top_builddir)/src/libtap/libtap.a \
4344
$(LUA_LIB) \
44-
$(LIBCAP) \
45+
$(CAP_LIBS) \
4546
$(MUNGE_LIBS) \
4647
$(LIBPTHREAD)
4748

src/libnpclient/Makefile.am

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
AM_CFLAGS = @WARNING_CFLAGS@
22

33
AM_CPPFLAGS = \
4+
$(CAP_CFLAGS) \
45
-I$(top_srcdir)
56

67
noinst_LIBRARIES = libnpclient.a
@@ -31,7 +32,7 @@ test_ldadd = \
3132
$(top_builddir)/src/liblsd/liblsd.a \
3233
$(top_builddir)/src/libtap/libtap.a \
3334
$(LUA_LIB) \
34-
$(LIBCAP) \
35+
$(CAP_LIBS) \
3536
$(LIBPTHREAD)
3637

3738
TESTS = \

src/libnpfs/Makefile.am

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
AM_CFLAGS = @WARNING_CFLAGS@
22

33
AM_CPPFLAGS = \
4+
$(CAP_CFLAGS) \
45
-I$(top_srcdir)
56

67
noinst_LIBRARIES = libnpfs.a
@@ -43,16 +44,20 @@ test_ldadd = \
4344
$(top_builddir)/src/liblsd/liblsd.a \
4445
$(top_builddir)/src/libtest/libtest.a \
4546
$(top_builddir)/src/libtap/libtap.a \
46-
$(LIBCAP) \
47+
$(CAP_LIBS) \
4748
$(LIBPTHREAD)
4849

4950
TESTS = \
5051
test_encoding.t \
5152
test_fidpool.t \
52-
test_capability.t \
5353
test_setfsuid.t \
5454
test_setreuid.t
5555

56+
if MULTIUSER
57+
TESTS += \
58+
test_capability.t
59+
endif
60+
5661
check_PROGRAMS = $(TESTS)
5762
TEST_EXTENSIONS = .t
5863
T_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
@@ -64,8 +69,10 @@ test_encoding_t_LDADD = $(test_ldadd)
6469
test_fidpool_t_SOURCES = test/fidpool.c
6570
test_fidpool_t_LDADD = $(test_ldadd)
6671

72+
if MULTIUSER
6773
test_capability_t_SOURCES = test/capability.c
6874
test_capability_t_LDADD = $(test_ldadd)
75+
endif
6976

7077
test_setfsuid_t_SOURCES = test/setfsuid.c
7178
test_setfsuid_t_LDADD = $(test_ldadd)

src/libnpfs/test/capability.c

+2-9
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,14 @@
1212
#if HAVE_CONFIG_H
1313
#include "config.h"
1414
#endif
15-
#if HAVE_LIBCAP
1615
#include <sys/capability.h>
17-
#endif
1816
#include <sys/fsuid.h>
1917
#include <string.h>
2018

2119
#include "src/libtest/thread.h"
2220
#include "src/libtest/state.h"
2321
#include "src/libtap/tap.h"
2422

25-
#if HAVE_LIBCAP
2623
typedef enum { S0, S1, S2, S3, S4, S5 } state_t;
2724

2825
static void check_capability (const char *who,
@@ -156,19 +153,15 @@ static void proc0 (void)
156153
check_capability ("task0", "CHOWN", CAP_CHOWN, CAP_CLEAR);
157154
}
158155

159-
#endif
160-
161156
int main(int argc, char *argv[])
162157
{
163-
#if HAVE_LIBCAP
164158
if (geteuid () != 0 || getenv ("FAKEROOTKEY") != NULL)
165159
plan (SKIP_ALL, "this test must run as root");
166160
plan (NO_PLAN);
161+
167162
test_state_init (S0);
168163
proc0 (); // spawns proc1 and proc2
169-
#else
170-
plan (SKIP_ALL, "libcap2-dev is not installed");
171-
#endif
164+
172165
done_testing ();
173166

174167
exit (0);

src/libnpfs/user-linux.c

-6
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,13 @@
2323
#include <sys/fsuid.h>
2424
#include <pwd.h>
2525
#include <grp.h>
26-
#if HAVE_LIBCAP
2726
#include <sys/capability.h>
28-
#endif
2927
#include <sys/prctl.h>
3028

3129
#include "npfs.h"
3230
#include "xpthread.h"
3331
#include "npfsimpl.h"
3432

35-
#if HAVE_LIBCAP
3633
/* When handling requests on connections authenticated as root, we consider
3734
* it safe to disable DAC checks on the server and presume the client is
3835
* doing it. This is only done if the server sets SRV_FLAGS_DAC_BYPASS.
@@ -79,7 +76,6 @@ _chg_privcap (Npsrv *srv, cap_flag_value_t val)
7976
}
8077
return ret;
8178
}
82-
#endif
8379

8480
/* Note: it is possible for setfsuid/setfsgid to fail silently,
8581
* e.g. if user doesn't have CAP_SETUID/CAP_SETGID.
@@ -190,7 +186,6 @@ np_setfsid (Npreq *req, Npuser *u, u32 gid_override)
190186
wt->fsuid = u->uid;
191187
}
192188
}
193-
#if HAVE_LIBCAP
194189
if ((srv->flags & SRV_FLAGS_DAC_BYPASS) && wt->fsuid != 0) {
195190
if (!wt->privcap && authuid == 0) {
196191
if (_chg_privcap (srv, CAP_SET) < 0)
@@ -204,7 +199,6 @@ np_setfsid (Npreq *req, Npuser *u, u32 gid_override)
204199
dumpclrd = 1;
205200
}
206201
}
207-
#endif
208202
ret = 0;
209203
done:
210204
if (dumpclrd && prctl (PR_SET_DUMPABLE, 1, 0, 0, 0) < 0)

tests/kern/Makefile.am

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ AM_CFLAGS = @WARNING_CFLAGS@
3636
AM_CPPFLAGS = \
3737
-I$(top_srcdir) \
3838
$(MUNGE_CFLAGS) \
39+
$(CAP_CFLAGS) \
3940
$(LUA_INCLUDE)
4041

4142

4243
LDADD = $(top_builddir)/src/libdiod/libdiod.a \
4344
$(top_builddir)/src/libnpfs/libnpfs.a \
4445
$(top_builddir)/src/liblsd/liblsd.a \
45-
$(LIBPTHREAD) $(LUA_LIB) $(MUNGE_LIBS) $(LIBCAP) $(LIBTCMALLOC)
46+
$(LIBPTHREAD) $(LUA_LIB) $(MUNGE_LIBS) $(CAP_LIBS) $(LIBTCMALLOC)
4647

4748
common_sources = test.h
4849

tests/user/Makefile.am

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,15 @@ AM_CFLAGS = @WARNING_CFLAGS@
3838
AM_CPPFLAGS = \
3939
-I$(top_srcdir) \
4040
$(MUNGE_CFLAGS) \
41+
$(CAP_CFLAGS) \
4142
$(LUA_INCLUDE)
4243

4344

4445
LDADD = $(top_builddir)/src/libdiod/libdiod.a \
4546
$(top_builddir)/src/libnpclient/libnpclient.a \
4647
$(top_builddir)/src/libnpfs/libnpfs.a \
4748
$(top_builddir)/src/liblsd/liblsd.a \
48-
$(LIBPTHREAD) $(LUA_LIB) $(MUNGE_LIBS) $(LIBCAP) $(LIBTCMALLOC)
49+
$(LIBPTHREAD) $(LUA_LIB) $(MUNGE_LIBS) $(CAP_LIBS) $(LIBTCMALLOC)
4950

5051
common_sources =
5152

0 commit comments

Comments
 (0)