summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-06-07 15:49:38 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-06-07 15:49:38 +0000
commit4757c47ba7356aec3a7d49e5e929c19159d75a01 (patch)
treed2ba3525d2e527df355d8fe6b000452fd6e0179c /lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
parentea1b27f1dad287b33784b7e8c032182b5b0ddd18 (diff)
downloadcompiler-rt-4757c47ba7356aec3a7d49e5e929c19159d75a01.tar.gz
[sanitizer] Handle SIOCGIFCONF ioctl.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@183529 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc')
-rwxr-xr-xlib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc19
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
index 1de59e723..16b07380b 100755
--- a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+++ b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
@@ -66,7 +66,7 @@ static void ioctl_table_fill() {
_(0x00008903, WRITE, sizeof(int)); // FIOGETOWN
_(0x00008904, WRITE, sizeof(int)); // SIOCGPGRP
_(0x00008905, WRITE, sizeof(int)); // SIOCATMAR
- _(0x00008912, WRITE, struct_ifconf_sz); // SIOCGIFCONF
+ _(0x00008912, CUSTOM, 0); // SIOCGIFCONF
_(0x00008913, WRITE, struct_ifreq_sz); // SIOCGIFFLAGS
_(0x00008914, READ, struct_ifreq_sz); // SIOCSIFFLAGS
_(0x00008915, WRITE, struct_ifreq_sz); // SIOCGIFADDR
@@ -502,7 +502,13 @@ static void ioctl_common_pre(void *ctx, const ioctl_desc *desc, int d,
COMMON_INTERCEPTOR_READ_RANGE(ctx, arg, desc->size);
if (desc->type != ioctl_desc::CUSTOM)
return;
- // FIXME: add some ioctls of "CUSTOM" type and handle them here.
+ switch (request) {
+ case 0x00008912: { // SIOCGIFCONF
+ struct __sanitizer_ifconf *ifc = (__sanitizer_ifconf *)arg;
+ COMMON_INTERCEPTOR_READ_RANGE(ctx, &ifc->ifc_len, sizeof(ifc->ifc_len));
+ break;
+ }
+ }
return;
}
@@ -514,5 +520,12 @@ static void ioctl_common_post(void *ctx, const ioctl_desc *desc, int res, int d,
}
if (desc->type != ioctl_desc::CUSTOM)
return;
- return; // FIXME
+ switch (request) {
+ case 0x00008912: { // SIOCGIFCONF
+ struct __sanitizer_ifconf *ifc = (__sanitizer_ifconf *)arg;
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ifc->ifc_ifcu.ifcu_req, ifc->ifc_len);
+ break;
+ }
+ }
+ return;
}