Browse Source

Kernel: Pass name+length to mmap() and remove SmapDisabler

Andreas Kling 5 years ago
parent
commit
a47f0c93de
3 changed files with 23 additions and 26 deletions
  1. 18 16
      Kernel/Process.cpp
  2. 2 1
      Kernel/Syscall.h
  3. 3 9
      Libraries/LibC/mman.cpp

+ 18 - 16
Kernel/Process.cpp

@@ -267,22 +267,24 @@ Vector<Region*, 2> Process::split_region_around_range(const Region& source_regio
     return new_regions;
     return new_regions;
 }
 }
 
 
-void* Process::sys$mmap(const Syscall::SC_mmap_params* params)
+void* Process::sys$mmap(const Syscall::SC_mmap_params* user_params)
 {
 {
-    if (!validate_read(params, sizeof(Syscall::SC_mmap_params)))
+    if (!validate_read_typed(user_params))
         return (void*)-EFAULT;
         return (void*)-EFAULT;
 
 
-    SmapDisabler disabler;
-    void* addr = (void*)params->addr;
-    size_t size = params->size;
-    int prot = params->prot;
-    int flags = params->flags;
-    int fd = params->fd;
-    int offset = params->offset;
-    const char* name = params->name;
+    Syscall::SC_mmap_params params;
+    copy_from_user(&params, user_params, sizeof(params));
+
+    void* addr = (void*)params.addr;
+    size_t size = params.size;
+    int prot = params.prot;
+    int flags = params.flags;
+    int fd = params.fd;
+    int offset = params.offset;
 
 
-    if (name && !validate_read_str(name))
+    if (params.name && !validate_read(params.name, params.name_length))
         return (void*)-EFAULT;
         return (void*)-EFAULT;
+    auto name = copy_string_from_user(params.name, params.name_length);
 
 
     if (size == 0)
     if (size == 0)
         return (void*)-EINVAL;
         return (void*)-EINVAL;
@@ -312,13 +314,13 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* params)
 
 
     if (map_purgeable) {
     if (map_purgeable) {
         auto vmobject = PurgeableVMObject::create_with_size(size);
         auto vmobject = PurgeableVMObject::create_with_size(size);
-        region = allocate_region_with_vmobject(VirtualAddress((u32)addr), size, vmobject, 0, name ? name : "mmap (purgeable)", prot);
+        region = allocate_region_with_vmobject(VirtualAddress((u32)addr), size, vmobject, 0, !name.is_null() ? name : "mmap (purgeable)", prot);
         if (!region && (!map_fixed && addr != 0))
         if (!region && (!map_fixed && addr != 0))
-            region = allocate_region_with_vmobject({}, size, vmobject, 0, name ? name : "mmap (purgeable)", prot);
+            region = allocate_region_with_vmobject({}, size, vmobject, 0, !name.is_null() ? name : "mmap (purgeable)", prot);
     } else if (map_anonymous) {
     } else if (map_anonymous) {
-        region = allocate_region(VirtualAddress((u32)addr), size, name ? name : "mmap", prot, false);
+        region = allocate_region(VirtualAddress((u32)addr), size, !name.is_null() ? name : "mmap", prot, false);
         if (!region && (!map_fixed && addr != 0))
         if (!region && (!map_fixed && addr != 0))
-            region = allocate_region({}, size, name ? name : "mmap", prot, false);
+            region = allocate_region({}, size, !name.is_null() ? name : "mmap", prot, false);
     } else {
     } else {
         if (offset < 0)
         if (offset < 0)
             return (void*)-EINVAL;
             return (void*)-EINVAL;
@@ -346,7 +348,7 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* params)
         region->set_shared(true);
         region->set_shared(true);
     if (map_stack)
     if (map_stack)
         region->set_stack(true);
         region->set_stack(true);
-    if (name)
+    if (!name.is_null())
         region->set_name(name);
         region->set_name(name);
     return region->vaddr().as_ptr();
     return region->vaddr().as_ptr();
 }
 }

+ 2 - 1
Kernel/Syscall.h

@@ -196,7 +196,8 @@ struct SC_mmap_params {
     int32_t flags;
     int32_t flags;
     int32_t fd;
     int32_t fd;
     int32_t offset; // FIXME: 64-bit off_t?
     int32_t offset; // FIXME: 64-bit off_t?
-    const char* name { nullptr };
+    const char* name;
+    size_t name_length;
 };
 };
 
 
 struct SC_open_params {
 struct SC_open_params {

+ 3 - 9
Libraries/LibC/mman.cpp

@@ -8,22 +8,16 @@ extern "C" {
 
 
 void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset)
 void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset)
 {
 {
-    Syscall::SC_mmap_params params { (u32)addr, size, prot, flags, fd, offset, nullptr };
-    int rc = syscall(SC_mmap, &params);
-    if (rc < 0 && -rc < EMAXERRNO) {
-        errno = -rc;
-        return (void*)-1;
-    }
-    return (void*)rc;
+    return mmap_with_name(addr, size, prot, flags, fd, offset, nullptr);
 }
 }
 
 
 void* mmap_with_name(void* addr, size_t size, int prot, int flags, int fd, off_t offset, const char* name)
 void* mmap_with_name(void* addr, size_t size, int prot, int flags, int fd, off_t offset, const char* name)
 {
 {
-    Syscall::SC_mmap_params params { (u32)addr, size, prot, flags, fd, offset, name };
+    Syscall::SC_mmap_params params { (u32)addr, size, prot, flags, fd, offset, name, name ? strlen(name) : 0 };
     int rc = syscall(SC_mmap, &params);
     int rc = syscall(SC_mmap, &params);
     if (rc < 0 && -rc < EMAXERRNO) {
     if (rc < 0 && -rc < EMAXERRNO) {
         errno = -rc;
         errno = -rc;
-        return (void*)-1;
+        return MAP_FAILED;
     }
     }
     return (void*)rc;
     return (void*)rc;
 }
 }