>From eaa3e3f66d9b12d90e406f6af720306d2dd1af18 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 2 Sep 2014 09:47:00 +1200 Subject: [PATCH 2/2] TODO uid_wrapper: Wrap some xattr syscalls, which are called from libattr so get caught by the LD_PRELOAD We need to wrap all these in the end, as otherwise AddressSanitizer aborts. The abort is due to us reading below the current stack frame, because it passes in 7 arguments, which may not actually have been passed in. The additional issue is that it is assumed that the arguments to us were passed in as integers, or variables placed in the function call ABI in a way compatible with integers. As an extreme example, if a float was passed, my understandin is that this emulation would not be correct. Andrew Bartlett Change-Id: Iaacfa9b3fa926956abb54bad0f810bb2a65d231d Signed-off-by: Andrew Bartlett --- lib/uid_wrapper/uid_wrapper.c | 96 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/lib/uid_wrapper/uid_wrapper.c b/lib/uid_wrapper/uid_wrapper.c index 2181767..40bf458 100644 --- a/lib/uid_wrapper/uid_wrapper.c +++ b/lib/uid_wrapper/uid_wrapper.c @@ -464,6 +464,80 @@ static long int libc_vsyscall(long int sysno, va_list va) return rc; } + +/* setxattr and lsetxattr */ +static long int libc_setxattr_vsyscall(long int sysno, va_list va) +{ + long int rc; + + const char *path = va_arg(va, const char *); + const char *name = va_arg(va, const char *); + void *value = va_arg(va, void *); + size_t size = va_arg(va, size_t); + int flags = va_arg(va, int); + uwrap_load_lib_function(UWRAP_LIBC, syscall); + + rc = uwrap.libc.fns._libc_syscall(sysno, + path, name, + value, size, flags); + + return rc; +} + +static long int libc_fgetxattr_vsyscall(long int sysno, va_list va) +{ + long int rc; + + int fd = va_arg(va, int); + const char *name = va_arg(va, const char *); + void *value = va_arg(va, void *); + size_t size = va_arg(va, size_t); + uwrap_load_lib_function(UWRAP_LIBC, syscall); + + rc = uwrap.libc.fns._libc_syscall(sysno, + fd, name, + value, size); + + return rc; +} + +/* setxattr and lsetxattr */ +static long int libc_fsetxattr_vsyscall(long int sysno, va_list va) +{ + long int rc; + + int fd = va_arg(va, int); + const char *name = va_arg(va, const char *); + void *value = va_arg(va, void *); + size_t size = va_arg(va, size_t); + int flags = va_arg(va, int); + uwrap_load_lib_function(UWRAP_LIBC, syscall); + + rc = uwrap.libc.fns._libc_syscall(sysno, + fd, name, + value, size, flags); + + return rc; +} + +/* getxattr and lgetxattr */ +static long int libc_getxattr_vsyscall(long int sysno, va_list va) +{ + long int rc; + + const char *path = va_arg(va, const char *); + const char *name = va_arg(va, const char *); + void *value = va_arg(va, void *); + size_t size = va_arg(va, size_t); + uwrap_load_lib_function(UWRAP_LIBC, syscall); + + rc = uwrap.libc.fns._libc_syscall(sysno, + path, name, + value, size); + + return rc; +} + #endif /********************************************************* @@ -1194,6 +1268,28 @@ static long int uwrap_syscall (long int sysno, va_list vp) rc = uwrap_setgroups_thread(size, list); } break; +#if (defined(SYS_setxattr) && defined(SYS_lsetxattr)) + case SYS_setxattr: + case SYS_lsetxattr: + rc = libc_setxattr_vsyscall(sysno, vp); + break; +#endif +#if (defined(SYS_getxattr) && defined(SYS_lgetxattr)) + case SYS_getxattr: + case SYS_lgetxattr: + rc = libc_getxattr_vsyscall(sysno, vp); + break; +#endif +#ifdef SYS_fsetxattr + case SYS_fsetxattr: + rc = libc_fsetxattr_vsyscall(sysno, vp); + break; +#endif +#ifdef SYS_fgetxattr + case SYS_fgetxattr: + rc = libc_fgetxattr_vsyscall(sysno, vp); + break; +#endif default: UWRAP_LOG(UWRAP_LOG_DEBUG, "UID_WRAPPER calling non-wrapped syscall %lu\n", -- 2.1.0