forked from OSchip/llvm-project
[compiler-rt] Fix the prototype of ioctl interceptor
The interceptor of ioctl is using a non-standard prototype: INTERCEPTOR(int, ioctl, int d, unsigned request, void *arg) At least on OS X, the request argument should be unsigned long and not just unsigned, and also instead of the last argument (arg), the function should be accepting a variable number of arguments, so the prototype should be: int ioctl(int fildes, unsigned long request, ...); We can still keep using `unsigned` internally to save space, because we know that all possible values of `request` will fit into it. Reviewed at http://reviews.llvm.org/D7038 llvm-svn: 226926
This commit is contained in:
parent
6b7156b74d
commit
f1397fa7d7
|
@ -1028,8 +1028,12 @@ FORMAT_INTERCEPTOR_IMPL(__isoc99_snprintf, __isoc99_vsnprintf, str, size,
|
|||
|
||||
#if SANITIZER_INTERCEPT_IOCTL
|
||||
#include "sanitizer_common_interceptors_ioctl.inc"
|
||||
INTERCEPTOR(int, ioctl, int d, unsigned request, void *arg) {
|
||||
INTERCEPTOR(int, ioctl, int d, unsigned long request, ...) {
|
||||
void *ctx;
|
||||
va_list ap;
|
||||
va_start(ap, request);
|
||||
void *arg = va_arg(ap, void *);
|
||||
va_end(ap);
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, ioctl, d, request, arg);
|
||||
|
||||
CHECK(ioctl_initialized);
|
||||
|
@ -1038,6 +1042,10 @@ INTERCEPTOR(int, ioctl, int d, unsigned request, void *arg) {
|
|||
// This effectively disables ioctl handling in TSan.
|
||||
if (!common_flags()->handle_ioctl) return REAL(ioctl)(d, request, arg);
|
||||
|
||||
// Although request is unsigned long, the rest of the interceptor uses it
|
||||
// as just "unsigned" to save space, because we know that all values fit in
|
||||
// "unsigned" - they are compile-time constants.
|
||||
|
||||
const ioctl_desc *desc = ioctl_lookup(request);
|
||||
ioctl_desc decoded_desc;
|
||||
if (!desc) {
|
||||
|
|
Loading…
Reference in New Issue