107 lines · cpp
1//===-- sanitizer_ioctl_test.cpp ------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Tests for ioctl interceptor implementation in sanitizer_common.10//11//===----------------------------------------------------------------------===//12 13#include "sanitizer_common/sanitizer_platform.h"14#if SANITIZER_LINUX15 16#include <linux/input.h>17#include <vector>18 19#include "interception/interception.h"20#include "sanitizer_test_utils.h"21#include "sanitizer_common/sanitizer_platform_limits_posix.h"22#include "sanitizer_common/sanitizer_common.h"23#include "gtest/gtest.h"24 25 26using namespace __sanitizer;27 28#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, sz) \29 do { \30 (void) ctx; \31 (void) ptr; \32 (void) sz; \33 } while (0)34#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, sz) \35 do { \36 (void) ctx; \37 (void) ptr; \38 (void) sz; \39 } while (0)40 41#include "sanitizer_common/sanitizer_common_interceptors_ioctl.inc"42 43static struct IoctlInit {44 IoctlInit() {45 ioctl_init();46 // Avoid unused function warnings.47 (void)&ioctl_common_pre;48 (void)&ioctl_common_post;49 (void)&ioctl_decode;50 }51} ioctl_static_initializer;52 53TEST(SanitizerIoctl, Fixup) {54 EXPECT_EQ((unsigned)FIONBIO, ioctl_request_fixup(FIONBIO));55 56 EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(0, 16)));57 EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(1, 16)));58 EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(1, 17)));59 EXPECT_EQ(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(31, 16)));60 EXPECT_NE(EVIOCGBIT(0, 0), ioctl_request_fixup(EVIOCGBIT(32, 16)));61 62 EXPECT_EQ(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(0)));63 EXPECT_EQ(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(5)));64 EXPECT_EQ(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(63)));65 EXPECT_NE(EVIOCGABS(0), ioctl_request_fixup(EVIOCGABS(64)));66 67 EXPECT_EQ(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(0)));68 EXPECT_EQ(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(5)));69 EXPECT_EQ(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(63)));70 EXPECT_NE(EVIOCSABS(0), ioctl_request_fixup(EVIOCSABS(64)));71 72 const ioctl_desc *desc = ioctl_lookup(EVIOCGKEY(16));73 EXPECT_NE((void *)0, desc);74 EXPECT_EQ(EVIOCGKEY(0), desc->req);75}76 77// Test decoding KVM ioctl numbers.78TEST(SanitizerIoctl, KVM_GET_MP_STATE) {79 ioctl_desc desc;80 unsigned int desc_value =81 SANITIZER_MIPS || SANITIZER_SPARC ? 0x4004ae98U : 0x8004ae98U;82 bool res = ioctl_decode(desc_value, &desc);83 EXPECT_TRUE(res);84 EXPECT_EQ(ioctl_desc::WRITE, desc.type);85 EXPECT_EQ(4U, desc.size);86}87 88TEST(SanitizerIoctl, KVM_GET_LAPIC) {89 ioctl_desc desc;90 unsigned int desc_value =91 SANITIZER_MIPS || SANITIZER_SPARC ? 0x4400ae8eU : 0x8400ae8eU;92 bool res = ioctl_decode(desc_value, &desc);93 EXPECT_TRUE(res);94 EXPECT_EQ(ioctl_desc::WRITE, desc.type);95 EXPECT_EQ(1024U, desc.size);96}97 98TEST(SanitizerIoctl, KVM_GET_MSR_INDEX_LIST) {99 ioctl_desc desc;100 bool res = ioctl_decode(0xc004ae02U, &desc);101 EXPECT_TRUE(res);102 EXPECT_EQ(ioctl_desc::READWRITE, desc.type);103 EXPECT_EQ(4U, desc.size);104}105 106#endif // SANITIZER_LINUX107