[SCM] UID Wrapper Repository - branch master updated

Andreas Schneider asn at samba.org
Fri Dec 20 05:04:10 MST 2013


The branch, master has been updated
       via  a9bb877 uwrap: Pass bool values to uwrap_new_id().
       via  8ac9882 uwrap: Fix a memory leak when we reuse an allocated id.
       via  8bcb0ab uwrap: Add a destructor to free resources.
       via  0d0adbf cmake: Add check for HAVE_DESTRUCTOR_ATTRIBUTE.
       via  b20dbe2 uwrap: Use realloc for setgroups().
       via  f7bedda uwrap: Fix loading the system libraries.
      from  623bed5 tests: Add test_uwrap_disabled.

http://gitweb.samba.org/?p=uid_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a9bb87790557a74328b77f423c6b62b3814cd157
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 20 13:03:04 2013 +0100

    uwrap: Pass bool values to uwrap_new_id().

commit 8ac9882e33c8df7c6c985673495d208265e409dd
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 20 13:02:37 2013 +0100

    uwrap: Fix a memory leak when we reuse an allocated id.

commit 8bcb0ab1c9db8d03f1bdc998b6765eb2d76a4357
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 20 13:02:03 2013 +0100

    uwrap: Add a destructor to free resources.

commit 0d0adbf10a5f6359a5f63f611bf5e4b71a801e13
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 20 13:01:27 2013 +0100

    cmake: Add check for HAVE_DESTRUCTOR_ATTRIBUTE.

commit b20dbe2122988a2aaace30ba010de87af8b5a755
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 20 12:54:14 2013 +0100

    uwrap: Use realloc for setgroups().

commit f7bedda4695cb84aacf5140e5784758e4db65ef3
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Dec 20 11:09:15 2013 +0100

    uwrap: Fix loading the system libraries.
    
    Thanks metze!

-----------------------------------------------------------------------

Summary of changes:
 ConfigureChecks.cmake |   11 ++++++
 config.h.cmake        |    1 +
 src/uid_wrapper.c     |   94 ++++++++++++++++++++++++++++++++++++------------
 3 files changed, 82 insertions(+), 24 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 77a701f..123128f 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -131,6 +131,17 @@ int main(void) {
     return 0;
 }" HAVE_GCC_THREAD_LOCAL_STORAGE)
 
+check_c_source_compiles("
+void test_destructor_attribute(void) __attribute__ ((destructor));
+
+void test_destructor_attribute(void)
+{
+    return;
+}
+
+int main(void) {
+    return 0;
+}" HAVE_DESTRUCTOR_ATTRIBUTE)
 
 # SYSTEM LIBRARIES
 
diff --git a/config.h.cmake b/config.h.cmake
index 679390c..0e67b23 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -57,6 +57,7 @@
 #cmakedefine HAVE_LINUX_32BIT_SYSCALLS 1
 
 #cmakedefine HAVE_GCC_THREAD_LOCAL_STORAGE 1
+#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
 
 /*************************** ENDIAN *****************************/
 
diff --git a/src/uid_wrapper.c b/src/uid_wrapper.c
index ff2639f..077bef7 100644
--- a/src/uid_wrapper.c
+++ b/src/uid_wrapper.c
@@ -43,6 +43,12 @@
 # define UWRAP_THREAD
 #endif
 
+#ifdef HAVE_DESTRUCTOR_ATTRIBUTE
+#define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
+#else
+#define DESTRUCTOR_ATTRIBUTE
+#endif /* HAVE_DESTRUCTOR_ATTRIBUTE */
+
 #ifdef NDEBUG
 #define UWRAP_DEBUG(...)
 #else
@@ -80,6 +86,10 @@
 	(item)->next	= NULL; \
 } while (0)
 
+#ifndef SAFE_FREE
+#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); (x)=NULL;} } while(0)
+#endif
+
 #define LIBC_NAME "libc.so"
 
 struct uwrap_libc_fns {
@@ -162,6 +172,12 @@ static UWRAP_THREAD struct uwrap_thread *uwrap_tls_id;
 static pthread_mutex_t uwrap_id_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 /*********************************************************
+ * UWRAP PROTOTYPES
+ *********************************************************/
+
+void uwrap_destructor(void) DESTRUCTOR_ATTRIBUTE;
+
+/*********************************************************
  * UWRAP LIBC LOADER FUNCTIONS
  *********************************************************/
 
@@ -191,6 +207,7 @@ static void *uwrap_load_lib_handle(enum uwrap_lib lib)
 	case UWRAP_LIBSOCKET:
 		/* FALL TROUGH */
 	case UWRAP_LIBC:
+		handle = uwrap.libc.handle;
 		if (handle == NULL) {
 			for (handle = NULL, i = 10; handle == NULL && i >= 0; i--) {
 				char soname[256] = {0};
@@ -200,8 +217,6 @@ static void *uwrap_load_lib_handle(enum uwrap_lib lib)
 			}
 
 			uwrap.libc.handle = handle;
-		} else {
-			handle = uwrap.libc.handle;
 		}
 		break;
 	}
@@ -412,6 +427,15 @@ static int uwrap_new_id(pthread_t tid, bool do_alloc)
 			errno = ENOMEM;
 			return -1;
 		}
+
+		id->groups = malloc(sizeof(gid_t) * 1);
+		if (id->groups == NULL) {
+			errno = ENOMEM;
+			return -1;
+		}
+
+		UWRAP_DLIST_ADD(uwrap.ids, id);
+		uwrap_tls_id = id;
 	}
 
 	id->tid = tid;
@@ -421,14 +445,8 @@ static int uwrap_new_id(pthread_t tid, bool do_alloc)
 	id->rgid = id->egid = id->sgid = uwrap.mygid;
 
 	id->ngroups = 1;
-	id->groups = malloc(sizeof(gid_t) * id->ngroups);
 	id->groups[0] = uwrap.mygid;
 
-	if (do_alloc) {
-		UWRAP_DLIST_ADD(uwrap.ids, id);
-		uwrap_tls_id = id;
-	}
-
 	return 0;
 }
 
@@ -476,7 +494,7 @@ static void uwrap_init(void)
 		pthread_mutex_lock(&uwrap_id_mutex);
 		id = find_uwrap_id(tid);
 		if (id == NULL) {
-			rc = uwrap_new_id(tid, 1);
+			rc = uwrap_new_id(tid, true);
 			if (rc < 0) {
 				exit(-1);
 			}
@@ -484,7 +502,7 @@ static void uwrap_init(void)
 			/* We reuse an old thread id */
 			uwrap_tls_id = id;
 
-			uwrap_new_id(tid, 0);
+			uwrap_new_id(tid, false);
 		}
 		pthread_mutex_unlock(&uwrap_id_mutex);
 
@@ -518,7 +536,7 @@ static void uwrap_init(void)
 			uwrap.mygid = libc_getegid();
 		}
 
-		rc = uwrap_new_id(tid, 1);
+		rc = uwrap_new_id(tid, true);
 		if (rc < 0) {
 			exit(-1);
 		}
@@ -860,16 +878,17 @@ static int uwrap_setgroups_thread(size_t size, const gid_t *list)
 	int rc = -1;
 
 	pthread_mutex_lock(&uwrap_id_mutex);
-	free(id->groups);
-	id->groups = NULL;
-	id->ngroups = 0;
 
-	if (size != 0) {
-		id->groups = malloc(sizeof(gid_t) * size);
-		if (id->groups == NULL) {
+	if (size > 0) {
+		gid_t *tmp;
+
+		tmp = realloc(id->groups, sizeof(gid_t) * size);
+		if (tmp == NULL) {
 			errno = ENOMEM;
 			goto out;
 		}
+		id->groups = tmp;
+
 		id->ngroups = size;
 		memcpy(id->groups, list, size * sizeof(gid_t));
 	}
@@ -887,17 +906,18 @@ static int uwrap_setgroups(size_t size, const gid_t *list)
 	int rc = -1;
 
 	pthread_mutex_lock(&uwrap_id_mutex);
-	for (id = uwrap.ids; id; id = id->next) {
-		free(id->groups);
-		id->groups = NULL;
-		id->ngroups = 0;
 
-		if (size != 0) {
-			id->groups = malloc(sizeof(gid_t) * size);
-			if (id->groups == NULL) {
+	if (size > 0) {
+		for (id = uwrap.ids; id; id = id->next) {
+			gid_t *tmp;
+
+			tmp = realloc(id->groups, sizeof(gid_t) * size);
+			if (tmp == NULL) {
 				errno = ENOMEM;
 				goto out;
 			}
+			id->groups = tmp;
+
 			id->ngroups = size;
 			memcpy(id->groups, list, size * sizeof(gid_t));
 		}
@@ -1127,3 +1147,29 @@ long int syscall (long int sysno, ...)
 }
 #endif /* HAVE_SYSCALL */
 #endif /* HAVE_SYS_SYSCALL_H || HAVE_SYSCALL_H */
+
+/****************************
+ * DESTRUCTOR
+ ***************************/
+
+/*
+ * This function is called when the library is unloaded and makes sure that
+ * resources are freed.
+ */
+void uwrap_destructor(void)
+{
+	struct uwrap_thread *u = uwrap.ids;
+
+	while (u != NULL) {
+		UWRAP_DLIST_REMOVE(uwrap.ids, u);
+
+		SAFE_FREE(u->groups);
+		SAFE_FREE(u);
+
+		u = uwrap.ids;
+	}
+
+	if (uwrap.libc.handle != NULL) {
+		dlclose(uwrap.libc.handle);
+	}
+}


-- 
UID Wrapper Repository


More information about the samba-cvs mailing list