Skip to content

Commit 8b1e51e

Browse files
committed
syscalls: ensure syscall unique IDs are non-zero
1 parent 346d50a commit 8b1e51e

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

src/syscalls/dispatch.c

+28-24
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ bool syscallVerifyPointer(SyscallRequest *req, uintptr_t base, uintptr_t len) {
4343
return true;
4444
}
4545

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+
4657
/* Group 1: Scheduler */
4758

4859
void syscallDispatchExit(SyscallRequest *req) {
@@ -106,10 +117,9 @@ void syscallDispatchMSleep(SyscallRequest *req) {
106117

107118
void syscallDispatchOpen(SyscallRequest *req) {
108119
if(syscallVerifyPointer(req, req->params[0], MAX_FILE_PATH)) {
109-
uint64_t id = platformRand();
110-
req->requestID = id;
120+
req->requestID = syscallID();
111121

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]);
113123
if(status) {
114124
req->external = false;
115125
req->ret = status; // error code
@@ -128,9 +138,9 @@ void syscallDispatchClose(SyscallRequest *req) {
128138

129139
void syscallDispatchRead(SyscallRequest *req) {
130140
if(syscallVerifyPointer(req, req->params[1], req->params[2])) {
131-
uint64_t id;
141+
uint16_t id;
132142
if(!req->retry) {
133-
id = platformRand();
143+
id = syscallID();
134144
req->requestID = id;
135145
} else {
136146
id = req->requestID;
@@ -164,9 +174,9 @@ void syscallDispatchRead(SyscallRequest *req) {
164174

165175
void syscallDispatchWrite(SyscallRequest *req) {
166176
if(syscallVerifyPointer(req, req->params[1], req->params[2])) {
167-
uint64_t id;
177+
uint16_t id;
168178
if(!req->retry) {
169-
id = platformRand();
179+
id = syscallID();
170180
req->requestID = id;
171181
} else {
172182
id = req->requestID;
@@ -200,10 +210,9 @@ void syscallDispatchWrite(SyscallRequest *req) {
200210

201211
void syscallDispatchStat(SyscallRequest *req) {
202212
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();
205214

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]);
207216
if(status) {
208217
req->external = false;
209218
req->ret = status; // error code
@@ -218,10 +227,9 @@ void syscallDispatchStat(SyscallRequest *req) {
218227

219228
void syscallDispatchFStat(SyscallRequest *req) {
220229
if(syscallVerifyPointer(req, req->params[1], sizeof(struct stat))) {
221-
uint64_t id = platformRand();
222-
req->requestID = id;
230+
req->requestID = syscallID();
223231

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]);
225233
if(status) {
226234
req->external = false;
227235
req->ret = status; // error code
@@ -243,10 +251,9 @@ void syscallDispatchMount(SyscallRequest *req) {
243251
if(syscallVerifyPointer(req, req->params[0], MAX_FILE_PATH) &&
244252
syscallVerifyPointer(req, req->params[1], MAX_FILE_PATH) &&
245253
syscallVerifyPointer(req, req->params[2], 32)) {
246-
uint64_t id = platformRand();
247-
req->requestID = id;
254+
req->requestID = syscallID();
248255

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]);
250257
if(status) {
251258
req->external = false;
252259
req->ret = status; // error code
@@ -261,10 +268,9 @@ void syscallDispatchMount(SyscallRequest *req) {
261268

262269
void syscallDispatchOpendir(SyscallRequest *req) {
263270
if(syscallVerifyPointer(req, req->params[0], MAX_FILE_PATH)) {
264-
uint64_t id = platformRand();
265-
req->requestID = id;
271+
req->requestID = syscallID();
266272

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]);
268274
if(status) {
269275
req->external = false;
270276
req->ret = status;
@@ -284,10 +290,9 @@ void syscallDispatchClosedir(SyscallRequest *req) {
284290
void syscallDispatchReaddir(SyscallRequest *req) {
285291
if(syscallVerifyPointer(req, req->params[1], sizeof(struct dirent)) &&
286292
syscallVerifyPointer(req, req->params[2], sizeof(struct dirent *))) {
287-
uint64_t id = platformRand();
288-
req->requestID = id;
293+
req->requestID = syscallID();
289294

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]);
291296
if(status) {
292297
req->external = false;
293298
req->ret = status;
@@ -435,8 +440,7 @@ void syscallDispatchIRQ(SyscallRequest *req) {
435440

436441
void syscallDispatchIoctl(SyscallRequest *req) {
437442
unsigned long op = req->params[1];
438-
uint64_t id = platformRand();
439-
req->requestID = id;
443+
req->requestID = syscallID();
440444

441445
if(op & IOCTL_OUT_PARAM) {
442446
if(syscallVerifyPointer(req, req->params[2], sizeof(unsigned long))) {

0 commit comments

Comments
 (0)