The branch, master has been updated
       via  7523b05 testsuite: Add compatibility for musl-libc 1.1
       via  09bb07c nwrap: Add compatibility for musl-libc 1.1
       via  bba5eec nwrap: Add a comment to the pthread_atfork() call
       via  2b80c4c nwrap: Use a constructor to initialize pthread and nwrap
       via  52490af cmake: Check for contructor attribute support
       via  4b7e685 nwrap: Add NULL checks for destructor
      from  d66ce39 nss_wrapper: Use perl via "env"

https://git.samba.org/?p=nss_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7523b05f0e84e8d9a1c27c06805d0ba72ec33373
Author: Dennis Schridde <dennis.schri...@uni-heidelberg.de>
Date:   Wed Jan 25 22:25:24 2017 +0100

    testsuite: Add compatibility for musl-libc 1.1
    
    The major difference is that getpwent_r and getgrent_r do not exist in
    musl-libc. The testsuite was adapted to skip these tests if the
    functions themselves are missing.
    
    Signed-Off-By: Dennis Schridde <dennis.schri...@uni-heidelberg.de>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 09bb07c4aec3da9d555d0a608b2c98dde46ff886
Author: Dennis Schridde <dennis.schri...@uni-heidelberg.de>
Date:   Mon Mar 27 16:26:11 2017 +0200

    nwrap: Add compatibility for musl-libc 1.1
    
    The major difference is that getpwent_r and getgrent_r do not exist in
    musl-libc. Hence it is sufficient to compile the wrappers for those only
    conditionally.
    
    Tested with musl-libc 1.1.15-r5 on Alpine Linux 3.5. Also confirmed to
    not break with GNU libc 2.24-8 on Debian "Stretch" / 9.
    
    Signed-Off-By: Dennis Schridde <dennis.schri...@uni-heidelberg.de>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit bba5eecf377b2617dfa25f78bcc11a240c3f5266
Author: Andreas Schneider <a...@samba.org>
Date:   Wed May 31 15:25:30 2017 +0200

    nwrap: Add a comment to the pthread_atfork() call
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 2b80c4ce0be8a43fb6ea6abcd4f97105982e239a
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Mar 27 16:23:08 2017 +0200

    nwrap: Use a constructor to initialize pthread and nwrap
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 52490af39c319a107fc04c99ee35ddd80a82ce67
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Mar 27 16:22:45 2017 +0200

    cmake: Check for contructor attribute support
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 4b7e685ef79d3a993ac4da20b1cca328c9354ee8
Author: Andreas Schneider <a...@samba.org>
Date:   Mon Mar 27 16:38:53 2017 +0200

    nwrap: Add NULL checks for destructor
    
    If we call init early and leave early they are not filled.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

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

Summary of changes:
 ConfigureChecks.cmake |  12 ++++++
 config.h.cmake        |   1 +
 src/nss_wrapper.c     | 115 +++++++++++++++++++++++++++++++++-----------------
 tests/testsuite.c     |  18 +++++---
 4 files changed, 102 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 462b166..6f760e6 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -235,6 +235,18 @@ int main(void) {
 }" HAVE_ATTRIBUTE_PRINTF_FORMAT)
 
 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 75c92ed..b18dff2 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -93,6 +93,7 @@
 #cmakedefine HAVE_IPV6 1
 
 #cmakedefine HAVE_ATTRIBUTE_PRINTF_FORMAT 1
+#cmakedefine HAVE_CONSTRUCTOR_ATTRIBUTE 1
 #cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
 
 /*************************** ENDIAN *****************************/
diff --git a/src/nss_wrapper.c b/src/nss_wrapper.c
index 82581b1..70a5989 100644
--- a/src/nss_wrapper.c
+++ b/src/nss_wrapper.c
@@ -142,6 +142,12 @@ typedef nss_status_t NSS_STATUS;
 #define PRINTF_ATTRIBUTE(a,b)
 #endif /* HAVE_ATTRIBUTE_PRINTF_FORMAT */
 
+#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
@@ -292,11 +298,13 @@ struct nwrap_libc_fns {
        int (*_libc_getpwuid_r)(uid_t uid, struct passwd *pwd, char *buf, 
size_t buflen, struct passwd **result);
        void (*_libc_setpwent)(void);
        struct passwd *(*_libc_getpwent)(void);
-#ifdef HAVE_SOLARIS_GETPWENT_R
+#ifdef HAVE_GETPWENT_R
+#  ifdef HAVE_SOLARIS_GETPWENT_R
        struct passwd *(*_libc_getpwent_r)(struct passwd *pwbuf, char *buf, 
size_t buflen);
-#else
+#  else /* HAVE_SOLARIS_GETPWENT_R */
        int (*_libc_getpwent_r)(struct passwd *pwbuf, char *buf, size_t buflen, 
struct passwd **pwbufp);
-#endif
+#  endif /* HAVE_SOLARIS_GETPWENT_R */
+#endif /* HAVE_GETPWENT_R */
        void (*_libc_endpwent)(void);
        int (*_libc_initgroups)(const char *user, gid_t gid);
        struct group *(*_libc_getgrnam)(const char *name);
@@ -305,11 +313,13 @@ struct nwrap_libc_fns {
        int (*_libc_getgrgid_r)(gid_t gid, struct group *grp, char *buf, size_t 
buflen, struct group **result);
        void (*_libc_setgrent)(void);
        struct group *(*_libc_getgrent)(void);
-#ifdef HAVE_SOLARIS_GETGRENT_R
+#ifdef HAVE_GETGRENT_R
+#  ifdef HAVE_SOLARIS_GETGRENT_R
        struct group *(*_libc_getgrent_r)(struct group *group, char *buf, 
size_t buflen);
-#else
+#  else /* HAVE_SOLARIS_GETGRENT_R */
        int (*_libc_getgrent_r)(struct group *group, char *buf, size_t buflen, 
struct group **result);
-#endif
+#  endif /* HAVE_SOLARIS_GETGRENT_R */
+#endif /* HAVE_GETGRENT_R */
        void (*_libc_endgrent)(void);
        int (*_libc_getgrouplist)(const char *user, gid_t group, gid_t *groups, 
int *ngroups);
 
@@ -796,6 +806,7 @@ static struct nwrap_he nwrap_he_global;
 static void nwrap_init(void);
 static bool nwrap_gr_parse_line(struct nwrap_cache *nwrap, char *line);
 static void nwrap_gr_unload(struct nwrap_cache *nwrap);
+void nwrap_constructor(void) CONSTRUCTOR_ATTRIBUTE;
 void nwrap_destructor(void) DESTRUCTOR_ATTRIBUTE;
 
 /*********************************************************
@@ -1066,7 +1077,8 @@ static struct passwd *libc_getpwent(void)
        return nwrap_main_global->libc->fns->_libc_getpwent();
 }
 
-#ifdef HAVE_SOLARIS_GETPWENT_R
+#ifdef HAVE_GETPWENT_R
+#  ifdef HAVE_SOLARIS_GETPWENT_R
 static struct passwd *libc_getpwent_r(struct passwd *pwdst,
                                      char *buf,
                                      int buflen)
@@ -1077,7 +1089,7 @@ static struct passwd *libc_getpwent_r(struct passwd 
*pwdst,
                                                              buf,
                                                              buflen);
 }
-#else /* HAVE_SOLARIS_GETPWENT_R */
+#  else /* HAVE_SOLARIS_GETPWENT_R */
 static int libc_getpwent_r(struct passwd *pwdst,
                           char *buf,
                           size_t buflen,
@@ -1090,7 +1102,8 @@ static int libc_getpwent_r(struct passwd *pwdst,
                                                              buflen,
                                                              pwdstp);
 }
-#endif /* HAVE_SOLARIS_GETPWENT_R */
+#  endif /* HAVE_SOLARIS_GETPWENT_R */
+#endif /* HAVE_GETPWENT_R */
 
 static void libc_endpwent(void)
 {
@@ -1183,7 +1196,7 @@ static struct group *libc_getgrent(void)
 }
 
 #ifdef HAVE_GETGRENT_R
-#ifdef HAVE_SOLARIS_GETGRENT_R
+#  ifdef HAVE_SOLARIS_GETGRENT_R
 static struct group *libc_getgrent_r(struct group *group,
                                     char *buf,
                                     size_t buflen)
@@ -1194,7 +1207,7 @@ static struct group *libc_getgrent_r(struct group *group,
                                                              buf,
                                                              buflen);
 }
-#else /* !HAVE_SOLARIS_GETGRENT_R */
+#  else /* HAVE_SOLARIS_GETGRENT_R */
 static int libc_getgrent_r(struct group *group,
                           char *buf,
                           size_t buflen,
@@ -1207,7 +1220,7 @@ static int libc_getgrent_r(struct group *group,
                                                              buflen,
                                                              result);
 }
-#endif /* HAVE_SOLARIS_GETGRENT_R */
+#  endif /* HAVE_SOLARIS_GETGRENT_R */
 #endif /* HAVE_GETGRENT_R */
 
 static void libc_endgrent(void)
@@ -1561,10 +1574,6 @@ static void nwrap_init(void)
 
        nwrap_initialized = true;
 
-       /* Initialize pthread_atfork handlers */
-       pthread_atfork(&nwrap_thread_prepare, &nwrap_thread_parent,
-                      &nwrap_thread_child);
-
        env = getenv("NSS_WRAPPER_MAX_HOSTENTS");
        if (env != NULL) {
                max_hostents_tmp = (size_t)strtol(env, &endptr, 10);
@@ -4420,6 +4429,7 @@ struct passwd *getpwent(void)
  *   GETPWENT_R
  ***************************************************************************/
 
+#ifdef HAVE_GETPWENT_R
 static int nwrap_getpwent_r(struct passwd *pwdst, char *buf,
                            size_t buflen, struct passwd **pwdstp)
 {
@@ -4437,7 +4447,7 @@ static int nwrap_getpwent_r(struct passwd *pwdst, char 
*buf,
        return ENOENT;
 }
 
-#ifdef HAVE_SOLARIS_GETPWENT_R
+#  ifdef HAVE_SOLARIS_GETPWENT_R
 struct passwd *getpwent_r(struct passwd *pwdst, char *buf, int buflen)
 {
        struct passwd *pwdstp = NULL;
@@ -4453,7 +4463,7 @@ struct passwd *getpwent_r(struct passwd *pwdst, char 
*buf, int buflen)
 
        return pwdstp;
 }
-#else /* HAVE_SOLARIS_GETPWENT_R */
+#  else /* HAVE_SOLARIS_GETPWENT_R */
 int getpwent_r(struct passwd *pwdst, char *buf,
               size_t buflen, struct passwd **pwdstp)
 {
@@ -4463,7 +4473,8 @@ int getpwent_r(struct passwd *pwdst, char *buf,
 
        return nwrap_getpwent_r(pwdst, buf, buflen, pwdstp);
 }
-#endif /* HAVE_SOLARIS_GETPWENT_R */
+#  endif /* HAVE_SOLARIS_GETPWENT_R */
+#endif /* HAVE_GETPWENT_R */
 
 /****************************************************************************
  *   ENDPWENT
@@ -4726,6 +4737,7 @@ struct group *getgrent(void)
  *   GETGRENT_R
  ***************************************************************************/
 
+#ifdef HAVE_GETGRENT_R
 static int nwrap_getgrent_r(struct group *grdst, char *buf,
                            size_t buflen, struct group **grdstp)
 {
@@ -4743,7 +4755,7 @@ static int nwrap_getgrent_r(struct group *grdst, char 
*buf,
        return ENOENT;
 }
 
-#ifdef HAVE_SOLARIS_GETGRENT_R
+#  ifdef HAVE_SOLARIS_GETGRENT_R
 struct group *getgrent_r(struct group *src, char *buf, int buflen)
 {
        struct group *grdstp = NULL;
@@ -4760,7 +4772,7 @@ struct group *getgrent_r(struct group *src, char *buf, 
int buflen)
 
        return grdstp;
 }
-#else /* HAVE_SOLARIS_GETGRENT_R */
+#  else /* HAVE_SOLARIS_GETGRENT_R */
 int getgrent_r(struct group *src, char *buf,
               size_t buflen, struct group **grdstp)
 {
@@ -4770,7 +4782,8 @@ int getgrent_r(struct group *src, char *buf,
 
        return nwrap_getgrent_r(src, buf, buflen, grdstp);
 }
-#endif /* HAVE_SOLARIS_GETGRENT_R */
+#  endif /* HAVE_SOLARIS_GETGRENT_R */
+#endif /* HAVE_GETGRENT_R */
 
 /****************************************************************************
  *   ENDGRENT
@@ -5530,6 +5543,28 @@ int gethostname(char *name, size_t len)
 }
 
 /****************************
+ * CONSTRUCTOR
+ ***************************/
+void nwrap_constructor(void)
+{
+       /*
+        * 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.
+        *
+        * Setting these handlers should prevent such deadlocks.
+        */
+       pthread_atfork(&nwrap_thread_prepare,
+                      &nwrap_thread_parent,
+                      &nwrap_thread_child);
+
+       /*
+        * Here is safe place to call nwrap_init() and initialize data
+        * for the main process.
+        */
+       nwrap_init();
+}
+
+/****************************
  * DESTRUCTOR
  ***************************/
 
@@ -5546,28 +5581,32 @@ void nwrap_destructor(void)
                struct nwrap_main *m = nwrap_main_global;
 
                /* libc */
-               SAFE_FREE(m->libc->fns);
-               if (m->libc->handle != NULL) {
-                       dlclose(m->libc->handle);
-               }
-               if (m->libc->nsl_handle != NULL) {
-                       dlclose(m->libc->nsl_handle);
-               }
-               if (m->libc->sock_handle != NULL) {
-                       dlclose(m->libc->sock_handle);
+               if (m->libc != NULL) {
+                       SAFE_FREE(m->libc->fns);
+                       if (m->libc->handle != NULL) {
+                               dlclose(m->libc->handle);
+                       }
+                       if (m->libc->nsl_handle != NULL) {
+                               dlclose(m->libc->nsl_handle);
+                       }
+                       if (m->libc->sock_handle != NULL) {
+                               dlclose(m->libc->sock_handle);
+                       }
+                       SAFE_FREE(m->libc);
                }
-               SAFE_FREE(m->libc);
 
                /* backends */
-               for (i = 0; i < m->num_backends; i++) {
-                       struct nwrap_backend *b = &(m->backends[i]);
+               if (m->backends != NULL) {
+                       for (i = 0; i < m->num_backends; i++) {
+                               struct nwrap_backend *b = &(m->backends[i]);
 
-                       if (b->so_handle != NULL) {
-                               dlclose(b->so_handle);
+                               if (b->so_handle != NULL) {
+                                       dlclose(b->so_handle);
+                               }
+                               SAFE_FREE(b->fns);
                        }
-                       SAFE_FREE(b->fns);
+                       SAFE_FREE(m->backends);
                }
-               SAFE_FREE(m->backends);
        }
 
        if (nwrap_pw_global.cache != NULL) {
diff --git a/tests/testsuite.c b/tests/testsuite.c
index dccdb97..6a9f4d1 100644
--- a/tests/testsuite.c
+++ b/tests/testsuite.c
@@ -433,9 +433,11 @@ static bool test_nwrap_enum_passwd(struct passwd 
**pwd_array_p,
 static bool test_nwrap_enum_r_passwd(struct passwd **pwd_array_p,
                                     size_t *num_pwd_p)
 {
-       struct passwd pwd, *pwdp;
        struct passwd *pwd_array = NULL;
        size_t num_pwd = 0;
+/* Skip these tests if the platform does not provide getpwent_r() */
+#ifdef HAVE_GETPWENT_R
+       struct passwd pwd, *pwdp;
        char buffer[4096];
        int ret;
 
@@ -450,7 +452,7 @@ static bool test_nwrap_enum_r_passwd(struct passwd 
**pwd_array_p,
                if (pwdp == NULL) {
                        break;
                }
-#else
+#else /* HAVE_SOLARIS_GETPWENT_R */
                ret = getpwent_r(&pwd, buffer, sizeof(buffer), &pwdp);
                if (ret != 0) {
                        if (ret != ENOENT) {
@@ -458,7 +460,7 @@ static bool test_nwrap_enum_r_passwd(struct passwd 
**pwd_array_p,
                        }
                        break;
                }
-#endif
+#endif /* HAVE_SOLARIS_GETPWENT_R */
                print_passwd(&pwd);
                if (pwd_array_p && num_pwd_p) {
                        pwd_array = realloc(pwd_array, sizeof(struct passwd) * 
(num_pwd + 1));
@@ -470,6 +472,7 @@ static bool test_nwrap_enum_r_passwd(struct passwd 
**pwd_array_p,
 
        DEBUG("Testing endpwent\n");
        endpwent();
+#endif /* HAVE_GETPWENT_R */
 
        if (pwd_array_p) {
                *pwd_array_p = pwd_array;
@@ -598,9 +601,11 @@ static bool test_nwrap_enum_group(struct group 
**grp_array_p,
 static bool test_nwrap_enum_r_group(struct group **grp_array_p,
                                    size_t *num_grp_p)
 {
-       struct group grp, *grpp;
        struct group *grp_array = NULL;
        size_t num_grp = 0;
+/* Skip these tests if the platform does not provide getgrent_r() */
+#ifdef HAVE_GETGRENT_R
+       struct group grp, *grpp;
        char buffer[4096];
        int ret;
 
@@ -615,7 +620,7 @@ static bool test_nwrap_enum_r_group(struct group 
**grp_array_p,
                if (grpp == NULL) {
                        break;
                }
-#else
+#else /* HAVE_SOLARIS_GETGRENT_R */
                ret = getgrent_r(&grp, buffer, sizeof(buffer), &grpp);
                if (ret != 0) {
                        if (ret != ENOENT) {
@@ -623,7 +628,7 @@ static bool test_nwrap_enum_r_group(struct group 
**grp_array_p,
                        }
                        break;
                }
-#endif
+#endif /* HAVE_SOLARIS_GETGRENT_R */
                print_group(&grp);
                if (grp_array_p && num_grp_p) {
                        grp_array = realloc(grp_array, sizeof(struct group) * 
(num_grp + 1));
@@ -635,6 +640,7 @@ static bool test_nwrap_enum_r_group(struct group 
**grp_array_p,
 
        DEBUG("Testing endgrent\n");
        endgrent();
+#endif /* HAVE_GETGRENT_R */
 
        if (grp_array_p) {
                *grp_array_p = grp_array;


-- 
NSS Wrapper Repository

Reply via email to