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