diff --git a/AK/SharedBuffer.cpp b/AK/SharedBuffer.cpp index 87e22d0932..56e6b7e47d 100644 --- a/AK/SharedBuffer.cpp +++ b/AK/SharedBuffer.cpp @@ -67,16 +67,12 @@ bool SharedBuffer::share_globally() RefPtr SharedBuffer::create_from_shbuf_id(int shbuf_id) { - void* data = shbuf_get(shbuf_id); + size_t size = 0; + void* data = shbuf_get(shbuf_id, &size); if (data == (void*)-1) { perror("shbuf_get"); return nullptr; } - int size = shbuf_get_size(shbuf_id); - if (size < 0) { - perror("shbuf_get_size"); - return nullptr; - } return adopt(*new SharedBuffer(shbuf_id, size, data)); } diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index cd0aaf00f2..a441dd4681 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -3634,9 +3634,11 @@ int Process::sys$shbuf_release(int shbuf_id) return 0; } -void* Process::sys$shbuf_get(int shbuf_id) +void* Process::sys$shbuf_get(int shbuf_id, size_t* user_size) { REQUIRE_PROMISE(shared_buffer); + if (user_size && !validate_write_typed(user_size)) + return (void*)-EFAULT; LOCKER(shared_buffers().lock()); auto it = shared_buffers().resource().find(shbuf_id); if (it == shared_buffers().resource().end()) @@ -3647,6 +3649,10 @@ void* Process::sys$shbuf_get(int shbuf_id) #ifdef SHARED_BUFFER_DEBUG kprintf("%s(%u): Retaining shared buffer %d, buffer count: %u\n", name().characters(), pid(), shbuf_id, shared_buffers().resource().size()); #endif + if (user_size) { + size_t size = shared_buffer.size(); + copy_to_user(user_size, &size); + } return shared_buffer.ref_for_process_and_get_address(*this); } @@ -3667,22 +3673,6 @@ int Process::sys$shbuf_seal(int shbuf_id) return 0; } -int Process::sys$shbuf_get_size(int shbuf_id) -{ - REQUIRE_PROMISE(shared_buffer); - LOCKER(shared_buffers().lock()); - auto it = shared_buffers().resource().find(shbuf_id); - if (it == shared_buffers().resource().end()) - return -EINVAL; - auto& shared_buffer = *(*it).value; - if (!shared_buffer.is_shared_with(m_pid)) - return -EPERM; -#ifdef SHARED_BUFFER_DEBUG - kprintf("%s(%u): Get shared buffer %d size: %u\n", name().characters(), pid(), shbuf_id, shared_buffers().resource().size()); -#endif - return shared_buffer.size(); -} - int Process::sys$shbuf_set_volatile(int shbuf_id, bool state) { REQUIRE_PROMISE(shared_buffer); diff --git a/Kernel/Process.h b/Kernel/Process.h index 2f78302e8b..35d0c33b81 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -276,10 +276,9 @@ public: int sys$shbuf_create(int, void** buffer); int sys$shbuf_allow_pid(int, pid_t peer_pid); int sys$shbuf_allow_all(int); - void* sys$shbuf_get(int shbuf_id); + void* sys$shbuf_get(int shbuf_id, size_t* size); int sys$shbuf_release(int shbuf_id); int sys$shbuf_seal(int shbuf_id); - int sys$shbuf_get_size(int shbuf_id); int sys$shbuf_set_volatile(int shbuf_id, bool); int sys$halt(); int sys$reboot(); diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index a8c64ae8a3..f9b3e7384f 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -121,7 +121,6 @@ namespace Kernel { __ENUMERATE_SYSCALL(chown) \ __ENUMERATE_SYSCALL(fchmod) \ __ENUMERATE_SYSCALL(symlink) \ - __ENUMERATE_SYSCALL(shbuf_get_size) \ __ENUMERATE_SYSCALL(shbuf_seal) \ __ENUMERATE_SYSCALL(sendto) \ __ENUMERATE_SYSCALL(recvfrom) \ diff --git a/Libraries/LibC/serenity.h b/Libraries/LibC/serenity.h index 9039e06029..44d74d2874 100644 --- a/Libraries/LibC/serenity.h +++ b/Libraries/LibC/serenity.h @@ -34,10 +34,9 @@ __BEGIN_DECLS int shbuf_create(int, void** buffer); int shbuf_allow_pid(int, pid_t peer_pid); int shbuf_allow_all(int); -void* shbuf_get(int shbuf_id); +void* shbuf_get(int shbuf_id, size_t* size); int shbuf_release(int shbuf_id); int shbuf_seal(int shbuf_id); -int shbuf_get_size(int shbuf_id); int module_load(const char* path, size_t path_length); int module_unload(const char* name, size_t name_length); diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index 037bbebdd5..b58709f87c 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -553,9 +553,9 @@ int set_process_icon(int icon_id) __RETURN_WITH_ERRNO(rc, rc, -1); } -void* shbuf_get(int shbuf_id) +void* shbuf_get(int shbuf_id, size_t* size) { - int rc = syscall(SC_shbuf_get, shbuf_id); + int rc = syscall(SC_shbuf_get, shbuf_id, size); if (rc < 0 && -rc < EMAXERRNO) { errno = -rc; return (void*)-1; @@ -569,12 +569,6 @@ int shbuf_release(int shbuf_id) __RETURN_WITH_ERRNO(rc, rc, -1); } -int shbuf_get_size(int shbuf_id) -{ - int rc = syscall(SC_shbuf_get_size, shbuf_id); - __RETURN_WITH_ERRNO(rc, rc, -1); -} - int shbuf_seal(int shbuf_id) { int rc = syscall(SC_shbuf_seal, shbuf_id);