1
0

proj: Implement TODOs in memory mgmt functions

This commit is contained in:
2025-02-05 11:34:28 +01:00
parent 71681ee9a7
commit 9104c555eb
2 changed files with 160 additions and 6 deletions

View File

@@ -25,7 +25,7 @@ main: bin/main.o
$(CC) -o $@ $^ $(CFLAGS) -lc $(CC) -o $@ $^ $(CFLAGS) -lc
main_intercept: bin/main.o src/intercept.c 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: clean:
rm -rf main main_wrapped bin/* *.so *.ko *.o rm -rf main main_wrapped bin/* *.so *.ko *.o

View File

@@ -17,6 +17,7 @@
static void *(*__real_malloc)(size_t); static void *(*__real_malloc)(size_t);
static void *(*__real_calloc)(size_t, size_t); static void *(*__real_calloc)(size_t, size_t);
static void *(*__real_realloc)(void *, size_t); static void *(*__real_realloc)(void *, size_t);
static void *(*__real_reallocarray)(void *, size_t, size_t);
static void (*__real_free)(void *); static void (*__real_free)(void *);
static int (*__real_getopt)(int, char *const [], const char *); static int (*__real_getopt)(int, char *const [], const char *);
#define __load(var, name) \ #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_malloc(size_t);
extern void *__real_calloc(size_t, size_t); extern void *__real_calloc(size_t, size_t);
extern void *__real_realloc(void *, size_t); extern void *__real_realloc(void *, size_t);
extern void *__real_reallocarray(void *, size_t, size_t);
extern void __real_free(void *); extern void __real_free(void *);
extern int __real_getopt(int, char *const [], const char *); extern int __real_getopt(int, char *const [], const char *);
#define __sym(name) __wrap_ ## name #define __sym(name) __wrap_ ## name
@@ -197,6 +199,7 @@ static void init(void) {
__load(__real_malloc, "malloc"); __load(__real_malloc, "malloc");
__load(__real_calloc, "calloc"); __load(__real_calloc, "calloc");
__load(__real_realloc, "realloc"); __load(__real_realloc, "realloc");
__load(__real_reallocarray, "reallocarray");
__load(__real_free, "free"); __load(__real_free, "free");
__load(__real_getopt, "getopt"); __load(__real_getopt, "getopt");
#endif #endif
@@ -297,7 +300,41 @@ void *__sym(calloc)(size_t nmemb, size_t size) {
if (mode >= 4) { if (mode >= 4) {
char buf[256]; char buf[256];
rcv(buf, sizeof(buf)); 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); void *ret = __real_calloc(nmemb, size);
msg("return %p", ret); msg("return %p", ret);
@@ -310,20 +347,121 @@ void *__sym(realloc)(void *ptr, size_t size) {
if (mode >= 4) { if (mode >= 4) {
char buf[256]; char buf[256];
rcv(buf, sizeof(buf)); 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); void *ret = __real_realloc(ptr, size);
msg("return %p", ret); msg("return %p", ret);
return 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) { void __sym(free)(void *ptr) {
init(); init();
msg("free(%p)", ptr); msg("free(%p)", ptr);
if (mode >= 4) { if (mode >= 4) {
char buf[256]; char buf[256];
rcv(buf, sizeof(buf)); 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); __real_free(ptr);
msg("return"); msg("return");
@@ -335,9 +473,25 @@ int __sym(getopt)(const int argc, char *const argv[], const char *shortopts) {
if (mode >= 4) { if (mode >= 4) {
char buf[256]; char buf[256];
rcv(buf, sizeof(buf)); 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); msg("return %i", ret);
return ret; return ret;
} }