diff options
-rw-r--r-- | Userland/DevTools/UserspaceEmulator/Emulator.h | 4 | ||||
-rw-r--r-- | Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp | 14 |
2 files changed, 12 insertions, 6 deletions
diff --git a/Userland/DevTools/UserspaceEmulator/Emulator.h b/Userland/DevTools/UserspaceEmulator/Emulator.h index 7f9976d851..35ad2ee7e5 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator.h +++ b/Userland/DevTools/UserspaceEmulator/Emulator.h @@ -148,7 +148,7 @@ private: u32 virt$fcntl(int fd, int, u32); int virt$getgroups(ssize_t count, FlatPtr); int virt$setgroups(ssize_t count, FlatPtr); - int virt$lseek(int fd, off_t offset, int whence); + int virt$lseek(int fd, FlatPtr offset_addr, int whence); int virt$socket(int, int, int); int virt$getsockopt(FlatPtr); int virt$setsockopt(FlatPtr); @@ -184,7 +184,7 @@ private: u32 virt$allocate_tls(size_t); int virt$ptsname(int fd, FlatPtr buffer, size_t buffer_size); int virt$beep(); - int virt$ftruncate(int fd, off_t); + int virt$ftruncate(int fd, FlatPtr length_addr); mode_t virt$umask(mode_t); int virt$anon_create(size_t, int); int virt$recvfd(int, int); diff --git a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp index 9fc50f8bcb..61724c26bd 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp +++ b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp @@ -457,9 +457,11 @@ int Emulator::virt$get_stack_bounds(FlatPtr base, FlatPtr size) return 0; } -int Emulator::virt$ftruncate(int fd, off_t length) +int Emulator::virt$ftruncate(int fd, FlatPtr length_addr) { - return syscall(SC_ftruncate, fd, length); + off_t length; + mmu().copy_from_vm(&length, length_addr, sizeof(off_t)); + return syscall(SC_ftruncate, fd, &length); } mode_t Emulator::virt$umask(mode_t mask) @@ -578,9 +580,13 @@ int Emulator::virt$set_process_name(FlatPtr user_buffer, int size) return syscall(SC_set_process_name, name.characters(), name.length()); } -int Emulator::virt$lseek(int fd, off_t offset, int whence) +int Emulator::virt$lseek(int fd, FlatPtr offset_addr, int whence) { - return syscall(SC_lseek, fd, offset, whence); + off_t offset; + mmu().copy_from_vm(&offset, offset_addr, sizeof(off_t)); + auto rc = syscall(SC_lseek, fd, &offset, whence); + mmu().copy_to_vm(offset_addr, &offset, sizeof(off_t)); + return rc; } int Emulator::virt$socket(int domain, int type, int protocol) |