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