diff --git a/kernel/syscall.c b/kernel/syscall.c index 305e404b..5edd4501 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -143,8 +143,9 @@ int syscall_handler(uint32_t sys_nr, ...) int fd = va_arg(vl, int); const char* buf = va_arg(vl, const char*); size_t len = va_arg(vl, size_t); - ret = write_fs(&(per_core(current_task)->fildes_table[fd]), - (uint8_t*)buf, len); + if (fd >= 0) + ret = write_fs(&(per_core(current_task)->fildes_table[fd]), + (uint8_t*)buf, len); break; } case __NR_open: { @@ -156,22 +157,25 @@ int syscall_handler(uint32_t sys_nr, ...) } case __NR_close: { int fd = va_arg(vl, int); - ret = sys_close(fd); + if (fd >= 0) + ret = sys_close(fd); break; } case __NR_read: { int fd = va_arg(vl, int); const char* buf = va_arg(vl, const char*); size_t len = va_arg(vl, size_t); - ret = read_fs(&(per_core(current_task)->fildes_table[fd]), - (uint8_t*)buf, len); + if (fd >= 0) + ret = read_fs(&(per_core(current_task)->fildes_table[fd]), + (uint8_t*)buf, len); break; } case __NR_lseek: { int fd = va_arg(vl, int); off_t pos = va_arg(vl, off_t); int origin = va_arg(vl, int); - ret = sys_lseek(fd, pos, origin); + if (fd >= 0) + ret = sys_lseek(fd, pos, origin); break; } case __NR_sbrk: { diff --git a/newlib/examples/hello.c b/newlib/examples/hello.c index 7edfe01d..b6bf5ef6 100644 --- a/newlib/examples/hello.c +++ b/newlib/examples/hello.c @@ -47,6 +47,7 @@ int main(int argc, char** argv) write(testfile, "test", 4); lseek(testfile, 0, SEEK_SET); read(testfile, teststr, 100); + close(testfile); printf("Gelesen aus neuer Datei: %s", teststr); return errno;