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
 		}