diff --git a/proj/intercept/intercept b/proj/intercept/intercept index 4f4d6dc..cd76316 100755 --- a/proj/intercept/intercept +++ b/proj/intercept/intercept @@ -9,13 +9,18 @@ import sys def main() -> None: parser = argparse.ArgumentParser() - parser.add_argument('-f', '--functions') + parser.add_argument('-F', '--functions') + libs = parser.add_mutually_exclusive_group() + libs.add_argument('-o', '--only-own', action='store_true') + libs.add_argument('-L', '--libraries') mode = parser.add_mutually_exclusive_group() mode.add_argument('-l', '--log') mode.add_argument('-i', '--intercept') args, extra = parser.parse_known_args() if len(extra) > 0 and extra[0] == '--': extra.pop(0) + if len(extra) == 0: + parser.error('command expected after arguments or \'--\'') if args.intercept: intercept = args.intercept @@ -27,6 +32,7 @@ def main() -> None: 'LD_PRELOAD': os.getcwd() + '/intercept.so', 'INTERCEPT': intercept, 'INTERCEPT_FUNCTIONS': args.functions or '*', + 'INTERCEPT_LIBRARIES': '*,-/lib*,-/usr/lib*' if args.only_own else args.libraries or '*', }) diff --git a/proj/intercept/src/intercept.c b/proj/intercept/src/intercept.c index 8bafb44..9ee6ad9 100644 --- a/proj/intercept/src/intercept.c +++ b/proj/intercept/src/intercept.c @@ -21,6 +21,7 @@ #include #include #include +#include #define BUFFER_SIZE 256 @@ -216,6 +217,7 @@ func_def(ssize_t, recvmsg)(int, struct msghdr *, int); #define ret_addr __builtin_return_address(0) #define ret_str ": %p (%s+%p%s%s)" #define ret_data ret_addr, info.dli_fname, (long)ret_addr - (long)info.dli_fbase, info.dli_sname ? ", " : "", info.dli_sname ? info.dli_sname : "" +#define lib_idx (((long)info.dli_fbase >> 12) & 0xFFF) #define if_fail if (strncmp(msg_buf, "fail ", 5) == 0) @@ -544,6 +546,7 @@ static char *strtostr(char *ptr, char **end_ptr, char *buf) { static int mode = 0; static int intercept = 0; static uint8_t func_flags[256]; +static uint8_t lib_flags[0x1000]; static size_t msg_bytes(char *buf, size_t maxlen, size_t len, const char *str, int flags) { size_t offset = flags & 1 ? snprintf(buf, maxlen, "\"") : snprintf(buf, maxlen, "%p:\"", str); @@ -754,6 +757,33 @@ static void fin(void) { mode = 0, intercept = 0; } +static int iter_lib(struct dl_phdr_info *info, size_t size, void *data) { + char *name1 = (char *)data; + const char *name2 = info->dlpi_name; + const long idx = ((long)info->dlpi_addr >> 12) & 0xFFF; + + const int wildcard = name1[strlen(name1) - 1] == '*'; + int not = 0; + if (name1[0] == '-') { + name1++; + not = 1; + } + + if (name2[0] == 0) { + lib_flags[idx] |= 1; + return 0; + } + + if (strcmp(name1, name2) == 0 || (wildcard && strncmp(name1, name2, strlen(name1) - 1) == 0)) { + if (not) { + lib_flags[idx] &= ~1; + } else { + lib_flags[idx] |= 1; + } + } + return 0; +} + static void init(void) { if (mode) return; mode = -1; @@ -811,8 +841,11 @@ static void init(void) { } else { fprintf(stderr, "intercept: not logging or manipulating function/system calls\n"); } + char *fncts = getenv("INTERCEPT_FUNCTIONS"); - if (fncts) { + if (!fncts) { + memset(func_flags, 1, sizeof(func_flags)); + } else { memset(func_flags, 0, sizeof(func_flags)); const char *func_names_ordered[] = { #define X(name) #name, @@ -847,15 +880,33 @@ static void init(void) { } } } + } + + char *libs = getenv("INTERCEPT_LIBRARIES"); + if (!libs) { + memset(lib_flags, 1, sizeof(lib_flags)); } else { - memset(func_flags, 1, sizeof(func_flags)); + memset(lib_flags, 0, sizeof(lib_flags)); + char *lib_names[0x1000] = {libs, NULL}; + const size_t len = strlen(libs); + for (int i = 0, p = 0; i < len; i++) { + const char ch = libs[i]; + if (ch == ',' || ch == ';' || ch == ':' || ch == 0) { + libs[i] = 0; + lib_names[++p] = libs + i + 1; + } + } + + for (int i = 0; lib_names[i] != NULL; i++) { + dl_iterate_phdr(iter_lib, lib_names[i]); + } } } void *sym(malloc)(size_t size) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_malloc]) return __real_malloc(size); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_malloc] || !lib_flags[lib_idx]) return __real_malloc(size); msg("malloc(%li)" ret_str, size, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -873,7 +924,7 @@ void *sym(malloc)(size_t size) { void *sym(calloc)(size_t nmemb, size_t size) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_calloc]) return __real_calloc(nmemb, size); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_calloc] || !lib_flags[lib_idx]) return __real_calloc(nmemb, size); msg("calloc(%li, %li)" ret_str, nmemb, size, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -891,7 +942,7 @@ void *sym(calloc)(size_t nmemb, size_t size) { void *sym(realloc)(void *ptr, size_t size) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_realloc]) return __real_realloc(ptr, size); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_realloc] || !lib_flags[lib_idx]) return __real_realloc(ptr, size); msg("realloc(%p, %li)" ret_str, ptr, size, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -909,7 +960,7 @@ void *sym(realloc)(void *ptr, size_t size) { void *sym(reallocarray)(void *ptr, size_t nmemb, size_t size) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_reallocarray]) return __real_reallocarray(ptr, nmemb, size); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_reallocarray] || !lib_flags[lib_idx]) return __real_reallocarray(ptr, nmemb, size); msg("reallocarray(%p, %li)" ret_str, ptr, size, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -927,7 +978,7 @@ void *sym(reallocarray)(void *ptr, size_t nmemb, size_t size) { void sym(free)(void *ptr) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_free]) { __real_free(ptr); return; } + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_free] || !lib_flags[lib_idx]) { __real_free(ptr); return; } msg("free(%p)" ret_str, ptr, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -943,7 +994,7 @@ void sym(free)(void *ptr) { int sym(getopt)(const int argc, char *const argv[], const char *shortopts) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getopt]) return __real_getopt(argc, argv, shortopts); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getopt] || !lib_flags[lib_idx]) return __real_getopt(argc, argv, shortopts); msg("getopt(%i, %as, %es)" ret_str, argc, argc, argv, shortopts, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -963,7 +1014,7 @@ int sym(getopt)(const int argc, char *const argv[], const char *shortopts) { void sym(exit)(int status) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_exit]) __real_exit(status); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_exit] || !lib_flags[lib_idx]) __real_exit(status); msg("exit(%i)" ret_str, status, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -977,7 +1028,7 @@ void sym(exit)(int status) { ssize_t sym(read)(int fildes, void *buf, size_t nbyte) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_read]) return __real_read(fildes, buf, nbyte); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_read] || !lib_flags[lib_idx]) return __real_read(fildes, buf, nbyte); msg("read(%i, %p, %i)" ret_str, fildes, buf, nbyte, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1001,7 +1052,7 @@ ssize_t sym(read)(int fildes, void *buf, size_t nbyte) { ssize_t sym(pread)(int fildes, void *buf, size_t nbyte, off_t offset) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pread]) return __real_pread(fildes, buf, nbyte, offset); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pread] || !lib_flags[lib_idx]) return __real_pread(fildes, buf, nbyte, offset); msg("pread(%i, %p, %i, %i)" ret_str, fildes, buf, nbyte, offset, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1025,7 +1076,7 @@ ssize_t sym(pread)(int fildes, void *buf, size_t nbyte, off_t offset) { ssize_t sym(write)(int fildes, const void *buf, size_t nbyte) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_write]) return __real_write(fildes, buf, nbyte); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_write] || !lib_flags[lib_idx]) return __real_write(fildes, buf, nbyte); msg("write(%i, %eb, %i)" ret_str, fildes, nbyte, buf, nbyte, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1045,7 +1096,7 @@ ssize_t sym(write)(int fildes, const void *buf, size_t nbyte) { ssize_t sym(pwrite)(int fildes, const void *buf, size_t nbyte, off_t offset) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pwrite]) return __real_pwrite(fildes, buf, nbyte, offset); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pwrite] || !lib_flags[lib_idx]) return __real_pwrite(fildes, buf, nbyte, offset); msg("pwrite(%i, %eb, %i, %i)" ret_str, fildes, nbyte, buf, nbyte, offset, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1065,7 +1116,7 @@ ssize_t sym(pwrite)(int fildes, const void *buf, size_t nbyte, off_t offset) { int sym(close)(int fildes) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_close]) return __real_close(fildes); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_close] || !lib_flags[lib_idx]) return __real_close(fildes); msg("close(%i)" ret_str, fildes, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1120,7 +1171,7 @@ static const char *getsigstr(int sig) { int sym(sigaction)(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sigaction]) return __real_sigaction(sig, act, oact); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sigaction] || !lib_flags[lib_idx]) return __real_sigaction(sig, act, oact); const char *sigstr = getsigstr(sig); if (act != NULL) { char *name = "sa_handler"; @@ -1193,7 +1244,7 @@ int sym(sigaction)(int sig, const struct sigaction *restrict act, struct sigacti int sym(sem_init)(sem_t *sem, int pshared, unsigned int value) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_init]) return __real_sem_init(sem, pshared, value); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_init] || !lib_flags[lib_idx]) return __real_sem_init(sem, pshared, value); msg("sem_init(%p, %i, %u)" ret_str, sem, pshared, value, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1224,10 +1275,10 @@ sem_t *sym(sem_open)(const char *name, int oflag, ...) { mode_arg = va_arg(args, mode_t); value = va_arg(args, unsigned int); va_end(args); - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_open]) return __real_sem_open(name, oflag, mode_arg, value); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_open] || !lib_flags[lib_idx]) return __real_sem_open(name, oflag, mode_arg, value); msg("sem_open(%es, 0%o:%s, 0%03o, %u)" ret_str, name, oflag, ostr, mode_arg, value, ret_data); } else { - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_open]) return __real_sem_open(name, oflag); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_open] || !lib_flags[lib_idx]) return __real_sem_open(name, oflag); msg("sem_open(%es, 0%o:|%s)" ret_str, name, oflag, ostr, ret_data); } @@ -1299,7 +1350,7 @@ sem_t *sym(sem_open)(const char *name, int oflag, ...) { int sym(sem_post)(sem_t *sem) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_post]) return __real_sem_post(sem); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_post] || !lib_flags[lib_idx]) return __real_sem_post(sem); msg("sem_post(%p)" ret_str, sem, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1317,7 +1368,7 @@ int sym(sem_post)(sem_t *sem) { int sym(sem_wait)(sem_t *sem) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_wait]) return __real_sem_wait(sem); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_wait] || !lib_flags[lib_idx]) return __real_sem_wait(sem); msg("sem_wait(%p)" ret_str, sem, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1335,7 +1386,7 @@ int sym(sem_wait)(sem_t *sem) { int sym(sem_trywait)(sem_t *sem) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_trywait]) return __real_sem_trywait(sem); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_trywait] || !lib_flags[lib_idx]) return __real_sem_trywait(sem); msg("sem_trywait(%p)" ret_str, sem, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1353,7 +1404,7 @@ int sym(sem_trywait)(sem_t *sem) { int sym(sem_timedwait)(sem_t *restrict sem, const struct timespec *restrict abs_timeout) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_timedwait]) return __real_sem_timedwait(sem, abs_timeout); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_timedwait] || !lib_flags[lib_idx]) return __real_sem_timedwait(sem, abs_timeout); msg("sem_timedwait(%p, %qt)" ret_str, sem, abs_timeout, ret_data); struct timespec overwrite; if (mode >= 4) { @@ -1400,7 +1451,7 @@ int sym(sem_timedwait)(sem_t *restrict sem, const struct timespec *restrict abs_ int sym(sem_getvalue)(sem_t *restrict sem, int *restrict value) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_getvalue]) return __real_sem_getvalue(sem, value); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_getvalue] || !lib_flags[lib_idx]) return __real_sem_getvalue(sem, value); msg("sem_getvalue(%p, %p)" ret_str, sem, value, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1422,7 +1473,7 @@ int sym(sem_getvalue)(sem_t *restrict sem, int *restrict value) { int sym(sem_close)(sem_t *sem) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_close]) return __real_sem_close(sem); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_close] || !lib_flags[lib_idx]) return __real_sem_close(sem); msg("sem_close(%p)" ret_str, sem, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1440,7 +1491,7 @@ int sym(sem_close)(sem_t *sem) { int sym(sem_unlink)(const char *name) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_unlink]) return __real_sem_unlink(name); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_unlink] || !lib_flags[lib_idx]) return __real_sem_unlink(name); msg("sem_unlink(%es)" ret_str, name, ret_data); char overwrite[BUFFER_SIZE]; if (mode >= 4) { @@ -1473,7 +1524,7 @@ int sym(sem_unlink)(const char *name) { int sym(sem_destroy)(sem_t *sem) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_destroy]) return __real_sem_destroy(sem); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sem_destroy] || !lib_flags[lib_idx]) return __real_sem_destroy(sem); msg("sem_destroy(%p)" ret_str, sem, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1491,7 +1542,7 @@ int sym(sem_destroy)(sem_t *sem) { int sym(shm_open)(const char *name, int oflag, mode_t mode_arg) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_shm_open]) return __real_shm_open(name, oflag, mode); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_shm_open] || !lib_flags[lib_idx]) return __real_shm_open(name, oflag, mode); char ostr[64] = "|"; flag_str(oflag, O_RDONLY, ostr); flag_str(oflag, O_RDWR, ostr); @@ -1569,7 +1620,7 @@ int sym(shm_open)(const char *name, int oflag, mode_t mode_arg) { int sym(shm_unlink)(const char *name) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_shm_unlink]) return __real_shm_unlink(name); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_shm_unlink] || !lib_flags[lib_idx]) return __real_shm_unlink(name); msg("shm_unlink(%es)" ret_str, name, ret_data); char overwrite[BUFFER_SIZE]; if (mode >= 4) { @@ -1602,7 +1653,7 @@ int sym(shm_unlink)(const char *name) { void *sym(mmap)(void *addr, size_t len, int prot, int flags, int fildes, off_t off) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_mmap]) return __real_mmap(addr, len, prot, flags, fildes, off); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_mmap] || !lib_flags[lib_idx]) return __real_mmap(addr, len, prot, flags, fildes, off); char pstr[64] = "|"; if (prot == PROT_NONE) strcat(pstr, "PROT_NONE|"); flag_str(prot, PROT_READ, pstr); @@ -1637,7 +1688,7 @@ void *sym(mmap)(void *addr, size_t len, int prot, int flags, int fildes, off_t o int sym(munmap)(void *addr, size_t len) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_munmap]) return __real_munmap(addr, len); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_munmap] || !lib_flags[lib_idx]) return __real_munmap(addr, len); msg("munmap(%p, %i)" ret_str, addr, len, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1655,7 +1706,7 @@ int sym(munmap)(void *addr, size_t len) { int sym(ftruncate)(int fildes, off_t length) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_ftruncate]) return __real_ftruncate(fildes, length); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_ftruncate] || !lib_flags[lib_idx]) return __real_ftruncate(fildes, length); msg("ftruncate(%i, %i)" ret_str, fildes, length, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1673,7 +1724,7 @@ int sym(ftruncate)(int fildes, off_t length) { pid_t sym(fork)(void) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_fork]) return __real_fork(); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_fork] || !lib_flags[lib_idx]) return __real_fork(); msg("fork(): %p", ret_addr); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1690,7 +1741,7 @@ pid_t sym(fork)(void) { pid_t sym(wait)(int *stat_loc) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_wait]) return __real_wait(stat_loc); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_wait] || !lib_flags[lib_idx]) return __real_wait(stat_loc); msg("wait(%p)" ret_str, stat_loc, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1712,7 +1763,7 @@ pid_t sym(wait)(int *stat_loc) { pid_t sym(waitpid)(pid_t pid, int *stat_loc, int options) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_waitpid]) return __real_waitpid(pid, stat_loc, options); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_waitpid] || !lib_flags[lib_idx]) return __real_waitpid(pid, stat_loc, options); char ostr[64] = "|"; flag_str(options, WCONTINUED, ostr); flag_str(options, WNOHANG, ostr); @@ -1749,7 +1800,7 @@ int sym(execl)(const char *pathname, const char *arg, ...) { arg_vec[i] = va_arg(args, const char *); } va_end(args); - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execl]) return __real_execv(pathname, (char *const *)arg_vec); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execl] || !lib_flags[lib_idx]) return __real_execv(pathname, (char *const *)arg_vec); char arg_buf[4096] = "", *arg_buf_ptr = arg_buf; for (int i = 1; i < 64; i++) { arg_buf_ptr[0] = ','; @@ -1790,7 +1841,7 @@ int sym(execlp)(const char *file, const char *arg, ...) { arg_vec[i] = va_arg(args, const char *); } va_end(args); - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execlp]) return __real_execvp(file, (char *const *)arg_vec); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execlp] || !lib_flags[lib_idx]) return __real_execvp(file, (char *const *)arg_vec); char arg_buf[4096] = "", *arg_buf_ptr = arg_buf; for (int i = 1; i < 64; i++) { arg_buf_ptr[0] = ','; @@ -1836,7 +1887,7 @@ int sym(execle)(const char *pathname, const char *arg, ...) { } } va_end(args); - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execle]) return __real_execvpe(pathname, (char *const *)arg_vec, envp); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execle] || !lib_flags[lib_idx]) return __real_execvpe(pathname, (char *const *)arg_vec, envp); char arg_buf[4096] = "", *arg_buf_ptr = arg_buf; for (int i = 1; i < 64; i++) { arg_buf_ptr[0] = ','; @@ -1870,7 +1921,7 @@ int sym(execle)(const char *pathname, const char *arg, ...) { int sym(execv)(const char *pathname, char *const argv[]) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execv]) return __real_execv(pathname, argv); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execv] || !lib_flags[lib_idx]) return __real_execv(pathname, argv); int len = 0; for (len = 0; argv[len] != NULL; len++) {} msg("execv(%es, %as)" ret_str, pathname, len, argv, ret_data); if (mode >= 4) { @@ -1891,7 +1942,7 @@ int sym(execv)(const char *pathname, char *const argv[]) { int sym(execvp)(const char *file, char *const argv[]) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execvp]) return __real_execvp(file, argv); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execvp] || !lib_flags[lib_idx]) return __real_execvp(file, argv); int len = 0; for (len = 0; argv[len] != NULL; len++) {} msg("execvp(%es, %as)" ret_str, file, len, argv, ret_data); if (mode >= 4) { @@ -1912,7 +1963,7 @@ int sym(execvp)(const char *file, char *const argv[]) { int sym(execvpe)(const char *file, char *const argv[], char *const envp[]) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execvpe]) return __real_execvpe(file, argv, envp); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execvpe] || !lib_flags[lib_idx]) return __real_execvpe(file, argv, envp); int len1 = 0; for (len1 = 0; argv[len1] != NULL; len1++) {} int len2 = 0; for (len2 = 0; envp[len2] != NULL; len2++) {} msg("execvpe(%es, %as, %as)" ret_str, file, len1, argv, len2, envp, ret_data); @@ -1934,7 +1985,7 @@ int sym(execvpe)(const char *file, char *const argv[], char *const envp[]) { int sym(execve)(const char *pathname, char *const argv[], char *const envp[]) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execve]) return __real_execve(pathname, argv, envp); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_execve] || !lib_flags[lib_idx]) return __real_execve(pathname, argv, envp); int len1 = 0; for (len1 = 0; argv[len1] != NULL; len1++) {} int len2 = 0; for (len2 = 0; envp[len2] != NULL; len2++) {} msg("execve(%es, %as, %as)" ret_str, pathname, len1, argv, len2, envp, ret_data); @@ -1956,7 +2007,7 @@ int sym(execve)(const char *pathname, char *const argv[], char *const envp[]) { int sym(fexecve)(int fd, char *const argv[], char *const envp[]) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_fexecve]) return __real_fexecve(fd, argv, envp); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_fexecve] || !lib_flags[lib_idx]) return __real_fexecve(fd, argv, envp); int len1 = 0; for (len1 = 0; argv[len1] != NULL; len1++) {} int len2 = 0; for (len2 = 0; envp[len2] != NULL; len2++) {} msg("fexecve(%i, %as, %as)" ret_str, fd, len1, argv, len2, envp, ret_data); @@ -1978,7 +2029,7 @@ int sym(fexecve)(int fd, char *const argv[], char *const envp[]) { int sym(pipe)(int fildes[2]) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pipe]) return __real_pipe(fildes); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_pipe] || !lib_flags[lib_idx]) return __real_pipe(fildes); msg("pipe(%p)" ret_str, fildes, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -1998,7 +2049,7 @@ int sym(pipe)(int fildes[2]) { int sym(dup)(int oldfd) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup]) return __real_dup(oldfd); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup] || !lib_flags[lib_idx]) return __real_dup(oldfd); msg("dup(%i)" ret_str, oldfd, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2016,7 +2067,7 @@ int sym(dup)(int oldfd) { int sym(dup2)(int oldfd, int newfd) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup2]) return __real_dup2(oldfd, newfd); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup2] || !lib_flags[lib_idx]) return __real_dup2(oldfd, newfd); msg("dup2(%i, %i)" ret_str, oldfd, newfd, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2034,7 +2085,7 @@ int sym(dup2)(int oldfd, int newfd) { int sym(dup3)(int oldfd, int newfd, int flags) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup3]) return __real_dup3(oldfd, newfd, flags); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_dup3] || !lib_flags[lib_idx]) return __real_dup3(oldfd, newfd, flags); char fstr[16] = "|"; flag_str(flags, O_CLOEXEC, fstr); if (flags & ~(O_CLOEXEC)) strcat(fstr, "?|"); @@ -2055,7 +2106,7 @@ int sym(dup3)(int oldfd, int newfd, int flags) { int sym(socket)(int domain, int type, int protocol) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_socket]) return __real_socket(domain, type, protocol); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_socket] || !lib_flags[lib_idx]) return __real_socket(domain, type, protocol); msg("socket(%i:%s, %i:%s, %i)" ret_str, domain, getdomainstr(domain), type, getsocktype(type), protocol, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2075,7 +2126,7 @@ int sym(socket)(int domain, int type, int protocol) { int sym(bind)(int sockfd, const struct sockaddr *address, socklen_t address_len) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_bind]) return __real_bind(sockfd, address, address_len); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_bind] || !lib_flags[lib_idx]) return __real_bind(sockfd, address, address_len); msg("socket(%i, %qa, %i)" ret_str, sockfd, address_len, address, address_len, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2095,7 +2146,7 @@ int sym(bind)(int sockfd, const struct sockaddr *address, socklen_t address_len) int sym(listen)(int sockfd, int backlog) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_listen]) return __real_listen(sockfd, backlog); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_listen] || !lib_flags[lib_idx]) return __real_listen(sockfd, backlog); msg("listen(%i, %i)" ret_str, sockfd, backlog, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2113,7 +2164,7 @@ int sym(listen)(int sockfd, int backlog) { int sym(accept)(int sockfd, struct sockaddr *restrict address, socklen_t *restrict address_len) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_accept]) return __real_accept(sockfd, address, address_len); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_accept] || !lib_flags[lib_idx]) return __real_accept(sockfd, address, address_len); msg("accept(%i, %p, %p)" ret_str, sockfd, address, address_len, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2141,7 +2192,7 @@ int sym(accept)(int sockfd, struct sockaddr *restrict address, socklen_t *restri int sym(connect)(int sockfd, const struct sockaddr *address, socklen_t address_len) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_connect]) return __real_connect(sockfd, address, address_len); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_connect] || !lib_flags[lib_idx]) return __real_connect(sockfd, address, address_len); msg("connect(%i, %qa, %i)" ret_str, sockfd, address_len, address, address_len, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2161,7 +2212,7 @@ int sym(connect)(int sockfd, const struct sockaddr *address, socklen_t address_l int sym(getaddrinfo)(const char *restrict node, const char *restrict service, const struct addrinfo *restrict hints, struct addrinfo **restrict res) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getaddrinfo]) return __real_getaddrinfo(node, service, hints, res); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_getaddrinfo] || !lib_flags[lib_idx]) return __real_getaddrinfo(node, service, hints, res); msg("getaddrinfo(%es, %es, %qi, %p)" ret_str, node, service, hints, res, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2181,7 +2232,7 @@ int sym(getaddrinfo)(const char *restrict node, const char *restrict service, co void sym(freeaddrinfo)(struct addrinfo *res) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_freeaddrinfo]) { __real_freeaddrinfo(res); return; } + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_freeaddrinfo] || !lib_flags[lib_idx]) { __real_freeaddrinfo(res); return; } msg("freeaddrinfo(%p)" ret_str, res, ret_data); if (mode >= 4) { char msg_buf[BUFFER_SIZE]; @@ -2197,7 +2248,7 @@ void sym(freeaddrinfo)(struct addrinfo *res) { ssize_t sym(send)(int sockfd, const void *buf, size_t length, int flags) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_send]) return __real_send(sockfd, buf, length, flags); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_send] || !lib_flags[lib_idx]) return __real_send(sockfd, buf, length, flags); char fstr[256] = "|"; flag_str(flags, MSG_CONFIRM, fstr); flag_str(flags, MSG_DONTROUTE, fstr); @@ -2228,7 +2279,7 @@ ssize_t sym(send)(int sockfd, const void *buf, size_t length, int flags) { ssize_t sym(sendto)(int sockfd, const void *buf, size_t size, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sendto]) return __real_sendto(sockfd, buf, size, flags, dest_addr, addrlen); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sendto] || !lib_flags[lib_idx]) return __real_sendto(sockfd, buf, size, flags, dest_addr, addrlen); char fstr[256] = "|"; flag_str(flags, MSG_CONFIRM, fstr); flag_str(flags, MSG_DONTROUTE, fstr); @@ -2259,7 +2310,7 @@ ssize_t sym(sendto)(int sockfd, const void *buf, size_t size, int flags, const s ssize_t sym(sendmsg)(int sockfd, const struct msghdr *message, int flags) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sendmsg]) return __real_sendmsg(sockfd, message, flags); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_sendmsg] || !lib_flags[lib_idx]) return __real_sendmsg(sockfd, message, flags); char fstr[256] = "|"; flag_str(flags, MSG_CONFIRM, fstr); flag_str(flags, MSG_DONTROUTE, fstr); @@ -2290,7 +2341,7 @@ ssize_t sym(sendmsg)(int sockfd, const struct msghdr *message, int flags) { ssize_t sym(recv)(int sockfd, void *buf, size_t size, int flags) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_recv]) return __real_recv(sockfd, buf, size, flags); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_recv] || !lib_flags[lib_idx]) return __real_recv(sockfd, buf, size, flags); char fstr[256] = "|"; flag_str(flags, MSG_DONTWAIT, fstr); flag_str(flags, MSG_ERRQUEUE, fstr); @@ -2323,7 +2374,7 @@ ssize_t sym(recv)(int sockfd, void *buf, size_t size, int flags) { ssize_t sym(recvfrom)(int sockfd, void *restrict buf, size_t size, int flags, struct sockaddr *restrict src_addr, socklen_t *restrict addrlen) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_recvfrom]) return __real_recvfrom(sockfd, buf, size, flags, src_addr, addrlen); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_recvfrom] || !lib_flags[lib_idx]) return __real_recvfrom(sockfd, buf, size, flags, src_addr, addrlen); char fstr[256] = "|"; flag_str(flags, MSG_DONTWAIT, fstr); flag_str(flags, MSG_ERRQUEUE, fstr); @@ -2360,7 +2411,7 @@ ssize_t sym(recvfrom)(int sockfd, void *restrict buf, size_t size, int flags, st ssize_t sym(recvmsg)(int sockfd, struct msghdr *message, int flags) { init(); Dl_info info; - if (!dladdr(ret_addr, &info) || !func_flags[func_idx_recvmsg]) return __real_recvmsg(sockfd, message, flags); + if (!dladdr(ret_addr, &info) || !func_flags[func_idx_recvmsg] || !lib_flags[lib_idx]) return __real_recvmsg(sockfd, message, flags); char fstr[256] = "|"; flag_str(flags, MSG_CMSG_CLOEXEC, fstr); flag_str(flags, MSG_DONTWAIT, fstr);