From 52054eb922300b5d471f87730b81cd61fa5dad1c Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 17 May 2021 12:30:05 +0200 Subject: [PATCH] UE: Make sure we return the right values for get{peer,sock}name These two functions didn't previously return error codes correctly and would crash when an invalid address buffer was specified. --- .../UserspaceEmulator/Emulator_syscalls.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp index e3ed2ddc3a..33b0709c0f 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp +++ b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp @@ -714,9 +714,11 @@ int Emulator::virt$getsockname(FlatPtr params_addr) mmu().copy_from_vm(&addrlen, (FlatPtr)params.addrlen, sizeof(socklen_t)); VERIFY(addrlen <= sizeof(addr)); auto rc = getsockname(params.sockfd, (sockaddr*)&addr, &addrlen); - mmu().copy_to_vm((FlatPtr)params.addr, &addr, sizeof(addr)); - mmu().copy_to_vm((FlatPtr)params.addrlen, &addrlen, sizeof(addrlen)); - return rc; + if (rc == 0) { + mmu().copy_to_vm((FlatPtr)params.addr, &addr, sizeof(addr)); + mmu().copy_to_vm((FlatPtr)params.addrlen, &addrlen, sizeof(addrlen)); + } + return rc < 0 ? -errno : rc; } int Emulator::virt$getpeername(FlatPtr params_addr) @@ -728,9 +730,11 @@ int Emulator::virt$getpeername(FlatPtr params_addr) mmu().copy_from_vm(&addrlen, (FlatPtr)params.addrlen, sizeof(socklen_t)); VERIFY(addrlen <= sizeof(addr)); auto rc = getpeername(params.sockfd, (sockaddr*)&addr, &addrlen); - mmu().copy_to_vm((FlatPtr)params.addr, &addr, sizeof(addr)); - mmu().copy_to_vm((FlatPtr)params.addrlen, &addrlen, sizeof(addrlen)); - return rc; + if (rc == 0) { + mmu().copy_to_vm((FlatPtr)params.addr, &addr, sizeof(addr)); + mmu().copy_to_vm((FlatPtr)params.addrlen, &addrlen, sizeof(addrlen)); + } + return rc < 0 ? -errno : rc; } int Emulator::virt$getgroups(ssize_t count, FlatPtr groups)