vfs: check userland buffers before reading them.
[haiku.git] / src / bin / debug / strace / ioctl.cpp
bloba348e1f585385e157c367a8c29b260dc1b30228e
1 /*
2 * Copyright 2007-2010, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Hugo Santos <hugosantos@gmail.com>
7 */
10 #include <sys/sockio.h>
11 #include <termios.h>
13 #include <Drivers.h>
14 #include <tty.h>
15 #include <scsi.h>
17 #include "strace.h"
18 #include "Syscall.h"
19 #include "TypeHandler.h"
22 struct ioctl_info {
23 int index;
24 const char *name;
25 TypeHandler *handler;
28 #define IOCTL_INFO_ENTRY(name) \
29 { name, #name, NULL }
31 #define IOCTL_INFO_ENTRY_TYPE(name, type) \
32 { name, #name, TypeHandlerFactory<type>::Create() }
34 static const ioctl_info kIOCtls[] = {
35 // <Drivers.h>
36 IOCTL_INFO_ENTRY_TYPE(B_GET_DEVICE_SIZE, size_t *),
37 IOCTL_INFO_ENTRY_TYPE(B_SET_DEVICE_SIZE, size_t *),
38 IOCTL_INFO_ENTRY(B_SET_NONBLOCKING_IO),
39 IOCTL_INFO_ENTRY(B_SET_BLOCKING_IO),
40 IOCTL_INFO_ENTRY(B_GET_READ_STATUS),
41 IOCTL_INFO_ENTRY(B_GET_WRITE_STATUS),
42 IOCTL_INFO_ENTRY(B_GET_GEOMETRY),
43 IOCTL_INFO_ENTRY(B_GET_DRIVER_FOR_DEVICE),
44 IOCTL_INFO_ENTRY(B_GET_PARTITION_INFO),
45 IOCTL_INFO_ENTRY(B_SET_PARTITION),
46 IOCTL_INFO_ENTRY(B_FORMAT_DEVICE),
47 IOCTL_INFO_ENTRY(B_EJECT_DEVICE),
48 IOCTL_INFO_ENTRY(B_GET_ICON),
49 IOCTL_INFO_ENTRY(B_GET_BIOS_GEOMETRY),
50 IOCTL_INFO_ENTRY(B_GET_MEDIA_STATUS),
51 IOCTL_INFO_ENTRY(B_LOAD_MEDIA),
52 IOCTL_INFO_ENTRY(B_GET_BIOS_DRIVE_ID),
53 IOCTL_INFO_ENTRY(B_SET_UNINTERRUPTABLE_IO),
54 IOCTL_INFO_ENTRY(B_SET_INTERRUPTABLE_IO),
55 IOCTL_INFO_ENTRY(B_FLUSH_DRIVE_CACHE),
56 IOCTL_INFO_ENTRY(B_GET_PATH_FOR_DEVICE),
57 IOCTL_INFO_ENTRY(B_GET_NEXT_OPEN_DEVICE),
58 IOCTL_INFO_ENTRY(B_ADD_FIXED_DRIVER),
59 IOCTL_INFO_ENTRY(B_REMOVE_FIXED_DRIVER),
62 IOCTL_INFO_ENTRY(B_AUDIO_DRIVER_BASE), // conflicts
63 IOCTL_INFO_ENTRY(B_MIDI_DRIVER_BASE),
64 IOCTL_INFO_ENTRY(B_JOYSTICK_DRIVER_BASE),
65 IOCTL_INFO_ENTRY(B_GRAPHIC_DRIVER_BASE),
66 IOCTL_INFO_ENTRY(B_DEVICE_OP_CODES_END),
69 // <sys/sockio.h>
70 IOCTL_INFO_ENTRY(SIOCADDRT),
71 IOCTL_INFO_ENTRY(SIOCDELRT),
72 IOCTL_INFO_ENTRY_TYPE(SIOCSIFADDR, struct ifreq *),
73 IOCTL_INFO_ENTRY_TYPE(SIOCGIFADDR, struct ifreq *),
74 IOCTL_INFO_ENTRY_TYPE(SIOCSIFDSTADDR, struct ifreq *),
75 IOCTL_INFO_ENTRY_TYPE(SIOCGIFDSTADDR, struct ifreq *),
76 IOCTL_INFO_ENTRY_TYPE(SIOCSIFFLAGS, struct ifreq *),
77 IOCTL_INFO_ENTRY_TYPE(SIOCGIFFLAGS, struct ifreq *),
78 IOCTL_INFO_ENTRY_TYPE(SIOCGIFBRDADDR, struct ifreq *),
79 IOCTL_INFO_ENTRY_TYPE(SIOCSIFBRDADDR, struct ifreq *),
80 IOCTL_INFO_ENTRY_TYPE(SIOCGIFCOUNT, struct ifconf *),
81 IOCTL_INFO_ENTRY_TYPE(SIOCGIFCONF, struct ifconf *),
82 IOCTL_INFO_ENTRY_TYPE(SIOCGIFINDEX, struct ifreq *),
83 IOCTL_INFO_ENTRY(SIOCGIFNAME),
84 IOCTL_INFO_ENTRY_TYPE(SIOCGIFNETMASK, struct ifreq *),
85 IOCTL_INFO_ENTRY_TYPE(SIOCSIFNETMASK, struct ifreq *),
86 IOCTL_INFO_ENTRY_TYPE(SIOCGIFMETRIC, struct ifreq *),
87 IOCTL_INFO_ENTRY_TYPE(SIOCSIFMETRIC, struct ifreq *),
88 IOCTL_INFO_ENTRY_TYPE(SIOCDIFADDR, struct ifreq *),
89 IOCTL_INFO_ENTRY_TYPE(SIOCAIFADDR, struct ifaliasreq *),
90 IOCTL_INFO_ENTRY(SIOCADDMULTI),
91 IOCTL_INFO_ENTRY(SIOCDELMULTI),
92 IOCTL_INFO_ENTRY_TYPE(SIOCGIFMTU, struct ifreq *),
93 IOCTL_INFO_ENTRY_TYPE(SIOCSIFMTU, struct ifreq *),
94 IOCTL_INFO_ENTRY(SIOCSIFMEDIA),
95 IOCTL_INFO_ENTRY(SIOCGIFMEDIA),
96 IOCTL_INFO_ENTRY(SIOCGRTSIZE),
97 IOCTL_INFO_ENTRY(SIOCGRTTABLE),
98 IOCTL_INFO_ENTRY_TYPE(SIOCGIFSTATS, struct ifreq *),
99 IOCTL_INFO_ENTRY_TYPE(SIOCGIFTYPE, struct ifreq *),
100 IOCTL_INFO_ENTRY(SIOCSPACKETCAP),
101 IOCTL_INFO_ENTRY(SIOCCPACKETCAP),
102 IOCTL_INFO_ENTRY(SIOCSHIWAT),
103 IOCTL_INFO_ENTRY(SIOCGHIWAT),
104 IOCTL_INFO_ENTRY(SIOCSLOWAT),
105 IOCTL_INFO_ENTRY(SIOCGLOWAT),
106 IOCTL_INFO_ENTRY(SIOCATMARK),
107 IOCTL_INFO_ENTRY(SIOCSPGRP),
109 IOCTL_INFO_ENTRY_TYPE(B_SOCKET_SET_ALIAS, struct ifaliasreq *),
110 IOCTL_INFO_ENTRY_TYPE(B_SOCKET_GET_ALIAS, struct ifaliasreq *),
111 IOCTL_INFO_ENTRY_TYPE(B_SOCKET_COUNT_ALIASES, struct ifreq *),
113 // termios ioctls
114 IOCTL_INFO_ENTRY(TCGETA),
115 IOCTL_INFO_ENTRY(TCSETA),
116 IOCTL_INFO_ENTRY(TCSETAF),
117 IOCTL_INFO_ENTRY(TCSETAW),
118 IOCTL_INFO_ENTRY(TCWAITEVENT),
119 IOCTL_INFO_ENTRY(TCSBRK),
120 IOCTL_INFO_ENTRY(TCFLSH),
121 IOCTL_INFO_ENTRY(TCXONC),
122 IOCTL_INFO_ENTRY(TCQUERYCONNECTED),
123 IOCTL_INFO_ENTRY(TCGETBITS),
124 IOCTL_INFO_ENTRY(TCSETDTR),
125 IOCTL_INFO_ENTRY(TCSETRTS),
126 IOCTL_INFO_ENTRY(TIOCGWINSZ),
127 IOCTL_INFO_ENTRY(TIOCSWINSZ),
128 IOCTL_INFO_ENTRY(TCVTIME),
129 IOCTL_INFO_ENTRY(TIOCGPGRP),
130 IOCTL_INFO_ENTRY(TIOCSPGRP),
131 // private termios
132 IOCTL_INFO_ENTRY(B_IOCTL_GET_TTY_INDEX),
133 IOCTL_INFO_ENTRY(B_IOCTL_GRANT_TTY),
135 // scsi ioctls
136 IOCTL_INFO_ENTRY(B_SCSI_SCAN_FOR_DEVICES),
137 IOCTL_INFO_ENTRY(B_SCSI_ENABLE_PROFILING),
138 IOCTL_INFO_ENTRY(B_SCSI_INQUIRY),
139 IOCTL_INFO_ENTRY(B_SCSI_EJECT),
140 IOCTL_INFO_ENTRY(B_SCSI_PREVENT_ALLOW),
141 IOCTL_INFO_ENTRY(B_RAW_DEVICE_COMMAND),
142 IOCTL_INFO_ENTRY(B_SCSI_GET_TOC),
143 IOCTL_INFO_ENTRY(B_SCSI_PLAY_TRACK),
144 IOCTL_INFO_ENTRY(B_SCSI_PLAY_POSITION),
145 IOCTL_INFO_ENTRY(B_SCSI_STOP_AUDIO),
146 IOCTL_INFO_ENTRY(B_SCSI_PAUSE_AUDIO),
147 IOCTL_INFO_ENTRY(B_SCSI_RESUME_AUDIO),
148 IOCTL_INFO_ENTRY(B_SCSI_GET_POSITION),
149 IOCTL_INFO_ENTRY(B_SCSI_SET_VOLUME),
150 IOCTL_INFO_ENTRY(B_SCSI_GET_VOLUME),
151 IOCTL_INFO_ENTRY(B_SCSI_READ_CD),
152 IOCTL_INFO_ENTRY(B_SCSI_SCAN),
153 IOCTL_INFO_ENTRY(B_SCSI_DATA_MODE),
155 { -1, NULL, NULL }
158 static EnumTypeHandler::EnumMap kIoctlNames;
159 static TypeHandlerSelector::SelectMap kIoctlTypeHandlers;
161 void
162 patch_ioctl()
164 for (int i = 0; kIOCtls[i].name != NULL; i++) {
165 kIoctlNames[kIOCtls[i].index] = kIOCtls[i].name;
166 if (kIOCtls[i].handler != NULL)
167 kIoctlTypeHandlers[kIOCtls[i].index] = kIOCtls[i].handler;
170 Syscall *ioctl = get_syscall("_kern_ioctl");
172 ioctl->GetParameter("cmd")->SetHandler(
173 new EnumTypeHandler(kIoctlNames));
174 ioctl->GetParameter("data")->SetHandler(
175 new TypeHandlerSelector(kIoctlTypeHandlers,
176 1, TypeHandlerFactory<void *>::Create()));