This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi, I am trying to write a wrapper library that catches file access calls. Basically it seems to work fairly well, except for an issue with pthread cleanup handlers. Basically if I wrap a function, the wrapped function's cleanup handler is not called (easy to demonstrate with the NPTL tst-cancelx4 test): ----- # LD_PRELOAD=libopen-wrapper.so ./nptl/tst-cancelx4 | grep 'not called' cleanup handler not called for 'open' ----- Attached is above test case that can be compiled with: ----- gcc -nostdlib -shared -fPIC -o libopen-wrapper.so open-wrapper.c -ldl ----- Any comments/pointers will be appreciated. Thanks, -- Martin Schlemmer
#define _GNU_SOURCE #define _REENTRANT #include <dlfcn.h> #include <errno.h> #include <stdarg.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> static int (*true_open) (const char *, int, ...) = NULL; int open(const char *name, int flags, ...) { va_list ap; mode_t mode = 0; void *libc_handle = RTLD_NEXT; char *dlerror_msg = NULL; int old_errno = errno; if (NULL == true_open) { dlerror(); true_open = dlvsym(libc_handle, "open", "GLIBC_2.0"); if (NULL == true_open) { dlerror_msg = dlerror(); if (NULL != dlerror_msg) printf("%s\n", dlerror_msg); else printf("Error loading requested symbol!\n"); exit(1); } } if (flags & O_CREAT) { va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); } errno = old_errno; return true_open(name, flags, mode); }
Attachment:
signature.asc
Description: This is a digitally signed message part
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |