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