@@ -43,6 +43,17 @@ bool syscallVerifyPointer(SyscallRequest *req, uintptr_t base, uintptr_t len) {
43
43
return true;
44
44
}
45
45
46
+ /* syscallID(): generates a random non-zero syscall ID
47
+ * params: none
48
+ * returns: non-zero random number
49
+ */
50
+
51
+ static uint16_t syscallID () {
52
+ uint16_t r = 0 ;
53
+ while (!r ) r = platformRand () & 0xFFFF ;
54
+ return r ;
55
+ }
56
+
46
57
/* Group 1: Scheduler */
47
58
48
59
void syscallDispatchExit (SyscallRequest * req ) {
@@ -106,10 +117,9 @@ void syscallDispatchMSleep(SyscallRequest *req) {
106
117
107
118
void syscallDispatchOpen (SyscallRequest * req ) {
108
119
if (syscallVerifyPointer (req , req -> params [0 ], MAX_FILE_PATH )) {
109
- uint64_t id = platformRand ();
110
- req -> requestID = id ;
120
+ req -> requestID = syscallID ();
111
121
112
- int status = open (req -> thread , id , (const char * )req -> params [0 ], req -> params [1 ], req -> params [2 ]);
122
+ int status = open (req -> thread , req -> requestID , (const char * )req -> params [0 ], req -> params [1 ], req -> params [2 ]);
113
123
if (status ) {
114
124
req -> external = false;
115
125
req -> ret = status ; // error code
@@ -128,9 +138,9 @@ void syscallDispatchClose(SyscallRequest *req) {
128
138
129
139
void syscallDispatchRead (SyscallRequest * req ) {
130
140
if (syscallVerifyPointer (req , req -> params [1 ], req -> params [2 ])) {
131
- uint64_t id ;
141
+ uint16_t id ;
132
142
if (!req -> retry ) {
133
- id = platformRand ();
143
+ id = syscallID ();
134
144
req -> requestID = id ;
135
145
} else {
136
146
id = req -> requestID ;
@@ -164,9 +174,9 @@ void syscallDispatchRead(SyscallRequest *req) {
164
174
165
175
void syscallDispatchWrite (SyscallRequest * req ) {
166
176
if (syscallVerifyPointer (req , req -> params [1 ], req -> params [2 ])) {
167
- uint64_t id ;
177
+ uint16_t id ;
168
178
if (!req -> retry ) {
169
- id = platformRand ();
179
+ id = syscallID ();
170
180
req -> requestID = id ;
171
181
} else {
172
182
id = req -> requestID ;
@@ -200,10 +210,9 @@ void syscallDispatchWrite(SyscallRequest *req) {
200
210
201
211
void syscallDispatchStat (SyscallRequest * req ) {
202
212
if (syscallVerifyPointer (req , req -> params [0 ], MAX_FILE_PATH ) && syscallVerifyPointer (req , req -> params [1 ], sizeof (struct stat ))) {
203
- uint64_t id = platformRand ();
204
- req -> requestID = id ;
213
+ req -> requestID = syscallID ();
205
214
206
- int status = stat (req -> thread , id , (const char * )req -> params [0 ], (struct stat * )req -> params [1 ]);
215
+ int status = stat (req -> thread , req -> requestID , (const char * )req -> params [0 ], (struct stat * )req -> params [1 ]);
207
216
if (status ) {
208
217
req -> external = false;
209
218
req -> ret = status ; // error code
@@ -218,10 +227,9 @@ void syscallDispatchStat(SyscallRequest *req) {
218
227
219
228
void syscallDispatchFStat (SyscallRequest * req ) {
220
229
if (syscallVerifyPointer (req , req -> params [1 ], sizeof (struct stat ))) {
221
- uint64_t id = platformRand ();
222
- req -> requestID = id ;
230
+ req -> requestID = syscallID ();
223
231
224
- int status = fstat (req -> thread , id , req -> params [0 ], (struct stat * )req -> params [1 ]);
232
+ int status = fstat (req -> thread , req -> requestID , req -> params [0 ], (struct stat * )req -> params [1 ]);
225
233
if (status ) {
226
234
req -> external = false;
227
235
req -> ret = status ; // error code
@@ -243,10 +251,9 @@ void syscallDispatchMount(SyscallRequest *req) {
243
251
if (syscallVerifyPointer (req , req -> params [0 ], MAX_FILE_PATH ) &&
244
252
syscallVerifyPointer (req , req -> params [1 ], MAX_FILE_PATH ) &&
245
253
syscallVerifyPointer (req , req -> params [2 ], 32 )) {
246
- uint64_t id = platformRand ();
247
- req -> requestID = id ;
254
+ req -> requestID = syscallID ();
248
255
249
- int status = mount (req -> thread , id , (const char * )req -> params [0 ], (const char * )req -> params [1 ], (const char * )req -> params [2 ], req -> params [3 ]);
256
+ int status = mount (req -> thread , req -> requestID , (const char * )req -> params [0 ], (const char * )req -> params [1 ], (const char * )req -> params [2 ], req -> params [3 ]);
250
257
if (status ) {
251
258
req -> external = false;
252
259
req -> ret = status ; // error code
@@ -261,10 +268,9 @@ void syscallDispatchMount(SyscallRequest *req) {
261
268
262
269
void syscallDispatchOpendir (SyscallRequest * req ) {
263
270
if (syscallVerifyPointer (req , req -> params [0 ], MAX_FILE_PATH )) {
264
- uint64_t id = platformRand ();
265
- req -> requestID = id ;
271
+ req -> requestID = syscallID ();
266
272
267
- int status = opendir (req -> thread , id , (const char * )req -> params [0 ]);
273
+ int status = opendir (req -> thread , req -> requestID , (const char * )req -> params [0 ]);
268
274
if (status ) {
269
275
req -> external = false;
270
276
req -> ret = status ;
@@ -284,10 +290,9 @@ void syscallDispatchClosedir(SyscallRequest *req) {
284
290
void syscallDispatchReaddir (SyscallRequest * req ) {
285
291
if (syscallVerifyPointer (req , req -> params [1 ], sizeof (struct dirent )) &&
286
292
syscallVerifyPointer (req , req -> params [2 ], sizeof (struct dirent * ))) {
287
- uint64_t id = platformRand ();
288
- req -> requestID = id ;
293
+ req -> requestID = syscallID ();
289
294
290
- int status = readdir_r (req -> thread , id , (DIR * ) req -> params [0 ], (struct dirent * ) req -> params [1 ], (struct dirent * * ) req -> params [2 ]);
295
+ int status = readdir_r (req -> thread , req -> requestID , (DIR * ) req -> params [0 ], (struct dirent * ) req -> params [1 ], (struct dirent * * ) req -> params [2 ]);
291
296
if (status ) {
292
297
req -> external = false;
293
298
req -> ret = status ;
@@ -435,8 +440,7 @@ void syscallDispatchIRQ(SyscallRequest *req) {
435
440
436
441
void syscallDispatchIoctl (SyscallRequest * req ) {
437
442
unsigned long op = req -> params [1 ];
438
- uint64_t id = platformRand ();
439
- req -> requestID = id ;
443
+ req -> requestID = syscallID ();
440
444
441
445
if (op & IOCTL_OUT_PARAM ) {
442
446
if (syscallVerifyPointer (req , req -> params [2 ], sizeof (unsigned long ))) {
0 commit comments