[SCM] UID Wrapper Repository - branch master updated
Andreas Schneider
asn at samba.org
Mon Oct 6 08:16:12 MDT 2014
The branch, master has been updated
via fdbdb8a uwrap: Reflect changes of uid/gid in threads to main process.
via cd254f6 tests: Extend test_sync_setgid in test_glibc_thread_support.c
via afc62c9 uwrap: Small optimalization of uwrap_init().
via 9b042d7 tests: test_glibc_thread_support: Add bigger load.
via 9a4fc57 tests: Added two new tests aimed to setgid() and getgid() functions.
via 6440f8e tests: Small phtread_attr cleanup.
via a8d0bc7 tests: Get rid of malloc calls in test_glibc_thread_support.c.
via e88afed uwrap: Optimalization of uid_wrapper_enabled() function.
via 0c80f0c uid_wrapper: Fix race condition - uwrap_init.
via 401d92a uwrap: Fix race condition - glibc lookups.
via 724409c uwrap: Add library constructor and move pthread_atfork inside.
via 973a784 uwrap: Use UWRAP_LOCK/UNLOCK macros instead of pthread_mutex_lock/unlock calls.
from ba53521 uwrap: Fix the handle loop for older gcc versions.
http://gitweb.samba.org/?p=uid_wrapper.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit fdbdb8ad1a6e745b5b4e7bf7f714ff11700a1227
Author: Robin Hack <hack.robin at gmail.com>
Date: Mon Sep 29 09:53:21 2014 +0200
uwrap: Reflect changes of uid/gid in threads to main process.
When thread changes uid/gid this change must be reflected to main
process.
Syscalls changes only uid/gid of thread. Call of libc functions changes
also uid/gid of main process.
TESTS: Fix test_sync_setgid_syscall in test_glibc_thread_support.c
When changes of gid (and uid of course) is reflected to main process
test must check if call of setgid syscall changes gid of thread ONLY.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit cd254f6c787cc008b4e926c5c8e84fa531543e4a
Author: Robin Hack <hack.robin at gmail.com>
Date: Sun Sep 28 21:19:13 2014 +0200
tests: Extend test_sync_setgid in test_glibc_thread_support.c
Extend test to case when thread changes gid of main process.
After this change main process start new thread which should have
same gid set as a main process.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit afc62c9c321c4d2be8246f90fd21a80096def09e
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 16:25:58 2014 +0200
uwrap: Small optimalization of uwrap_init().
Don't call getenv("UID_WRAPPER") on start of uwrap_init().
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 9b042d73d8f80dea94090c2793281618895aa4e3
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 16:19:09 2014 +0200
tests: test_glibc_thread_support: Add bigger load.
This can help (and helped) with revealing race conditions.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 9a4fc5759d5f5af59024dbe48d262277b7e91ce9
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 16:17:18 2014 +0200
tests: Added two new tests aimed to setgid() and getgid() functions.
New tests:
* test_sync_setgid - test if call of setgid() in thread changes gid
of main process
* test_sync_setgid_syscall - test setgid() syscall
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 6440f8e7f368c06b56622c9b9b443041d932db88
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 15:25:09 2014 +0200
tests: Small phtread_attr cleanup.
This change should make valgrind happy.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit a8d0bc7279a44141477f508dcde177bee57957a7
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 14:31:39 2014 +0200
tests: Get rid of malloc calls in test_glibc_thread_support.c.
Thread structures are allocated on stack now.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit e88afed067f2a04d2afd3a24458315143319871c
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 14:00:27 2014 +0200
uwrap: Optimalization of uid_wrapper_enabled() function.
Check only bool variable inside uwrap structure instead
of calling whole uid_init().
In the best case only one mutex lock is need when check.
NOTES:
* This patch uses __atomic_load gcc builtin function.
* uid_init() were moved outside uid_wrapper_enabled() function.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 0c80f0ce34ce9eda7495b4620187ebfdb95b46b3
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 13:26:17 2014 +0200
uid_wrapper: Fix race condition - uwrap_init.
Patch moves uwrap_id_mutex before if (uwrap.initialised) statement
which can be passed by concurrent threads.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 401d92a4e3af5d754b01c91b88903c32b38b5be7
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 13:05:43 2014 +0200
uwrap: Fix race condition - glibc lookups.
Patch adds libc_symbol_binding_mutex which guards global table of libc
functions and their lookup.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 724409c5911a2b166d7faa479ec328e9c6e09220
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 12:33:21 2014 +0200
uwrap: Add library constructor and move pthread_atfork inside.
Library constructor is used for pthread_atfork call. Moved here because
pthread_atfork is cumulative and should be called only once.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 973a784ab16afc9e42a9ae50e4ba4639b2310c6a
Author: Robin Hack <hack.robin at gmail.com>
Date: Fri Sep 26 12:08:58 2014 +0200
uwrap: Use UWRAP_LOCK/UNLOCK macros instead of pthread_mutex_lock/unlock calls.
New macros UWRAP_LOCK/UNLOCK has been created and all calls to
pthread_mutex_lock/unlock has been replaced by these macros.
Signed-off-by: Robin Hack <hack.robin at gmail.com>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
-----------------------------------------------------------------------
Summary of changes:
ConfigureChecks.cmake | 21 ++++
config.h.cmake | 2 +
src/uid_wrapper.c | 211 +++++++++++++++++++++++++++----------
tests/test_glibc_thread_support.c | 141 ++++++++++++++++++++++---
4 files changed, 304 insertions(+), 71 deletions(-)
Changeset truncated at 500 lines:
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 899d905..26c2238 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -125,6 +125,15 @@ int main(void) {
endif (LINUX)
check_c_source_compiles("
+#include <stdbool.h>
+int main(void) {
+ bool x;
+ bool *p_x = &x;
+ __atomic_load(p_x, &x, __ATOMIC_RELAXED);
+ return 0;
+}" HAVE_GCC_ATOMIC_BUILTINS)
+
+check_c_source_compiles("
__thread int tls;
int main(void) {
@@ -132,6 +141,18 @@ int main(void) {
}" HAVE_GCC_THREAD_LOCAL_STORAGE)
check_c_source_compiles("
+void test_constructor_attribute(void) __attribute__ ((constructor));
+
+void test_constructor_attribute(void)
+{
+ return;
+}
+
+int main(void) {
+ return 0;
+}" HAVE_CONSTRUCTOR_ATTRIBUTE)
+
+check_c_source_compiles("
void test_destructor_attribute(void) __attribute__ ((destructor));
void test_destructor_attribute(void)
diff --git a/config.h.cmake b/config.h.cmake
index 840b5d4..b2a03b2 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -57,6 +57,8 @@
#cmakedefine HAVE_LINUX_32BIT_SYSCALLS 1
#cmakedefine HAVE_GCC_THREAD_LOCAL_STORAGE 1
+#cmakedefine HAVE_GCC_ATOMIC_BUILTINS 1
+#cmakedefine HAVE_CONSTRUCTOR_ATTRIBUTE 1
#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
#cmakedefine HAVE_FUNCTION_ATTRIBUTE_FORMAT 1
diff --git a/src/uid_wrapper.c b/src/uid_wrapper.c
index c1dc56b..8e3a7d3 100644
--- a/src/uid_wrapper.c
+++ b/src/uid_wrapper.c
@@ -43,6 +43,20 @@
# define UWRAP_THREAD
#endif
+# define UWRAP_LOCK(m) do { \
+ pthread_mutex_lock(&( m ## _mutex)); \
+} while(0)
+
+# define UWRAP_UNLOCK(m) do { \
+ pthread_mutex_unlock(&( m ## _mutex)); \
+} while(0)
+
+#ifdef HAVE_CONSTRUCTOR_ATTRIBUTE
+#define CONSTRUCTOR_ATTRIBUTE __attribute__ ((constructor))
+#else
+#define CONSTRUCTOR_ATTRIBUTE
+#endif /* HAVE_CONSTRUCTOR_ATTRIBUTE */
+
#ifdef HAVE_DESTRUCTOR_ATTRIBUTE
#define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
#else
@@ -222,8 +236,17 @@ struct uwrap {
bool initialised;
bool enabled;
+ uid_t ruid;
+ uid_t euid;
+ uid_t suid;
+
+ gid_t rgid;
+ gid_t egid;
+ gid_t sgid;
+
+ /* Real uid and gid of user who run uid wrapper */
uid_t myuid;
- uid_t mygid;
+ gid_t mygid;
struct uwrap_thread *ids;
};
@@ -236,11 +259,15 @@ static UWRAP_THREAD struct uwrap_thread *uwrap_tls_id;
/* The mutex or accessing the id */
static pthread_mutex_t uwrap_id_mutex = PTHREAD_MUTEX_INITIALIZER;
+/* The mutex for accessing the global libc.fns */
+static pthread_mutex_t libc_symbol_binding_mutex = PTHREAD_MUTEX_INITIALIZER;
+
/*********************************************************
* UWRAP PROTOTYPES
*********************************************************/
bool uid_wrapper_enabled(void);
+void uwrap_constructor(void) CONSTRUCTOR_ATTRIBUTE;
void uwrap_destructor(void) DESTRUCTOR_ATTRIBUTE;
/*********************************************************
@@ -319,10 +346,12 @@ static void *_uwrap_load_lib_function(enum uwrap_lib lib, const char *fn_name)
}
#define uwrap_load_lib_function(lib, fn_name) \
+ UWRAP_LOCK(libc_symbol_binding); \
if (uwrap.libc.fns._libc_##fn_name == NULL) { \
*(void **) (&uwrap.libc.fns._libc_##fn_name) = \
_uwrap_load_lib_function(lib, #fn_name); \
- }
+ } \
+ UWRAP_UNLOCK(libc_symbol_binding)
/*
* IMPORTANT
@@ -513,8 +542,13 @@ static int uwrap_new_id(pthread_t tid, bool do_alloc)
id->tid = tid;
id->dead = false;
- id->ruid = id->euid = id->suid = uwrap.myuid;
- id->rgid = id->egid = id->sgid = uwrap.mygid;
+ id->ruid = uwrap.ruid;
+ id->euid = uwrap.euid;
+ id->suid = uwrap.suid;
+
+ id->rgid = uwrap.rgid;
+ id->egid = uwrap.egid;
+ id->sgid = uwrap.sgid;
id->ngroups = 1;
id->groups[0] = uwrap.mygid;
@@ -524,8 +558,8 @@ static int uwrap_new_id(pthread_t tid, bool do_alloc)
static void uwrap_thread_prepare(void)
{
- pthread_mutex_lock(&uwrap_id_mutex);
-
+ UWRAP_LOCK(uwrap_id);
+ UWRAP_LOCK(libc_symbol_binding);
/*
* What happens if another atfork prepare functions calls a uwrap
* function? So disable it in case another atfork prepare function
@@ -538,32 +572,33 @@ static void uwrap_thread_parent(void)
{
uwrap.enabled = true;
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(libc_symbol_binding);
+ UWRAP_UNLOCK(uwrap_id);
}
static void uwrap_thread_child(void)
{
uwrap.enabled = true;
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(libc_symbol_binding);
+ UWRAP_UNLOCK(uwrap_id);
}
static void uwrap_init(void)
{
- const char *env = getenv("UID_WRAPPER");
+ const char *env;
pthread_t tid = pthread_self();
-
-
+ UWRAP_LOCK(uwrap_id);
if (uwrap.initialised) {
struct uwrap_thread *id = uwrap_tls_id;
int rc;
if (id != NULL) {
+ UWRAP_UNLOCK(uwrap_id);
return;
}
- pthread_mutex_lock(&uwrap_id_mutex);
id = find_uwrap_id(tid);
if (id == NULL) {
rc = uwrap_new_id(tid, true);
@@ -576,38 +611,30 @@ static void uwrap_init(void)
uwrap_new_id(tid, false);
}
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
return;
}
UWRAP_LOG(UWRAP_LOG_DEBUG, "Initialize uid_wrapper");
- /*
- * If we hold a lock and the application forks, then the child
- * is not able to unlock the mutex and we are in a deadlock.
- * This should prevent such deadlocks.
- */
- pthread_atfork(&uwrap_thread_prepare,
- &uwrap_thread_parent,
- &uwrap_thread_child);
-
- pthread_mutex_lock(&uwrap_id_mutex);
-
uwrap.initialised = true;
uwrap.enabled = false;
+ env = getenv("UID_WRAPPER");
if (env != NULL && env[0] == '1') {
const char *root = getenv("UID_WRAPPER_ROOT");
int rc;
+ uwrap.myuid = libc_geteuid();
+ uwrap.mygid = libc_getegid();
/* put us in one group */
if (root != NULL && root[0] == '1') {
- uwrap.myuid = 0;
- uwrap.mygid = 0;
+ uwrap.ruid = uwrap.euid = uwrap.suid = 0;
+ uwrap.rgid = uwrap.egid = uwrap.sgid = 0;
} else {
- uwrap.myuid = libc_geteuid();
- uwrap.mygid = libc_getegid();
+ uwrap.ruid = uwrap.euid = uwrap.suid = libc_geteuid();
+ uwrap.rgid = uwrap.egid = uwrap.sgid = libc_getegid();
}
rc = uwrap_new_id(tid, true);
@@ -622,16 +649,22 @@ static void uwrap_init(void)
uwrap.myuid == 0 ? "root" : "user");
}
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
UWRAP_LOG(UWRAP_LOG_DEBUG, "Succeccfully initialized uid_wrapper");
}
bool uid_wrapper_enabled(void)
{
- uwrap_init();
-
- return uwrap.enabled ? true : false;
+ bool enabled = false;
+ #ifdef HAVE_GCC_ATOMIC_BUILTINS
+ __atomic_load(&uwrap.enabled, &enabled, __ATOMIC_RELAXED);
+ #else
+ UWRAP_LOCK(uwrap_id);
+ enabled = uwrap.enabled;
+ UWRAP_UNLOCK(uwrap_id);
+ #endif
+ return enabled;
}
static int uwrap_setresuid_thread(uid_t ruid, uid_t euid, uid_t suid)
@@ -643,7 +676,7 @@ static int uwrap_setresuid_thread(uid_t ruid, uid_t euid, uid_t suid)
return -1;
}
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
if (ruid != (uid_t)-1) {
id->ruid = ruid;
}
@@ -655,7 +688,7 @@ static int uwrap_setresuid_thread(uid_t ruid, uid_t euid, uid_t suid)
if (suid != (uid_t)-1) {
id->suid = suid;
}
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
return 0;
}
@@ -669,7 +702,7 @@ static int uwrap_setresuid(uid_t ruid, uid_t euid, uid_t suid)
return -1;
}
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
for (id = uwrap.ids; id; id = id->next) {
if (id->dead) {
continue;
@@ -687,7 +720,21 @@ static int uwrap_setresuid(uid_t ruid, uid_t euid, uid_t suid)
id->suid = suid;
}
}
- pthread_mutex_unlock(&uwrap_id_mutex);
+
+ /* Reflect changes in thread to main process. */
+ if (ruid != (uid_t)-1) {
+ uwrap.ruid = ruid;
+ }
+
+ if (euid != (uid_t)-1) {
+ uwrap.euid = euid;
+ }
+
+ if (suid != (uid_t)-1) {
+ uwrap.suid = suid;
+ }
+
+ UWRAP_UNLOCK(uwrap_id);
return 0;
}
@@ -701,6 +748,7 @@ int setuid(uid_t uid)
return libc_setuid(uid);
}
+ uwrap_init();
return uwrap_setresuid(uid, -1, -1);
}
@@ -716,6 +764,7 @@ int seteuid(uid_t euid)
return libc_seteuid(euid);
}
+ uwrap_init();
return uwrap_setresuid(-1, euid, -1);
}
#endif
@@ -732,6 +781,7 @@ int setreuid(uid_t ruid, uid_t euid)
return libc_setreuid(ruid, euid);
}
+ uwrap_init();
return uwrap_setresuid(ruid, euid, -1);
}
#endif
@@ -743,6 +793,7 @@ int setresuid(uid_t ruid, uid_t euid, uid_t suid)
return libc_setresuid(ruid, euid, suid);
}
+ uwrap_init();
return uwrap_setresuid(ruid, euid, suid);
}
#endif
@@ -755,9 +806,9 @@ static uid_t uwrap_getuid(void)
struct uwrap_thread *id = uwrap_tls_id;
uid_t uid;
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
uid = id->ruid;
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
return uid;
}
@@ -768,6 +819,7 @@ uid_t getuid(void)
return libc_getuid();
}
+ uwrap_init();
return uwrap_getuid();
}
@@ -780,9 +832,9 @@ static uid_t uwrap_geteuid(void)
struct uwrap_thread *id = uwrap_tls_id;
uid_t uid;
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
uid = id->euid;
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
/* Disable root and return myuid */
if (env != NULL && env[0] == '1') {
@@ -798,6 +850,7 @@ uid_t geteuid(void)
return libc_geteuid();
}
+ uwrap_init();
return uwrap_geteuid();
}
@@ -810,7 +863,7 @@ static int uwrap_setresgid_thread(gid_t rgid, gid_t egid, gid_t sgid)
return -1;
}
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
if (rgid != (gid_t)-1) {
id->rgid = rgid;
}
@@ -822,7 +875,7 @@ static int uwrap_setresgid_thread(gid_t rgid, gid_t egid, gid_t sgid)
if (sgid != (gid_t)-1) {
id->sgid = sgid;
}
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
return 0;
}
@@ -836,7 +889,7 @@ static int uwrap_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
return -1;
}
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
for (id = uwrap.ids; id; id = id->next) {
if (id->dead) {
continue;
@@ -854,7 +907,20 @@ static int uwrap_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
id->sgid = sgid;
}
}
- pthread_mutex_unlock(&uwrap_id_mutex);
+
+ /* Reflect changes in thread to main process. */
+ if (rgid != (gid_t)-1) {
+ uwrap.rgid = rgid;
+ }
+
+ if (egid != (gid_t)-1) {
+ uwrap.egid = egid;
+ }
+
+ if (sgid != (gid_t)-1) {
+ uwrap.sgid = sgid;
+ }
+ UWRAP_UNLOCK(uwrap_id);
return 0;
}
@@ -868,6 +934,7 @@ int setgid(gid_t gid)
return libc_setgid(gid);
}
+ uwrap_init();
return uwrap_setresgid(gid, -1, -1);
}
@@ -878,6 +945,7 @@ int setegid(gid_t egid)
return libc_setegid(egid);
}
+ uwrap_init();
return uwrap_setresgid(-1, egid, -1);
}
#endif
@@ -889,6 +957,7 @@ int setregid(gid_t rgid, gid_t egid)
return libc_setregid(rgid, egid);
}
+ uwrap_init();
return uwrap_setresgid(rgid, egid, -1);
}
#endif
@@ -900,6 +969,7 @@ int setresgid(gid_t rgid, gid_t egid, gid_t sgid)
return libc_setresgid(rgid, egid, sgid);
}
+ uwrap_init();
return uwrap_setresgid(rgid, egid, sgid);
}
#endif
@@ -912,9 +982,9 @@ static gid_t uwrap_getgid(void)
struct uwrap_thread *id = uwrap_tls_id;
gid_t gid;
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
gid = id->rgid;
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
return gid;
}
@@ -925,6 +995,7 @@ gid_t getgid(void)
return libc_getgid();
}
+ uwrap_init();
return uwrap_getgid();
}
@@ -936,9 +1007,9 @@ static uid_t uwrap_getegid(void)
struct uwrap_thread *id = uwrap_tls_id;
gid_t gid;
- pthread_mutex_lock(&uwrap_id_mutex);
+ UWRAP_LOCK(uwrap_id);
gid = id->egid;
- pthread_mutex_unlock(&uwrap_id_mutex);
+ UWRAP_UNLOCK(uwrap_id);
--
UID Wrapper Repository
More information about the samba-cvs
mailing list