diff --git a/proj/server/src/intercept.py b/proj/server/src/intercept.py index 2431243..b8a7b30 100755 --- a/proj/server/src/intercept.py +++ b/proj/server/src/intercept.py @@ -300,16 +300,21 @@ class Handler(StreamRequestHandler): def after_shm_unlink(self, name: PointerTo[bytes], ret_value: int, errno: str = None) -> None: raise NotImplementedError() - def before_mmap(self, addr: Pointer, len_value: int, prot: Flags, flags: Flags, fildes: int, off: int) -> str: + def before_mmap(self, addr: Pointer, length: int, prot: Flags, flags: Flags, fildes: int, off: int) -> str: raise NotImplementedError() - def after_mmap(self, addr: Pointer, len_value: int, prot: Flags, flags: Flags, fildes: int, off: int, + def after_mmap(self, addr: Pointer, length: int, prot: Flags, flags: Flags, fildes: int, off: int, ret_value: Pointer, errno: str = None) -> None: raise NotImplementedError() - def before_munmap(self, addr: Pointer, len_value: int) -> str: + def before_munmap(self, addr: Pointer, length: int) -> str: raise NotImplementedError() - def after_munmap(self, addr: Pointer, len_value: int, + def after_munmap(self, addr: Pointer, length: int, ret_value: int, errno: str = None) -> None: raise NotImplementedError() + def before_ftruncate(self, fildes: int, length: int) -> str: + raise NotImplementedError() + def after_ftruncate(self, fildes: int, length: int, + ret_value: int, errno: str = None) -> None: + raise NotImplementedError() class MemoryAllocationTester(Handler): @@ -393,6 +398,7 @@ class InterruptedCheckTester(Handler): 'sem_trywait': ('fail EINTR', 'return 0'), 'sem_timedwait': ('fail EINTR', 'return 0'), 'sem_post': (None, 'return 0'), + 'ftruncate': ('fail EINTR', 'ok'), } counter: int = 0 diff --git a/proj/test1/Makefile b/proj/test1/Makefile index 16edf24..892a803 100644 --- a/proj/test1/Makefile +++ b/proj/test1/Makefile @@ -27,7 +27,8 @@ main: bin/main.o main_intercept: bin/main.o src/intercept.c $(CC) -o $@ $^ $(CFLAGS) -lc -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=realloc,--wrap=reallocarray,--wrap=getopt,--wrap=exit,--wrap=close,--wrap=sigaction,\ --wrap=sem_init,--wrap=sem_open,--wrap=sem_post,--wrap=sem_wait,--wrap=sem_trywait,--wrap=sem_timedwait,--wrap=sem_getvalue,--wrap=sem_close,--wrap=sem_unlink,--wrap=sem_destroy,\ ---wrap=shm_open,--wrap=shm_unlink,--wrap=mmap,--wrap=munmap +--wrap=shm_open,--wrap=shm_unlink,--wrap=mmap,--wrap=munmap,\ +--wrap=ftruncate 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 a5130fe..c2a198f 100644 --- a/proj/test1/src/intercept.c +++ b/proj/test1/src/intercept.c @@ -45,6 +45,7 @@ static int (*__real_shm_open)(const char *, int, mode_t); static int (*__real_shm_unlink)(const char *); static void *(*__real_mmap)(void *, size_t, int, int, int, off_t); static int (*__real_munmap)(void *, size_t); +extern int (*__real_ftruncate)(int, off_t); #define load(name) \ if (((__real_ ## name) = dlsym(RTLD_NEXT, #name)) == NULL) { \ fprintf(stderr, "intercept: unable to load symbol '%s': %s", #name, strerror(errno)); \ @@ -75,6 +76,7 @@ extern int __real_shm_open(const char *, int, mode_t); extern int __real_shm_unlink(const char *); extern void *__real_mmap(void *, size_t, int, int, int, off_t); extern int __real_munmap(void *, size_t); +extern int __real_ftruncate(int, off_t); #define sym(name) __wrap_ ## name #endif @@ -210,6 +212,19 @@ extern int __real_munmap(void *, size_t); msg("return %i; errno %s", -1, strerrorname_np(errno)); \ return -1; } +#define if_error_5_int_errno(name, err1, err2, err3, err4, err5) if (strncmp(buf, "fail ", 5) == 0) { \ + if (strcmp(buf + 5, #err1) == 0) { errno = err1; \ + } else if (strcmp(buf + 5, #err2) == 0) { errno = err2; \ + } else if (strcmp(buf + 5, #err3) == 0) { errno = err3; \ + } else if (strcmp(buf + 5, #err4) == 0) { errno = err4; \ + } else if (strcmp(buf + 5, #err5) == 0) { errno = err5; \ + } else { \ + errno = 0; \ + fprintf(stderr, "intercept: %s: invalid error code in fail command: '%s'\n", #name, buf + 5); \ + } \ + msg("return %i; errno %s", -1, strerrorname_np(errno)); \ + return -1; } + #define if_error_7_int_errno(name, err1, err2, err3, err4, err5, err6, err7) if (strncmp(buf, "fail ", 5) == 0) { \ if (strcmp(buf + 5, #err1) == 0) { errno = err1; \ } else if (strcmp(buf + 5, #err2) == 0) { errno = err2; \ @@ -504,6 +519,7 @@ static void init(void) { load(shm_unlink); load(mmap); load(munmap); + load(ftruncate); #endif atexit(fin); const char *val = getenv("INTERCEPT"); @@ -1206,3 +1222,19 @@ int sym(munmap)(void *addr, size_t len) { msg("return %i; errno %s", ret, strerrorname_np(errno)); return ret; } + +int sym(ftruncate)(int fildes, off_t length) { + init(); + msg("ftruncate(%i, %i): %p", fildes, length); + if (mode >= 4) { + char buf[BUFFER_SIZE]; + rcv(buf, sizeof(buf)); + if_modify_int_int(ftruncate, int, fildes, off_t, length) + else if_return_int_errno(ftruncate) + else if_error_5_int_errno(ftruncate, EINTR, EINVAL, EFBIG, EIO, EBADF) + else if_invalid(ftruncate) + } + const int ret = __real_ftruncate(fildes, length); + msg("return %i; errno %s", ret, strerrorname_np(errno)); + return ret; +}