|
|
3da088 |
diff -ru a/src/cap-ng.c b/src/cap-ng.c
|
|
|
3da088 |
--- a/src/cap-ng.c
|
|
|
3da088 |
+++ b/src/cap-ng.c
|
|
|
3da088 |
@@ -46,7 +46,7 @@
|
|
|
3da088 |
#endif
|
|
|
3da088 |
|
|
|
3da088 |
# define hidden __attribute__ ((visibility ("hidden")))
|
|
|
3da088 |
-int last_cap hidden = -1;
|
|
|
3da088 |
+unsigned int last_cap hidden = 0;
|
|
|
3da088 |
/*
|
|
|
3da088 |
* Some milestones of when things became available:
|
|
|
3da088 |
* 2.6.24 kernel XATTR_NAME_CAPS
|
|
|
3da088 |
@@ -65,7 +65,7 @@
|
|
|
3da088 |
// Local defines
|
|
|
3da088 |
#define MASK(x) (1U << (x))
|
|
|
3da088 |
#ifdef PR_CAPBSET_DROP
|
|
|
3da088 |
-#define UPPER_MASK ~(unsigned)((~0U)<<(last_cap-31))
|
|
|
3da088 |
+#define UPPER_MASK ~((~0U)<<(last_cap-31))
|
|
|
3da088 |
#else
|
|
|
3da088 |
// For v1 systems UPPER_MASK will never be used
|
|
|
3da088 |
#define UPPER_MASK (unsigned)(~0U)
|
|
|
3da088 |
@@ -73,7 +73,7 @@
|
|
|
3da088 |
|
|
|
3da088 |
// Re-define cap_valid so its uniform between V1 and V3
|
|
|
3da088 |
#undef cap_valid
|
|
|
3da088 |
-#define cap_valid(x) ((x) <= (unsigned int)last_cap)
|
|
|
3da088 |
+#define cap_valid(x) ((x) <= last_cap)
|
|
|
3da088 |
|
|
|
3da088 |
// If we don't have the xattr library, then we can't
|
|
|
3da088 |
// compile-in file system capabilities
|
|
|
3da088 |
@@ -174,6 +174,26 @@
|
|
|
3da088 |
#ifdef HAVE_PTHREAD_H
|
|
|
3da088 |
pthread_atfork(NULL, NULL, deinit);
|
|
|
3da088 |
#endif
|
|
|
3da088 |
+ // Detect last cap
|
|
|
3da088 |
+ if (last_cap == 0) {
|
|
|
3da088 |
+ int fd;
|
|
|
3da088 |
+
|
|
|
3da088 |
+ fd = open("/proc/sys/kernel/cap_last_cap", O_RDONLY);
|
|
|
3da088 |
+ if (fd >= 0) {
|
|
|
3da088 |
+ char buf[8];
|
|
|
3da088 |
+ int num = read(fd, buf, sizeof(buf) - 1);
|
|
|
3da088 |
+ if (num > 0) {
|
|
|
3da088 |
+ buf[num] = 0;
|
|
|
3da088 |
+ errno = 0;
|
|
|
3da088 |
+ unsigned int val = strtoul(buf, NULL, 10);
|
|
|
3da088 |
+ if (errno == 0)
|
|
|
3da088 |
+ last_cap = val;
|
|
|
3da088 |
+ }
|
|
|
3da088 |
+ close(fd);
|
|
|
3da088 |
+ }
|
|
|
3da088 |
+ if (last_cap == 0)
|
|
|
3da088 |
+ last_cap = CAP_LAST_CAP;
|
|
|
3da088 |
+ }
|
|
|
3da088 |
}
|
|
|
3da088 |
|
|
|
3da088 |
static void init(void)
|
|
|
3da088 |
@@ -199,26 +219,6 @@
|
|
|
3da088 |
#else
|
|
|
3da088 |
m.hdr.pid = (unsigned)getpid();
|
|
|
3da088 |
#endif
|
|
|
3da088 |
- // Detect last cap
|
|
|
3da088 |
- if (last_cap == -1) {
|
|
|
3da088 |
- int fd;
|
|
|
3da088 |
-
|
|
|
3da088 |
- fd = open("/proc/sys/kernel/cap_last_cap", O_RDONLY);
|
|
|
3da088 |
- if (fd >= 0) {
|
|
|
3da088 |
- char buf[8];
|
|
|
3da088 |
- int num = read(fd, buf, sizeof(buf) - 1);
|
|
|
3da088 |
- if (num > 0) {
|
|
|
3da088 |
- buf[num] = 0;
|
|
|
3da088 |
- errno = 0;
|
|
|
3da088 |
- int val = strtoul(buf, NULL, 10);
|
|
|
3da088 |
- if (errno == 0)
|
|
|
3da088 |
- last_cap = val;
|
|
|
3da088 |
- }
|
|
|
3da088 |
- close(fd);
|
|
|
3da088 |
- }
|
|
|
3da088 |
- if (last_cap == -1)
|
|
|
3da088 |
- last_cap = CAP_LAST_CAP;
|
|
|
3da088 |
- }
|
|
|
3da088 |
m.state = CAPNG_ALLOCATED;
|
|
|
3da088 |
}
|
|
|
3da088 |
|
|
|
3da088 |
@@ -478,7 +478,7 @@
|
|
|
3da088 |
if (CAPNG_INHERITABLE & type)
|
|
|
3da088 |
v1_update(action, capability, &m.data.v1.inheritable);
|
|
|
3da088 |
} else {
|
|
|
3da088 |
- int idx;
|
|
|
3da088 |
+ unsigned int idx;
|
|
|
3da088 |
|
|
|
3da088 |
if (capability > 31) {
|
|
|
3da088 |
idx = capability>>5;
|
|
|
3da088 |
@@ -545,7 +545,7 @@
|
|
|
3da088 |
memcpy(&state, &m, sizeof(state)); /* save state */
|
|
|
3da088 |
capng_get_caps_process();
|
|
|
3da088 |
if (capng_have_capability(CAPNG_EFFECTIVE, CAP_SETPCAP)) {
|
|
|
3da088 |
- int i;
|
|
|
3da088 |
+ unsigned int i;
|
|
|
3da088 |
memcpy(&m, &state, sizeof(m)); /* restore state */
|
|
|
3da088 |
rc = 0;
|
|
|
3da088 |
for (i=0; i <= last_cap && rc == 0; i++)
|
|
|
3da088 |
@@ -602,7 +602,7 @@
|
|
|
3da088 |
#ifndef VFS_CAP_U32
|
|
|
3da088 |
return -1;
|
|
|
3da088 |
#else
|
|
|
3da088 |
- int rc, size;
|
|
|
3da088 |
+ int rc, size = 0;
|
|
|
3da088 |
struct vfs_cap_data filedata;
|
|
|
3da088 |
struct stat buf;
|
|
|
3da088 |
|
|
|
3da088 |
@@ -1010,7 +1010,7 @@
|
|
|
3da088 |
|
|
|
3da088 |
char *capng_print_caps_text(capng_print_t where, capng_type_t which)
|
|
|
3da088 |
{
|
|
|
3da088 |
- int i, once = 0, cnt = 0;
|
|
|
3da088 |
+ unsigned int i, once = 0, cnt = 0;
|
|
|
3da088 |
char *ptr = NULL;
|
|
|
3da088 |
|
|
|
3da088 |
if (m.state < CAPNG_INIT)
|
|
|
3da088 |
diff -ru a/src/lookup_table.c b/src/lookup_table.c
|
|
|
3da088 |
--- a/src/lookup_table.c
|
|
|
3da088 |
+++ b/src/lookup_table.c
|
|
|
3da088 |
@@ -29,10 +29,10 @@
|
|
|
3da088 |
|
|
|
3da088 |
|
|
|
3da088 |
#define hidden __attribute__ ((visibility ("hidden")))
|
|
|
3da088 |
-extern int last_cap hidden;
|
|
|
3da088 |
+extern unsigned int last_cap hidden;
|
|
|
3da088 |
|
|
|
3da088 |
#undef cap_valid
|
|
|
3da088 |
-#define cap_valid(x) ((x) <= (unsigned int)last_cap)
|
|
|
3da088 |
+#define cap_valid(x) ((x) <= last_cap)
|
|
|
3da088 |
|
|
|
3da088 |
|
|
|
3da088 |
struct transtab {
|
|
|
3da088 |
diff -ru a/src/test/lib_test.c b/src/test/lib_test.c
|
|
|
3da088 |
--- a/src/test/lib_test.c
|
|
|
3da088 |
+++ b/src/test/lib_test.c
|
|
|
3da088 |
@@ -29,7 +29,7 @@
|
|
|
3da088 |
#include <fcntl.h>
|
|
|
3da088 |
#include <sys/stat.h>
|
|
|
3da088 |
|
|
|
3da088 |
-int get_last_cap(void)
|
|
|
3da088 |
+static unsigned int get_last_cap(void)
|
|
|
3da088 |
{
|
|
|
3da088 |
int fd;
|
|
|
3da088 |
|
|
|
3da088 |
@@ -41,17 +41,19 @@
|
|
|
3da088 |
int num = read(fd, buf, sizeof(buf));
|
|
|
3da088 |
if (num > 0) {
|
|
|
3da088 |
errno = 0;
|
|
|
3da088 |
- int val = strtoul(buf, NULL, 10);
|
|
|
3da088 |
+ unsigned int val = strtoul(buf, NULL, 10);
|
|
|
3da088 |
if (errno == 0)
|
|
|
3da088 |
return val;
|
|
|
3da088 |
}
|
|
|
3da088 |
+ close(fd);
|
|
|
3da088 |
}
|
|
|
3da088 |
return CAP_LAST_CAP;
|
|
|
3da088 |
}
|
|
|
3da088 |
|
|
|
3da088 |
int main(void)
|
|
|
3da088 |
{
|
|
|
3da088 |
- int rc, i, len, last = get_last_cap();
|
|
|
3da088 |
+ int rc;
|
|
|
3da088 |
+ unsigned int i, len, last = get_last_cap();
|
|
|
3da088 |
char *text;
|
|
|
3da088 |
void *saved;
|
|
|
3da088 |
|
|
|
3da088 |
@@ -127,7 +129,7 @@
|
|
|
3da088 |
abort();
|
|
|
3da088 |
}
|
|
|
3da088 |
name = capng_capability_to_name(i);
|
|
|
3da088 |
- if (name == NULL) {
|
|
|
3da088 |
+ if (name == NULL) {
|
|
|
3da088 |
printf("Failed converting capability %d to name\n", i);
|
|
|
3da088 |
abort();
|
|
|
3da088 |
}
|