hanchenye-llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_intercepto...

532 lines
30 KiB
C++
Executable File

//===-- sanitizer_common_interceptors_ioctl.inc -----------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Ioctl handling in common sanitizer interceptors.
//===----------------------------------------------------------------------===//
#include "sanitizer_flags.h"
struct ioctl_desc {
unsigned req;
// FIXME: support read+write arguments. Those are currently marked as WRITE.
enum {
NONE,
READ,
WRITE,
CUSTOM
} type : 2;
unsigned size : 30;
};
const unsigned ioctl_table_max = 500;
static ioctl_desc ioctl_table[ioctl_table_max];
static unsigned ioctl_table_size = 0;
// This can not be declared as a global, because references to struct_*_sz
// require a global initializer. And this table must be available before global
// initializers are run.
static void ioctl_table_fill() {
#define _(rq, tp, sz) \
CHECK(ioctl_table_size < ioctl_table_max); \
ioctl_table[ioctl_table_size].req = rq; \
ioctl_table[ioctl_table_size].type = ioctl_desc::tp; \
ioctl_table[ioctl_table_size].size = sz; \
++ioctl_table_size;
_(0x0000540C, NONE, 0); // TIOCEXCL
_(0x0000540D, NONE, 0); // TIOCNXCL
_(0x0000540E, NONE, 0); // TIOCSCTTY
_(0x0000540F, WRITE, pid_t_sz); // TIOCGPGRP
_(0x00005410, READ, pid_t_sz); // TIOCSPGRP
_(0x00005411, WRITE, sizeof(int)); // TIOCOUTQ
_(0x00005412, READ, sizeof(char)); // TIOCSTI
_(0x00005413, WRITE, struct_winsize_sz); // TIOCGWINSZ
_(0x00005414, READ, struct_winsize_sz); // TIOCSWINSZ
_(0x00005415, WRITE, sizeof(int)); // TIOCMGET
_(0x00005416, READ, sizeof(int)); // TIOCMBIS
_(0x00005417, READ, sizeof(int)); // TIOCMBIC
_(0x00005418, READ, sizeof(int)); // TIOCMSET
_(0x0000541D, NONE, 0); // TIOCCONS
_(0x00005420, READ, sizeof(int)); // TIOCPKT
_(0x00005421, READ, sizeof(int)); // FIONBIO
_(0x00005422, NONE, 0); // TIOCNOTTY
_(0x00005423, READ, sizeof(int)); // TIOCSETD
_(0x00005424, WRITE, sizeof(int)); // TIOCGETD
_(0x00005450, NONE, 0); // FIONCLEX
_(0x00005451, NONE, 0); // FIOCLEX
_(0x00005452, READ, sizeof(int)); // FIOASYNC
_(0x00008901, READ, sizeof(int)); // FIOSETOWN
_(0x00008902, READ, sizeof(int)); // SIOCSPGRP
_(0x00008903, WRITE, sizeof(int)); // FIOGETOWN
_(0x00008904, WRITE, sizeof(int)); // SIOCGPGRP
_(0x00008905, WRITE, sizeof(int)); // SIOCATMAR
_(0x00008912, CUSTOM, 0); // SIOCGIFCONF
_(0x00008913, WRITE, struct_ifreq_sz); // SIOCGIFFLAGS
_(0x00008914, READ, struct_ifreq_sz); // SIOCSIFFLAGS
_(0x00008915, WRITE, struct_ifreq_sz); // SIOCGIFADDR
_(0x00008916, READ, struct_ifreq_sz); // SIOCSIFADDR
_(0x00008917, WRITE, struct_ifreq_sz); // SIOCGIFDSTADDR
_(0x00008918, READ, struct_ifreq_sz); // SIOCSIFDSTADDR
_(0x00008919, WRITE, struct_ifreq_sz); // SIOCGIFBRDADDR
_(0x0000891A, READ, struct_ifreq_sz); // SIOCSIFBRDADDR
_(0x0000891B, WRITE, struct_ifreq_sz); // SIOCGIFNETMASK
_(0x0000891C, READ, struct_ifreq_sz); // SIOCSIFNETMASK
_(0x0000891D, WRITE, struct_ifreq_sz); // SIOCGIFMETRIC
_(0x0000891E, READ, struct_ifreq_sz); // SIOCSIFMETRIC
_(0x00008921, WRITE, struct_ifreq_sz); // SIOCGIFMTU
_(0x00008922, READ, struct_ifreq_sz); // SIOCSIFMTU
_(0x00008931, READ, struct_ifreq_sz); // SIOCADDMULTI
_(0x00008932, READ, struct_ifreq_sz); // SIOCDELMULTI
_(0x00008940, NONE, 0); // SIOCADDRTOLD
_(0x00008941, NONE, 0); // SIOCDELRTOLD
#if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_MAC
_(0x000089E0, WRITE, struct_sioc_vif_req_sz); // SIOCGETVIFCNT
_(0x000089E1, WRITE, struct_sioc_sg_req_sz); // SIOCGETSGCNT
#endif
#if SANITIZER_LINUX
_(0x00000000, NONE, 0); // FDCLRPRM
_(0x00000001, READ, struct_floppy_struct_sz); // FDSETPRM
_(0x00000002, READ, struct_floppy_struct_sz); // FDDEFPRM
_(0x00000003, WRITE, struct_floppy_struct_sz); // FDGETPRM
_(0x00000004, NONE, 0); // FDMSGON
_(0x00000005, NONE, 0); // FDMSGOFF
_(0x00000006, NONE, 0); // FDFMTBEG
_(0x00000007, READ, struct_format_descr_sz); // FDFMTTRK
_(0x00000008, NONE, 0); // FDFMTEND
_(0x0000000A, NONE, 0); // FDSETEMSGTRESH
_(0x0000000B, NONE, 0); // FDFLUSH
_(0x0000000C, READ, struct_floppy_max_errors_sz); // FDSETMAXERRS
_(0x0000000E, WRITE, struct_floppy_max_errors_sz); // FDGETMAXERRS
_(0x00000010, WRITE, 16); // FDGETDRVTYP
_(0x00000014, READ, struct_floppy_drive_params_sz); // FDSETDRVPRM
_(0x00000015, WRITE, struct_floppy_drive_params_sz); // FDGETDRVPRM
_(0x00000016, WRITE, struct_floppy_drive_struct_sz); // FDGETDRVSTAT
_(0x00000017, WRITE, struct_floppy_drive_struct_sz); // FDPOLLDRVSTAT
_(0x00000018, NONE, 0); // FDRESET
_(0x00000019, WRITE, struct_floppy_fdc_state_sz); // FDGETFDCSTAT
_(0x0000001B, NONE, 0); // FDWERRORCLR
_(0x0000001C, WRITE, struct_floppy_write_errors_sz); // FDWERRORGET
_(0x0000001E, WRITE, struct_floppy_raw_cmd_sz); // FDRAWCMD
_(0x00000028, NONE, 0); // FDTWADDLE
_(0x00000301, WRITE, struct_hd_geometry_sz); // HDIO_GETGEO
_(0x00000302, WRITE, sizeof(int)); // HDIO_GET_UNMASKINTR
_(0x00000304, WRITE, sizeof(int)); // HDIO_GET_MULTCOUNT
_(0x00000307, WRITE, struct_hd_driveid_sz); // HDIO_GET_IDENTITY
_(0x00000308, WRITE, sizeof(int)); // HDIO_GET_KEEPSETTINGS
_(0x00000309, WRITE, sizeof(int)); // HDIO_GET_CHIPSET
_(0x0000030A, WRITE, sizeof(int)); // HDIO_GET_NOWERR
_(0x0000030B, WRITE, sizeof(int)); // HDIO_GET_DMA
_(0x0000031F, WRITE, sizeof(int)); // HDIO_DRIVE_CMD
_(0x00000321, NONE, 0); // HDIO_SET_MULTCOUNT
_(0x00000322, NONE, 0); // HDIO_SET_UNMASKINTR
_(0x00000323, NONE, 0); // HDIO_SET_KEEPSETTINGS
_(0x00000324, NONE, 0); // HDIO_SET_CHIPSET
_(0x00000325, NONE, 0); // HDIO_SET_NOWERR
_(0x00000326, NONE, 0); // HDIO_SET_DMA
_(0x00000601, NONE, 0); // LPCHAR
_(0x00000602, NONE, 0); // LPTIME
_(0x00000604, NONE, 0); // LPABORT
_(0x00000605, NONE, 0); // LPSETIRQ
_(0x00000606, WRITE, sizeof(int)); // LPGETIRQ
_(0x00000608, NONE, 0); // LPWAIT
_(0x00000609, NONE, 0); // LPCAREFUL
_(0x0000060A, NONE, 0); // LPABORTOPEN
_(0x0000060B, WRITE, sizeof(int)); // LPGETSTATUS
_(0x0000060C, NONE, 0); // LPRESET
_(0x0000125D, READ, sizeof(int)); // BLKROSET
_(0x0000125E, WRITE, sizeof(int)); // BLKROGET
_(0x0000125F, NONE, 0); // BLKRRPART
_(0x00001260, WRITE, sizeof(uptr)); // BLKGETSIZE
_(0x00001261, NONE, 0); // BLKFLSBUF
_(0x00001262, NONE, 0); // BLKRASET
_(0x00001263, WRITE, sizeof(int)); // BLKRAGET
_(0x00004300, NONE, 0); // SNDCTL_COPR_RESET
_(0x00005000, NONE, 0); // SNDCTL_DSP_RESET
_(0x00005001, NONE, 0); // SNDCTL_DSP_SYNC
_(0x00005008, NONE, 0); // SNDCTL_DSP_POST
_(0x0000500E, NONE, 0); // SNDCTL_DSP_NONBLOCK
_(0x00005100, NONE, 0); // SNDCTL_SEQ_RESET
_(0x00005101, NONE, 0); // SNDCTL_SEQ_SYNC
_(0x00005111, NONE, 0); // SNDCTL_SEQ_PANIC
_(0x00005301, NONE, 0); // CDROMPAUSE
_(0x00005302, NONE, 0); // CDROMRESUME
_(0x00005303, READ, struct_cdrom_msf_sz); // CDROMPLAYMSF
_(0x00005304, READ, struct_cdrom_ti_sz); // CDROMPLAYTRKIND
_(0x00005305, WRITE, struct_cdrom_tochdr_sz); // CDROMREADTOCHDR
_(0x00005306, WRITE, struct_cdrom_tocentry_sz); // CDROMREADTOCENTRY
_(0x00005307, NONE, 0); // CDROMSTOP
_(0x00005308, NONE, 0); // CDROMSTART
_(0x00005309, NONE, 0); // CDROMEJECT
_(0x0000530A, READ, struct_cdrom_volctrl_sz); // CDROMVOLCTRL
_(0x0000530B, WRITE, struct_cdrom_subchnl_sz); // CDROMSUBCHNL
_(0x0000530C, READ, struct_cdrom_msf_sz); // CDROMREADMODE2
_(0x0000530D, READ, struct_cdrom_msf_sz); // CDROMREADMODE1
_(0x0000530E, READ, struct_cdrom_read_audio_sz); // CDROMREADAUDIO
_(0x0000530F, NONE, 0); // CDROMEJECT_SW
_(0x00005310, WRITE, struct_cdrom_multisession_sz); // CDROMMULTISESSION
_(0x00005311, WRITE, 8); // CDROM_GET_UPC
_(0x00005312, NONE, 0); // CDROMRESET
_(0x00005313, WRITE, struct_cdrom_volctrl_sz); // CDROMVOLREAD
_(0x00005314, READ, struct_cdrom_msf_sz); // CDROMREADRAW
_(0x00005315, READ, struct_cdrom_msf_sz); // CDROMREADCOOKED
_(0x00005316, READ, struct_cdrom_msf_sz); // CDROMSEEK
// Conflicting request id.
// _(0x00005382, NONE, 0); // CDROMAUDIOBUFSIZ
// _(0x00005382, WRITE, 2 * sizeof(int)); // SCSI_IOCTL_GET_IDLUN
_(0x00005383, NONE, 0); // SCSI_IOCTL_TAGGED_ENABLE
_(0x00005384, NONE, 0); // SCSI_IOCTL_TAGGED_DISABLE
_(0x00005385, READ, sizeof(int)); // SCSI_IOCTL_PROBE_HOST
_(0x00005401, WRITE, struct_termios_sz); // TCGETS
_(0x00005402, READ, struct_termios_sz); // TCSETS
_(0x00005403, READ, struct_termios_sz); // TCSETSW
_(0x00005404, READ, struct_termios_sz); // TCSETSF
_(0x00005405, WRITE, struct_termio_sz); // TCGETA
_(0x00005406, READ, struct_termio_sz); // TCSETA
_(0x00005407, READ, struct_termio_sz); // TCSETAW
_(0x00005408, READ, struct_termio_sz); // TCSETAF
_(0x00005409, NONE, 0); // TCSBRK
_(0x0000540A, NONE, 0); // TCXONC
_(0x0000540B, NONE, 0); // TCFLSH
// Conflicting request id.
// _(0x00005402, NONE, 0); // SNDCTL_TMR_START
// _(0x00005403, NONE, 0); // SNDCTL_TMR_STOP
// _(0x00005404, NONE, 0); // SNDCTL_TMR_CONTINUE
_(0x00005419, WRITE, sizeof(int)); // TIOCGSOFTCAR
_(0x0000541A, READ, sizeof(int)); // TIOCSSOFTCAR
_(0x0000541B, WRITE, sizeof(int)); // TIOCINQ
_(0x0000541C, READ, sizeof(char)); // TIOCLINUX
_(0x00005425, NONE, 0); // TCSBRKP
_(0x00005453, NONE, 0); // TIOCSERCONFIG
_(0x00005454, WRITE, sizeof(int)); // TIOCSERGWILD
_(0x00005455, READ, sizeof(int)); // TIOCSERSWILD
_(0x00005456, WRITE, struct_termios_sz); // TIOCGLCKTRMIOS
_(0x00005457, READ, struct_termios_sz); // TIOCSLCKTRMIOS
_(0x00005459, WRITE, sizeof(int)); // TIOCSERGETLSR
_(0x00005470, NONE, 0); // TIOCSCCINI
_(0x00005490, WRITE, sizeof(int)); // PPPIOCGFLAGS
_(0x00005491, READ, sizeof(int)); // PPPIOCSFLAGS
_(0x00005492, WRITE, sizeof(int)); // PPPIOCGASYNCMAP
_(0x00005493, READ, sizeof(int)); // PPPIOCSASYNCMAP
_(0x00005494, WRITE, sizeof(int)); // PPPIOCGUNIT
_(0x00005495, READ, sizeof(int)); // PPPIOCSINPSIG
_(0x00005497, READ, sizeof(int)); // PPPIOCSDEBUG
_(0x00005498, WRITE, sizeof(int)); // PPPIOCGDEBUG
_(0x0000549B, WRITE, sizeof(int) * 8); // PPPIOCGXASYNCMAP
_(0x0000549C, READ, sizeof(int) * 8); // PPPIOCSXASYNCMAP
_(0x0000549D, READ, sizeof(int)); // PPPIOCSMRU
_(0x0000549E, READ, sizeof(int)); // PPPIOCRASYNCMAP
_(0x0000549F, READ, sizeof(int)); // PPPIOCSMAXCID
_(0x00005600, WRITE, sizeof(int)); // VT_OPENQRY
_(0x00005601, WRITE, struct_vt_mode_sz); // VT_GETMODE
_(0x00005602, READ, struct_vt_mode_sz); // VT_SETMODE
_(0x00005603, WRITE, struct_vt_stat_sz); // VT_GETSTATE
_(0x00005604, NONE, 0); // VT_SENDSIG
_(0x00005605, NONE, 0); // VT_RELDISP
_(0x00005606, NONE, 0); // VT_ACTIVATE
_(0x00005607, NONE, 0); // VT_WAITACTIVE
_(0x00005608, NONE, 0); // VT_DISALLOCATE
_(0x00005609, READ, struct_vt_sizes_sz); // VT_RESIZE
_(0x0000560A, READ, struct_vt_consize_sz); // VT_RESIZEX
_(0x00007314, NONE, 0); // STL_BINTR
_(0x00007315, NONE, 0); // STL_BSTART
_(0x00007316, NONE, 0); // STL_BSTOP
_(0x00007317, NONE, 0); // STL_BRESET
_(0x00008906, WRITE, timeval_sz); // SIOCGSTAMP
_(0x0000890B, READ, struct_rtentry_sz); // SIOCADDRT
_(0x0000890C, READ, struct_rtentry_sz); // SIOCDELRT
_(0x00008910, NONE, 0); // SIOCGIFNAME
_(0x00008911, NONE, 0); // SIOCSIFLINK
_(0x0000891F, WRITE, struct_ifreq_sz); // SIOCGIFMEM
_(0x00008920, READ, struct_ifreq_sz); // SIOCSIFMEM
_(0x00008923, WRITE, struct_ifreq_sz); // OLD_SIOCGIFHWADDR
_(0x00008924, READ, struct_ifreq_sz); // SIOCSIFHWADDR
_(0x00008925, WRITE, sizeof(int)); // SIOCGIFENCAP
_(0x00008926, READ, sizeof(int)); // SIOCSIFENCAP
_(0x00008927, WRITE, struct_ifreq_sz); // SIOCGIFHWADDR
_(0x00008929, NONE, 0); // SIOCGIFSLAVE
_(0x00008930, NONE, 0); // SIOCSIFSLAVE
_(0x00008950, READ, struct_arpreq_sz); // SIOCDARP
_(0x00008951, WRITE, struct_arpreq_sz); // SIOCGARP
_(0x00008952, READ, struct_arpreq_sz); // SIOCSARP
_(0x00008960, READ, struct_arpreq_sz); // SIOCDRARP
_(0x00008961, WRITE, struct_arpreq_sz); // SIOCGRARP
_(0x00008962, READ, struct_arpreq_sz); // SIOCSRARP
_(0x00008970, WRITE, struct_ifreq_sz); // SIOCGIFMAP
_(0x00008971, READ, struct_ifreq_sz); // SIOCSIFMAP
_(0x000089F0, WRITE, struct_ifreq_sz); // SIOCDEVPLIP and EQL_ENSLAVE
_(0x000089F1, WRITE, struct_ifreq_sz); // EQL_EMANCIPATE
_(0x000089F2, WRITE, struct_ifreq_sz); // EQL_GETSLAVECFG
_(0x000089F3, WRITE, struct_ifreq_sz); // EQL_SETSLAVECFG
_(0x000089F4, WRITE, struct_ifreq_sz); // EQL_GETMASTRCFG
_(0x000089F5, WRITE, struct_ifreq_sz); // EQL_SETMASTRCFG
_(0x00009000, READ, sizeof(int)); // DDIOCSDBG
_(0x40045106, NONE, 0); // SNDCTL_SEQ_PERCMODE
_(0x40045108, READ, sizeof(int)); // SNDCTL_SEQ_TESTMIDI
_(0x40045109, READ, sizeof(int)); // SNDCTL_SEQ_RESETSAMPLES
_(0x4004510D, READ, sizeof(int)); // SNDCTL_SEQ_THRESHOLD
_(0x4004510F, READ, sizeof(int)); // SNDCTL_FM_4OP_ENABLE
_(0x40045407, READ, sizeof(int)); // SNDCTL_TMR_METRONOME
_(0x40045408, WRITE, sizeof(int)); // SNDCTL_TMR_SELECT
_(0x40046602, READ, sizeof(int)); // EXT2_IOC_SETFLAGS
_(0x40047602, READ, sizeof(int)); // EXT2_IOC_SETVERSION
_(0x40085112, READ, struct_seq_event_rec_sz); // SNDCTL_SEQ_OUTOFBAND
_(0x40086D01, READ, struct_mtop_sz); // MTIOCTOP
_(0x40144304, READ, struct_copr_debug_buf_sz); // SNDCTL_COPR_WDATA
_(0x40144305, READ, struct_copr_debug_buf_sz); // SNDCTL_COPR_WCODE
_(0x40285107, READ, struct_sbi_instrument_sz); // SNDCTL_FM_LOAD_INSTR
_(0x4FA44308, READ, struct_copr_msg_sz); // SNDCTL_COPR_SENDMSG
_(0x80027501, WRITE, uid_t_sz); // SMB_IOC_GETMOUNTUID
_(0x80044D00, WRITE, sizeof(int)); // SOUND_MIXER_READ_VOLUME
_(0x80044D01, WRITE, sizeof(int)); // SOUND_MIXER_READ_BASS
_(0x80044D02, WRITE, sizeof(int)); // SOUND_MIXER_READ_TREBLE
_(0x80044D03, WRITE, sizeof(int)); // SOUND_MIXER_READ_SYNTH
_(0x80044D04, WRITE, sizeof(int)); // SOUND_MIXER_READ_PCM
_(0x80044D05, WRITE, sizeof(int)); // SOUND_MIXER_READ_SPEAKER
_(0x80044D06, WRITE, sizeof(int)); // SOUND_MIXER_READ_LINE
_(0x80044D07, WRITE, sizeof(int)); // SOUND_MIXER_READ_MIC
_(0x80044D08, WRITE, sizeof(int)); // SOUND_MIXER_READ_CD
_(0x80044D09, WRITE, sizeof(int)); // SOUND_MIXER_READ_IMIX
_(0x80044D0A, WRITE, sizeof(int)); // SOUND_MIXER_READ_ALTPCM
_(0x80044D0B, WRITE, sizeof(int)); // SOUND_MIXER_READ_RECLEV
_(0x80044D0C, WRITE, sizeof(int)); // SOUND_MIXER_READ_IGAIN
_(0x80044D0D, WRITE, sizeof(int)); // SOUND_MIXER_READ_OGAIN
_(0x80044D0E, WRITE, sizeof(int)); // SOUND_MIXER_READ_LINE1
_(0x80044D0F, WRITE, sizeof(int)); // SOUND_MIXER_READ_LINE2
_(0x80044D10, WRITE, sizeof(int)); // SOUND_MIXER_READ_LINE3
_(0x80044D1C, WRITE, sizeof(int)); // SOUND_MIXER_READ_MUTE
_(0x80044D1D, WRITE, sizeof(int)); // SOUND_MIXER_READ_ENHANCE
_(0x80044D1E, WRITE, sizeof(int)); // SOUND_MIXER_READ_LOUD
_(0x80044DFB, WRITE, sizeof(int)); // SOUND_MIXER_READ_STEREODEVS
_(0x80044DFC, WRITE, sizeof(int)); // SOUND_MIXER_READ_CAPS
_(0x80044DFD, WRITE, sizeof(int)); // SOUND_MIXER_READ_RECMASK
_(0x80044DFE, WRITE, sizeof(int)); // SOUND_MIXER_READ_DEVMASK
_(0x80044DFF, WRITE, sizeof(int)); // SOUND_MIXER_READ_RECSRC
_(0x80045002, WRITE, sizeof(int)); // SOUND_PCM_READ_RATE
_(0x80045005, WRITE, sizeof(int)); // SOUND_PCM_READ_BITS
_(0x80045006, WRITE, sizeof(int)); // SOUND_PCM_READ_CHANNELS
_(0x80045007, WRITE, sizeof(int)); // SOUND_PCM_READ_FILTER
_(0x8004500B, WRITE, sizeof(int)); // SNDCTL_DSP_GETFMTS
_(0x80045104, WRITE, sizeof(int)); // SNDCTL_SEQ_GETOUTCOUNT
_(0x80045105, WRITE, sizeof(int)); // SNDCTL_SEQ_GETINCOUNT
_(0x8004510A, WRITE, sizeof(int)); // SNDCTL_SEQ_NRSYNTHS
_(0x8004510B, WRITE, sizeof(int)); // SNDCTL_SEQ_NRMIDIS
_(0x80046601, WRITE, sizeof(int)); // EXT2_IOC_GETFLAGS
_(0x80046D03, WRITE, struct_mtpos_sz); // MTIOCPOS
_(0x80047601, WRITE, sizeof(int)); // EXT2_IOC_GETVERSION
_(0x801C6D02, WRITE, struct_mtget_sz); // MTIOCGET
_(0x8FA44309, WRITE, struct_copr_msg_sz); // SNDCTL_COPR_RCVMSG
_(0xC0044D00, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_VOLUME
_(0xC0044D01, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_BASS
_(0xC0044D02, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_TREBLE
_(0xC0044D03, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_SYNTH
_(0xC0044D04, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_PCM
_(0xC0044D05, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_SPEAKER
_(0xC0044D06, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_LINE
_(0xC0044D07, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_MIC
_(0xC0044D08, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_CD
_(0xC0044D09, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_IMIX
_(0xC0044D0A, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_ALTPCM
_(0xC0044D0B, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_RECLEV
_(0xC0044D0C, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_IGAIN
_(0xC0044D0D, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_OGAIN
_(0xC0044D0E, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_LINE1
_(0xC0044D0F, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_LINE2
_(0xC0044D10, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_LINE3
_(0xC0044D1C, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_MUTE
_(0xC0044D1D, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_ENHANCE
_(0xC0044D1E, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_LOUD
_(0xC0044DFF, WRITE, sizeof(int)); // SOUND_MIXER_WRITE_RECSRC
_(0xC0045002, WRITE, sizeof(int)); // SNDCTL_DSP_SPEED
_(0xC0045003, WRITE, sizeof(int)); // SNDCTL_DSP_STEREO
_(0xC0045004, WRITE, sizeof(int)); // SNDCTL_DSP_GETBLKSIZE
_(0xC0045005, WRITE, sizeof(int)); // SNDCTL_DSP_SETFMT
_(0xC0045006, WRITE, sizeof(int)); // SOUND_PCM_WRITE_CHANNELS
_(0xC0045007, WRITE, sizeof(int)); // SOUND_PCM_WRITE_FILTER
_(0xC0045009, WRITE, sizeof(int)); // SNDCTL_DSP_SUBDIVIDE
_(0xC004500A, WRITE, sizeof(int)); // SNDCTL_DSP_SETFRAGMENT
_(0xC0045103, WRITE, sizeof(int)); // SNDCTL_SEQ_CTRLRATE
_(0xC004510E, WRITE, sizeof(int)); // SNDCTL_SYNTH_MEMAVL
_(0xC0045401, WRITE, sizeof(int)); // SNDCTL_TMR_TIMEBASE
_(0xC0045405, WRITE, sizeof(int)); // SNDCTL_TMR_TEMPO
_(0xC0045406, WRITE, sizeof(int)); // SNDCTL_TMR_SOURCE
_(0xC0046D00, WRITE, sizeof(int)); // SNDCTL_MIDI_PRETIME
_(0xC0046D01, READ, sizeof(int)); // SNDCTL_MIDI_MPUMODE
_(0xC0144302, WRITE, struct_copr_debug_buf_sz); // SNDCTL_COPR_RDATA
_(0xC0144303, WRITE, struct_copr_debug_buf_sz); // SNDCTL_COPR_RCODE
_(0xC0144306, WRITE, struct_copr_debug_buf_sz); // SNDCTL_COPR_RUN
_(0xC0144307, WRITE, struct_copr_debug_buf_sz); // SNDCTL_COPR_HALT
_(0xC074510C, WRITE, struct_midi_info_sz); // SNDCTL_MIDI_INFO
_(0xC08C5102, WRITE, struct_synth_info_sz); // SNDCTL_SYNTH_INFO
_(0xCFB04301, READ, struct_copr_buffer_sz); // SNDCTL_COPR_LOAD
#endif
#if SANITIZER_LINUX && !SANITIZER_ANDROID
_(0x00005499, WRITE, struct_ppp_stats_sz); // PPPIOCGSTAT
_(0x00004B2F, NONE, 0); // KIOCSOUND
_(0x00004B30, NONE, 0); // KDMKTONE
_(0x00004B31, WRITE, 1); // KDGETLED
_(0x00004B32, NONE, 0); // KDSETLED
_(0x00004B33, WRITE, 1); // KDGKBTYPE
_(0x00004B34, NONE, 0); // KDADDIO
_(0x00004B35, NONE, 0); // KDDELIO
_(0x00004B36, NONE, 0); // KDENABIO
_(0x00004B37, NONE, 0); // KDDISABIO
_(0x00004B3A, NONE, 0); // KDSETMODE
_(0x00004B3B, WRITE, sizeof(int)); // KDGETMODE
_(0x00004B3C, NONE, 0); // KDMAPDISP
_(0x00004B3D, NONE, 0); // KDUNMAPDISP
_(0x00004B40, WRITE, e_tabsz); // GIO_SCRNMAP
_(0x00004B41, READ, e_tabsz); // PIO_SCRNMAP
_(0x00004B44, WRITE, sizeof(int)); // KDGKBMODE
_(0x00004B45, NONE, 0); // KDSKBMODE
_(0x00004B46, WRITE, struct_kbentry_sz); // KDGKBENT
_(0x00004B47, READ, struct_kbentry_sz); // KDSKBENT
_(0x00004B48, WRITE, struct_kbsentry_sz); // KDGKBSENT
_(0x00004B49, READ, struct_kbsentry_sz); // KDSKBSENT
_(0x00004B4A, WRITE, struct_kbdiacrs_sz); // KDGKBDIACR
_(0x00004B4B, READ, struct_kbdiacrs_sz); // KDSKBDIACR
_(0x00004B4C, WRITE, struct_kbkeycode_sz); // KDGETKEYCODE
_(0x00004B4D, READ, struct_kbkeycode_sz); // KDSETKEYCODE
_(0x00004B4E, NONE, 0); // KDSIGACCEPT
_(0x00004B60, WRITE, 8192); // GIO_FONT
_(0x00004B61, READ, 8192); // PIO_FONT
_(0x00004B62, WRITE, sizeof(int)); // KDGKBMETA
_(0x00004B63, NONE, 0); // KDSKBMETA
_(0x00004B64, WRITE, sizeof(int)); // KDGKBLED
_(0x00004B65, NONE, 0); // KDSKBLED
_(0x00004B66, WRITE, struct_unimapdesc_sz); // GIO_UNIMAP
_(0x00004B67, READ, struct_unimapdesc_sz); // PIO_UNIMAP
_(0x00004B68, READ, struct_unimapinit_sz); // PIO_UNIMAPCLR
_(0x00004B69, WRITE, sizeof(short) * e_tabsz); // GIO_UNISCRNMAP
_(0x00004B6A, READ, sizeof(short) * e_tabsz); // PIO_UNISCRNMAP
_(0x00004B70, WRITE, 48); // GIO_CMAP
_(0x00004B71, NONE, 0); // PIO_CMAP
// Missing struct definition on Android.
_(0x0000541E, WRITE, struct_serial_struct_sz); // TIOCGSERIAL
_(0x0000541F, READ, struct_serial_struct_sz); // TIOCSSERIAL
_(0x0000545A, WRITE, struct_serial_multiport_struct_sz); // TIOCSERGETMULTI
_(0x0000545B, READ, struct_serial_multiport_struct_sz); // TIOCSERSETMULTI
_(0x00005471, READ, struct_scc_modem_sz); // TIOCCHANINI
_(0x00005474, WRITE, struct_scc_stat_sz); // TIOCSCCSTAT
// The following ioctl requests are shared between AX25, IPX, netrom and
// mrouted.
// _(0x000089E0, READ, sizeof(char)); // SIOCAIPXITFCRT
// _(0x000089E0, READ, struct_sockaddr_ax25_sz); // SIOCAX25GETUID
// _(0x000089E0, WRITE, struct_nr_parms_struct_sz); // SIOCNRGETPARMS
// _(0x000089E1, READ, sizeof(char)); // SIOCAIPXPRISLT
// _(0x000089E1, READ, struct_nr_parms_struct_sz); // SIOCNRSETPARMS
// _(0x000089E1, READ, struct_sockaddr_ax25_sz); // SIOCAX25ADDUID
// _(0x000089E2, NONE, 0); // SIOCNRDECOBS
// _(0x000089E2, READ, struct_sockaddr_ax25_sz); // SIOCAX25DELUID
// _(0x000089E2, WRITE, struct_ipx_config_data_sz); // SIOCIPXCFGDATA
// _(0x000089E3, READ, sizeof(int)); // SIOCAX25NOUID
// _(0x000089E3, READ, sizeof(int)); // SIOCNRRTCTL
// _(0x000089E4, READ, sizeof(int)); // SIOCAX25DIGCTL
// _(0x000089E5, WRITE, struct_ax25_parms_struct_sz); // SIOCAX25GETPARMS
// _(0x000089E6, READ, struct_ax25_parms_struct_sz); // SIOCAX25SETPARMS
_(0x00435901, WRITE, struct_cyclades_monitor_sz); // CYGETMON
_(0x00435902, WRITE, sizeof(int)); // CYGETTHRESH
_(0x00435903, NONE, 0); // CYSETTHRESH
_(0x00435904, WRITE, sizeof(int)); // CYGETDEFTHRESH
_(0x00435905, NONE, 0); // CYSETDEFTHRESH
_(0x00435906, WRITE, sizeof(int)); // CYGETTIMEOUT
_(0x00435907, NONE, 0); // CYSETTIMEOUT
_(0x00435908, WRITE, sizeof(int)); // CYGETDEFTIMEOUT
_(0x00435909, NONE, 0); // CYSETDEFTIMEOUT
// Missing definition of mtconfiginfo
_(0x40206D05, READ, struct_mtconfiginfo_sz); // MTIOCSETCONFIG
_(0x80206D04, WRITE, struct_mtconfiginfo_sz); // MTIOCGETCONFIG
_(0x800C500C, WRITE, struct_audio_buf_info_sz); // SNDCTL_DSP_GETOSPACE
_(0x800C500D, WRITE, struct_audio_buf_info_sz); // SNDCTL_DSP_GETISPACE
#endif
#undef _
// FIXME: missing USB ioctls (EVIOxx...x).
}
static bool ioctl_initialized = false;
struct ioctl_desc_compare {
bool operator()(const ioctl_desc& left, const ioctl_desc& right) const {
return left.req < right.req;
}
};
static void ioctl_init() {
ioctl_table_fill();
InternalSort(&ioctl_table, ioctl_table_size, ioctl_desc_compare());
for (unsigned i = 0; i < ioctl_table_size - 1; ++i) {
if (ioctl_table[i].req >= ioctl_table[i + 1].req) {
Printf("Duplicate or unsorted ioctl request id %x >= %x\n",
ioctl_table[i].req, ioctl_table[i + 1].req);
Die();
}
}
ioctl_initialized = true;
}
static const ioctl_desc *ioctl_lookup(unsigned req) {
int left = 0;
int right = sizeof(ioctl_table) / sizeof(*ioctl_table);
while (left < right) {
int mid = (left + right) / 2;
if (ioctl_table[mid].req < req)
left = mid + 1;
else
right = mid;
}
if (left == right && ioctl_table[left].req == req)
return ioctl_table + left;
else
return 0;
}
static void ioctl_common_pre(void *ctx, const ioctl_desc *desc, int d,
unsigned request, void *arg) {
if (desc->type == ioctl_desc::READ)
COMMON_INTERCEPTOR_READ_RANGE(ctx, arg, desc->size);
if (desc->type != ioctl_desc::CUSTOM)
return;
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;
}
static void ioctl_common_post(void *ctx, const ioctl_desc *desc, int res, int d,
unsigned request, void *arg) {
if (desc->type == ioctl_desc::WRITE) {
// FIXME: add verbose output
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, arg, desc->size);
}
if (desc->type != ioctl_desc::CUSTOM)
return;
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;
}