proj: Implement TODOs in memory mgmt functions
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 <nmemb>,<size>
|
||||
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 <ptr>
|
||||
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 <error>
|
||||
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 <ptr>,<size>
|
||||
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 <ptr>
|
||||
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 <error>
|
||||
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 <ptr>,<nmemb>,<size>
|
||||
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 <ptr>
|
||||
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 <error>
|
||||
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 <ptr>
|
||||
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 <argc>,<argv>,<shortopts>
|
||||
// TODO getopt modify
|
||||
fprintf(stderr, "intercept: getopt: modify command not implemented\n");
|
||||
} else if (strncmp(buf, "return ", 7) == 0) {
|
||||
// return <chr>
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user