14612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//===-- sanitizer_ioctl_test.cc -------------------------------------------===//
24612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//
34612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//                     The LLVM Compiler Infrastructure
44612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//
54612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov// This file is distributed under the University of Illinois Open Source
64612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov// License. See LICENSE.TXT for details.
74612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//
84612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//===----------------------------------------------------------------------===//
94612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//
104612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov// Tests for ioctl interceptor implementation in sanitizer_common.
114612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//
124612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov//===----------------------------------------------------------------------===//
134612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
144612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "sanitizer_common/sanitizer_platform.h"
154612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#if SANITIZER_LINUX
164612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
174612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include <linux/input.h>
184612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include <vector>
194612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
204612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "interception/interception.h"
214612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "sanitizer_test_utils.h"
224612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "sanitizer_common/sanitizer_platform_limits_posix.h"
234612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "sanitizer_common/sanitizer_common.h"
244612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "gtest/gtest.h"
254612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
264612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
274612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanovusing namespace __sanitizer;
284612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
294612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, sz) \
304612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  do {                                              \
314612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    (void) ctx;                                     \
324612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    (void) ptr;                                     \
334612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    (void) sz;                                      \
344612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  } while (0)
354612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, sz) \
364612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  do {                                               \
374612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    (void) ctx;                                      \
384612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    (void) ptr;                                      \
394612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    (void) sz;                                       \
404612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  } while (0)
414612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
424612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#include "sanitizer_common/sanitizer_common_interceptors_ioctl.inc"
434612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
444612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanovstatic struct IoctlInit {
45851e22ad83fe5f389ca845731fe0abf749a86214Evgeniy Stepanov  IoctlInit() {
46851e22ad83fe5f389ca845731fe0abf749a86214Evgeniy Stepanov    ioctl_init();
47851e22ad83fe5f389ca845731fe0abf749a86214Evgeniy Stepanov    // Avoid unused function warnings.
48851e22ad83fe5f389ca845731fe0abf749a86214Evgeniy Stepanov    (void)&ioctl_common_pre;
49851e22ad83fe5f389ca845731fe0abf749a86214Evgeniy Stepanov    (void)&ioctl_common_post;
502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    (void)&ioctl_decode;
51851e22ad83fe5f389ca845731fe0abf749a86214Evgeniy Stepanov  }
524612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov} ioctl_static_initializer;
534612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
544612abac2e172e077246cec0fcbed291f55a1d02Evgeniy StepanovTEST(SanitizerIoctl, Fixup) {
554612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ((unsigned)FIONBIO, ioctl_request_fixup(FIONBIO));
564612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
574612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(0, 16)));
584612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(1, 16)));
594612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(1, 17)));
604612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(31, 16)));
614612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_NE(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(32, 16)));
624612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
634612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(0)));
644612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(5)));
654612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(63)));
664612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_NE(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(64)));
674612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
684612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(0)));
694612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(5)));
704612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(63)));
714612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_NE(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(64)));
724612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
734612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  const ioctl_desc *desc = ioctl_lookup(EVIOCGKEY(16));
744612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_NE((void *)0, desc);
754612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  EXPECT_EQ(EVIOCGKEY(0), desc->req);
764612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov}
774612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
785d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Test decoding KVM ioctl numbers.
795d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(SanitizerIoctl, KVM_GET_MP_STATE) {
805d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  ioctl_desc desc;
815d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  bool res = ioctl_decode(0x8004ae98U, &desc);
825d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_TRUE(res);
835d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(ioctl_desc::WRITE, desc.type);
845d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(4U, desc.size);
855d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
865d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
875d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(SanitizerIoctl, KVM_GET_LAPIC) {
885d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  ioctl_desc desc;
895d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  bool res = ioctl_decode(0x8400ae8eU, &desc);
905d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_TRUE(res);
915d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(ioctl_desc::WRITE, desc.type);
925d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(1024U, desc.size);
935d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
945d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
955d71de26cedae3dafc17449fe0182045c0bd20e8Stephen HinesTEST(SanitizerIoctl, KVM_GET_MSR_INDEX_LIST) {
965d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  ioctl_desc desc;
975d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  bool res = ioctl_decode(0xc004ae02U, &desc);
985d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_TRUE(res);
995d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(ioctl_desc::READWRITE, desc.type);
1005d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  EXPECT_EQ(4U, desc.size);
1015d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
1025d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
1034612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov#endif // SANITIZER_LINUX
104