proj: Allow exclutions of libraries/objects
This commit is contained in:
@@ -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 '*',
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <link.h>
|
||||
|
||||
#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);
|
||||
|
||||
Reference in New Issue
Block a user