1
0

proj: Implement ftruncate

This commit is contained in:
2025-03-02 11:46:32 +01:00
parent cf71b7b9d1
commit d85f506a8d
3 changed files with 44 additions and 5 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}