diff --git a/proj/test1/Makefile b/proj/test1/Makefile index 0339ebb..6d38fa6 100644 --- a/proj/test1/Makefile +++ b/proj/test1/Makefile @@ -25,7 +25,7 @@ main: bin/main.o $(CC) -o $@ $^ $(CFLAGS) -lc main_intercept: bin/main.o src/intercept.c - $(CC) -o $@ $^ $(CFLAGS) -lc -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=realloc,--wrap=getopt + $(CC) -o $@ $^ $(CFLAGS) -lc -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=realloc,--wrap=reallocarray,--wrap=getopt clean: rm -rf main main_wrapped bin/* *.so *.ko *.o diff --git a/proj/test1/src/intercept.c b/proj/test1/src/intercept.c index 7a07b33..d82f3d8 100644 --- a/proj/test1/src/intercept.c +++ b/proj/test1/src/intercept.c @@ -17,6 +17,7 @@ static void *(*__real_malloc)(size_t); static void *(*__real_calloc)(size_t, size_t); static void *(*__real_realloc)(void *, size_t); +static void *(*__real_reallocarray)(void *, size_t, size_t); static void (*__real_free)(void *); static int (*__real_getopt)(int, char *const [], const char *); #define __load(var, name) \ @@ -29,6 +30,7 @@ static int (*__real_getopt)(int, char *const [], const char *); extern void *__real_malloc(size_t); extern void *__real_calloc(size_t, size_t); extern void *__real_realloc(void *, size_t); +extern void *__real_reallocarray(void *, size_t, size_t); extern void __real_free(void *); extern int __real_getopt(int, char *const [], const char *); #define __sym(name) __wrap_ ## name @@ -197,6 +199,7 @@ static void init(void) { __load(__real_malloc, "malloc"); __load(__real_calloc, "calloc"); __load(__real_realloc, "realloc"); + __load(__real_reallocarray, "reallocarray"); __load(__real_free, "free"); __load(__real_getopt, "getopt"); #endif @@ -297,7 +300,41 @@ void *__sym(calloc)(size_t nmemb, size_t size) { if (mode >= 4) { char buf[256]; rcv(buf, sizeof(buf)); - // TODO + if (strncmp(buf, "modify ", 7) == 0) { + // modify , + char *end_ptr_1 = NULL, *end_ptr_2 = NULL; + long val_1 = strtol(buf + 7, &end_ptr_1, 0); + long val_2 = 0; + if (end_ptr_1 != NULL) val_2 = strtol(end_ptr_1 + 1, &end_ptr_2, 0); + if (end_ptr_1 != NULL && end_ptr_1[0] == ',' && end_ptr_1 != buf + 7 && end_ptr_2 != NULL && end_ptr_2[0] == 0 && end_ptr_2 != end_ptr_1 + 1) { + nmemb = val_1; + size = val_2; + } else { + fprintf(stderr, "intercept: calloc: invalid args in modify command: '%s'\n", buf + 7); + } + } else if (strncmp(buf, "return ", 7) == 0) { + // return + char *end_ptr = NULL; + long val = strtol(buf + 7, &end_ptr, 0); + if (end_ptr != NULL && end_ptr[0] == 0 && end_ptr != buf + 7) { + msg("return %p", val); + return (void *)val; + } else { + fprintf(stderr, "intercept: calloc: invalid args in return command: '%s'\n", buf + 7); + } + } else if (strncmp(buf, "fail ", 5) == 0) { + // fail + if (strcmp(buf + 5, "ENOMEM") == 0) { + errno = ENOMEM; + } else { + errno = 0; + fprintf(stderr, "intercept: calloc: invalid error code in fail command: '%s'\n", buf + 5); + } + msg("return %p", NULL); + return NULL; + } else if (strcmp(buf, "ok") != 0) { + fprintf(stderr, "intercept: calloc: invalid command: '%s'\n", buf); + } } void *ret = __real_calloc(nmemb, size); msg("return %p", ret); @@ -310,20 +347,121 @@ void *__sym(realloc)(void *ptr, size_t size) { if (mode >= 4) { char buf[256]; rcv(buf, sizeof(buf)); - // TODO + if (strncmp(buf, "modify ", 7) == 0) { + // modify , + char *end_ptr_1 = NULL, *end_ptr_2 = NULL; + long val_1 = strtol(buf + 7, &end_ptr_1, 0); + long val_2 = 0; + if (end_ptr_1 != NULL) val_2 = strtol(end_ptr_1 + 1, &end_ptr_2, 0); + if (end_ptr_1 != NULL && end_ptr_1[0] == ',' && end_ptr_1 != buf + 7 && + end_ptr_2 != NULL && end_ptr_2[0] == 0 && end_ptr_2 != end_ptr_1 + 1) { + ptr = (void *)val_1; + size = val_2; + } else { + fprintf(stderr, "intercept: realloc: invalid args in modify command: '%s'\n", buf + 7); + } + } else if (strncmp(buf, "return ", 7) == 0) { + // return + char *end_ptr = NULL; + long val = strtol(buf + 7, &end_ptr, 0); + if (end_ptr != NULL && end_ptr[0] == 0 && end_ptr != buf + 7) { + msg("return %p", val); + return (void *)val; + } else { + fprintf(stderr, "intercept: realloc: invalid args in return command: '%s'\n", buf + 7); + } + } else if (strncmp(buf, "fail ", 5) == 0) { + // fail + if (strcmp(buf + 5, "ENOMEM") == 0) { + errno = ENOMEM; + } else { + errno = 0; + fprintf(stderr, "intercept: realloc: invalid error code in fail command: '%s'\n", buf + 5); + } + msg("return %p", NULL); + return NULL; + } else if (strcmp(buf, "ok") != 0) { + fprintf(stderr, "intercept: realloc: invalid command: '%s'\n", buf); + } } void *ret = __real_realloc(ptr, size); msg("return %p", ret); return ret; } +void *__sym(reallocarray)(void *ptr, size_t nmemb, size_t size) { + init(); + msg("reallocarray(%p, %li)", ptr, size); + if (mode >= 4) { + char buf[256]; + rcv(buf, sizeof(buf)); + if (strncmp(buf, "modify ", 7) == 0) { + // modify ,, + char *end_ptr_1 = NULL, *end_ptr_2 = NULL, *end_ptr_3; + long val_1 = strtol(buf + 7, &end_ptr_1, 0); + long val_2 = 0, val_3 = 0; + if (end_ptr_1 != NULL) val_2 = strtol(end_ptr_1 + 1, &end_ptr_2, 0); + if (end_ptr_2 != NULL) val_3 = strtol(end_ptr_2 + 1, &end_ptr_3, 0); + if (end_ptr_1 != NULL && end_ptr_1[0] == ',' && end_ptr_1 != buf + 7 && + end_ptr_2 != NULL && end_ptr_2[0] == ',' && end_ptr_2 != end_ptr_1 + 1 && + end_ptr_3 != NULL && end_ptr_3[0] == 0 && end_ptr_3 != end_ptr_2 + 1) { + ptr = (void *)val_1; + nmemb = val_2; + size = val_3; + } else { + fprintf(stderr, "intercept: reallocarray: invalid args in modify command: '%s'\n", buf + 7); + } + } else if (strncmp(buf, "return ", 7) == 0) { + // return + char *end_ptr = NULL; + long val = strtol(buf + 7, &end_ptr, 0); + if (end_ptr != NULL && end_ptr[0] == 0 && end_ptr != buf + 7) { + msg("return %p", val); + return (void *)val; + } else { + fprintf(stderr, "intercept: reallocarray: invalid args in return command: '%s'\n", buf + 7); + } + } else if (strncmp(buf, "fail ", 5) == 0) { + // fail + if (strcmp(buf + 5, "ENOMEM") == 0) { + errno = ENOMEM; + } else { + errno = 0; + fprintf(stderr, "intercept: reallocarray: invalid error code in fail command: '%s'\n", buf + 5); + } + msg("return %p", NULL); + return NULL; + } else if (strcmp(buf, "ok") != 0) { + fprintf(stderr, "intercept: reallocarray: invalid command: '%s'\n", buf); + } + } + void *ret = __real_reallocarray(ptr, nmemb, size); + msg("return %p", ret); + return ret; +} + void __sym(free)(void *ptr) { init(); msg("free(%p)", ptr); if (mode >= 4) { char buf[256]; rcv(buf, sizeof(buf)); - // TODO + if (strncmp(buf, "modify ", 7) == 0) { + // modify + char *end_ptr = NULL; + long val = strtol(buf + 7, &end_ptr, 0); + if (end_ptr != NULL && end_ptr[0] == 0 && end_ptr != buf + 7) { + ptr = (void *)val; + } else { + fprintf(stderr, "intercept: free: invalid args in modify command: '%s'\n", buf + 7); + } + } else if (strcmp(buf, "return") == 0) { + // return + msg("return"); + return; + } else if (strcmp(buf, "ok") != 0) { + fprintf(stderr, "intercept: free: invalid command: '%s'\n", buf); + } } __real_free(ptr); msg("return"); @@ -335,9 +473,25 @@ int __sym(getopt)(const int argc, char *const argv[], const char *shortopts) { if (mode >= 4) { char buf[256]; rcv(buf, sizeof(buf)); - // TODO + if (strncmp(buf, "modify ", 7) == 0) { + // modify ,, + // TODO getopt modify + fprintf(stderr, "intercept: getopt: modify command not implemented\n"); + } else if (strncmp(buf, "return ", 7) == 0) { + // return + char *end_ptr = NULL; + long val = strtol(buf + 7, &end_ptr, 0); + if (end_ptr != NULL && end_ptr[0] == 0 && end_ptr != buf + 7) { + msg("return %i", val); + return (int)val; + } else { + fprintf(stderr, "intercept: getopt: invalid args in return command: '%s'\n", buf + 7); + } + } else if (strcmp(buf, "ok") != 0) { + fprintf(stderr, "intercept: getopt: invalid command: '%s'\n", buf); + } } - int ret = __real_getopt(argc, argv, shortopts); + const int ret = __real_getopt(argc, argv, shortopts); msg("return %i", ret); return ret; }