The branch, master has been updated via 80932d7 uwrap: Add logging if uwrap is enabled correctly. via a4d3db5 uwrap: Log error if we are out of memory. via 135582e uwrap: Add a better logging function. via 334c562 cmake: Check for HAVE_FUNCTION_ATTRIBUTE_FORMAT. from 690da04 uwrap: Fall back to RTLD_NEXT if we can't find libc.
http://gitweb.samba.org/?p=uid_wrapper.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 80932d786bdf8ce6f8e4fb1f6b09f1252caba302 Author: Andreas Schneider <a...@samba.org> Date: Fri May 30 15:52:19 2014 +0200 uwrap: Add logging if uwrap is enabled correctly. Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Michael Adam <ob...@samba.org> commit a4d3db55d723048ad07e76a3365b7500ad3262a5 Author: Andreas Schneider <a...@samba.org> Date: Fri May 30 15:52:00 2014 +0200 uwrap: Log error if we are out of memory. Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Michael Adam <ob...@samba.org> commit 135582e8e9230ae0bfb0f99e3e549ec9e29c8183 Author: Andreas Schneider <a...@samba.org> Date: Fri May 30 15:44:39 2014 +0200 uwrap: Add a better logging function. Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Michael Adam <ob...@samba.org> commit 334c562f100fb0bd007ee5461e0fef299ff768b4 Author: Andreas Schneider <a...@samba.org> Date: Fri May 30 15:59:17 2014 +0200 cmake: Check for HAVE_FUNCTION_ATTRIBUTE_FORMAT. Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Michael Adam <ob...@samba.org> ----------------------------------------------------------------------- Summary of changes: ConfigureChecks.cmake | 7 ++++ config.h.cmake | 1 + src/uid_wrapper.c | 88 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 90 insertions(+), 6 deletions(-) Changeset truncated at 500 lines: diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index 123128f..899d905 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -143,6 +143,13 @@ int main(void) { return 0; }" HAVE_DESTRUCTOR_ATTRIBUTE) +check_c_source_compiles(" +void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2))); + +int main(void) { + return 0; +}" HAVE_FUNCTION_ATTRIBUTE_FORMAT) + # SYSTEM LIBRARIES check_library_exists(dl dlopen "" HAVE_LIBDL) diff --git a/config.h.cmake b/config.h.cmake index 0e67b23..840b5d4 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -58,6 +58,7 @@ #cmakedefine HAVE_GCC_THREAD_LOCAL_STORAGE 1 #cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1 +#cmakedefine HAVE_FUNCTION_ATTRIBUTE_FORMAT 1 /*************************** ENDIAN *****************************/ diff --git a/src/uid_wrapper.c b/src/uid_wrapper.c index e9c7d5a..f53aa47 100644 --- a/src/uid_wrapper.c +++ b/src/uid_wrapper.c @@ -49,11 +49,12 @@ #define DESTRUCTOR_ATTRIBUTE #endif /* HAVE_DESTRUCTOR_ATTRIBUTE */ -#ifdef NDEBUG -#define UWRAP_DEBUG(...) +/* GCC have printf type attribute check. */ +#ifdef HAVE_FUNCTION_ATTRIBUTE_FORMAT +#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b))) #else -#define UWRAP_DEBUG(...) fprintf(stderr, __VA_ARGS__) -#endif +#define PRINTF_ATTRIBUTE(a,b) +#endif /* HAVE_FUNCTION_ATTRIBUTE_FORMAT */ #define UWRAP_DLIST_ADD(list,item) do { \ if (!(list)) { \ @@ -90,6 +91,70 @@ #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); (x)=NULL;} } while(0) #endif +/***************** + * LOGGING + *****************/ + +enum uwrap_dbglvl_e { + UWRAP_LOG_ERROR = 0, + UWRAP_LOG_WARN, + UWRAP_LOG_DEBUG, + UWRAP_LOG_TRACE +}; + +#ifdef NDEBUG +# define UWRAP_LOG(...) +#else /* NDEBUG */ +static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *format, ...) PRINTF_ATTRIBUTE(2, 3); +# define UWRAP_LOG(dbglvl, ...) uwrap_log((dbglvl), __VA_ARGS__) + +static void uwrap_log(enum uwrap_dbglvl_e dbglvl, const char *format, ...) +{ + char buffer[1024]; + va_list va; + const char *d; + unsigned int lvl = 0; + + d = getenv("UID_WRAPPER_DEBUGLEVEL"); + if (d != NULL) { + lvl = atoi(d); + } + + va_start(va, format); + vsnprintf(buffer, sizeof(buffer), format, va); + va_end(va); + + if (lvl >= dbglvl) { + switch (dbglvl) { + case UWRAP_LOG_ERROR: + fprintf(stderr, + "UWRAP_ERROR(%d): %s\n", + (int)getpid(), buffer); + break; + case UWRAP_LOG_WARN: + fprintf(stderr, + "UWRAP_WARN(%d): %s\n", + (int)getpid(), buffer); + break; + case UWRAP_LOG_DEBUG: + fprintf(stderr, + "UWRAP_DEBUG(%d): %s\n", + (int)getpid(), buffer); + break; + case UWRAP_LOG_TRACE: + fprintf(stderr, + "UWRAP_TRACE(%d): %s\n", + (int)getpid(), buffer); + break; + } + } +} +#endif /* NDEBUG */ + +/***************** + * LIBC + *****************/ + #define LIBC_NAME "libc.so" struct uwrap_libc_fns { @@ -425,12 +490,14 @@ static int uwrap_new_id(pthread_t tid, bool do_alloc) if (do_alloc) { id = malloc(sizeof(struct uwrap_thread)); if (id == NULL) { + UWRAP_LOG(UWRAP_LOG_ERROR, "Unable to allocate memory"); errno = ENOMEM; return -1; } id->groups = malloc(sizeof(gid_t) * 1); if (id->groups == NULL) { + UWRAP_LOG(UWRAP_LOG_ERROR, "Unable to allocate memory"); SAFE_FREE(id); errno = ENOMEM; return -1; @@ -511,6 +578,8 @@ static void uwrap_init(void) 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. @@ -544,9 +613,15 @@ static void uwrap_init(void) } uwrap.enabled = true; + + UWRAP_LOG(UWRAP_LOG_DEBUG, + "Enabled uid_wrapper as %s", + uwrap.myuid == 0 ? "root" : "user"); } pthread_mutex_unlock(&uwrap_id_mutex); + + UWRAP_LOG(UWRAP_LOG_DEBUG, "Succeccfully initialized uid_wrapper"); } bool uid_wrapper_enabled(void) @@ -1110,8 +1185,9 @@ static long int uwrap_syscall (long int sysno, va_list vp) } break; default: - UWRAP_DEBUG("UID_WRAPPER calling non-wrapped syscall " - "%lu\n", sysno); + UWRAP_LOG(UWRAP_LOG_DEBUG, + "UID_WRAPPER calling non-wrapped syscall %lu\n", + sysno); rc = libc_vsyscall(sysno, vp); break; -- UID Wrapper Repository