proj: Implement ftruncate
This commit is contained in:
@@ -300,16 +300,21 @@ class Handler(StreamRequestHandler):
|
|||||||
def after_shm_unlink(self, name: PointerTo[bytes],
|
def after_shm_unlink(self, name: PointerTo[bytes],
|
||||||
ret_value: int, errno: str = None) -> None:
|
ret_value: int, errno: str = None) -> None:
|
||||||
raise NotImplementedError()
|
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()
|
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:
|
ret_value: Pointer, errno: str = None) -> None:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
def before_munmap(self, addr: Pointer, len_value: int) -> str:
|
def before_munmap(self, addr: Pointer, length: int) -> str:
|
||||||
raise NotImplementedError()
|
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:
|
ret_value: int, errno: str = None) -> None:
|
||||||
raise NotImplementedError()
|
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):
|
class MemoryAllocationTester(Handler):
|
||||||
@@ -393,6 +398,7 @@ class InterruptedCheckTester(Handler):
|
|||||||
'sem_trywait': ('fail EINTR', 'return 0'),
|
'sem_trywait': ('fail EINTR', 'return 0'),
|
||||||
'sem_timedwait': ('fail EINTR', 'return 0'),
|
'sem_timedwait': ('fail EINTR', 'return 0'),
|
||||||
'sem_post': (None, 'return 0'),
|
'sem_post': (None, 'return 0'),
|
||||||
|
'ftruncate': ('fail EINTR', 'ok'),
|
||||||
}
|
}
|
||||||
|
|
||||||
counter: int = 0
|
counter: int = 0
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ main: bin/main.o
|
|||||||
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=reallocarray,--wrap=getopt,--wrap=exit,--wrap=close,--wrap=sigaction,\
|
$(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=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:
|
clean:
|
||||||
rm -rf main main_wrapped bin/* *.so *.ko *.o
|
rm -rf main main_wrapped bin/* *.so *.ko *.o
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ static int (*__real_shm_open)(const char *, int, mode_t);
|
|||||||
static int (*__real_shm_unlink)(const char *);
|
static int (*__real_shm_unlink)(const char *);
|
||||||
static void *(*__real_mmap)(void *, size_t, int, int, int, off_t);
|
static void *(*__real_mmap)(void *, size_t, int, int, int, off_t);
|
||||||
static int (*__real_munmap)(void *, size_t);
|
static int (*__real_munmap)(void *, size_t);
|
||||||
|
extern int (*__real_ftruncate)(int, off_t);
|
||||||
#define load(name) \
|
#define load(name) \
|
||||||
if (((__real_ ## name) = dlsym(RTLD_NEXT, #name)) == NULL) { \
|
if (((__real_ ## name) = dlsym(RTLD_NEXT, #name)) == NULL) { \
|
||||||
fprintf(stderr, "intercept: unable to load symbol '%s': %s", #name, strerror(errno)); \
|
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 int __real_shm_unlink(const char *);
|
||||||
extern void *__real_mmap(void *, size_t, int, int, int, off_t);
|
extern void *__real_mmap(void *, size_t, int, int, int, off_t);
|
||||||
extern int __real_munmap(void *, size_t);
|
extern int __real_munmap(void *, size_t);
|
||||||
|
extern int __real_ftruncate(int, off_t);
|
||||||
#define sym(name) __wrap_ ## name
|
#define sym(name) __wrap_ ## name
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -210,6 +212,19 @@ extern int __real_munmap(void *, size_t);
|
|||||||
msg("return %i; errno %s", -1, strerrorname_np(errno)); \
|
msg("return %i; errno %s", -1, strerrorname_np(errno)); \
|
||||||
return -1; }
|
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) { \
|
#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; \
|
if (strcmp(buf + 5, #err1) == 0) { errno = err1; \
|
||||||
} else if (strcmp(buf + 5, #err2) == 0) { errno = err2; \
|
} else if (strcmp(buf + 5, #err2) == 0) { errno = err2; \
|
||||||
@@ -504,6 +519,7 @@ static void init(void) {
|
|||||||
load(shm_unlink);
|
load(shm_unlink);
|
||||||
load(mmap);
|
load(mmap);
|
||||||
load(munmap);
|
load(munmap);
|
||||||
|
load(ftruncate);
|
||||||
#endif
|
#endif
|
||||||
atexit(fin);
|
atexit(fin);
|
||||||
const char *val = getenv("INTERCEPT");
|
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));
|
msg("return %i; errno %s", ret, strerrorname_np(errno));
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user