]> sourceware.org Git - glibc.git/commitdiff
hurd: permit to use mlock from non-root process
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 9 Jul 2015 11:56:30 +0000 (13:56 +0200)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 9 Jul 2015 11:56:30 +0000 (13:56 +0200)
* sysdeps/mach/hurd/mlock.c (mlock): When __get_privileged_ports
returns an error, also try to use host port from __mach_host_self for
the __vm_wire call.
* sysdeps/mach/hurd/munlock.c (munlock): Likewise.

ChangeLog
sysdeps/mach/hurd/mlock.c
sysdeps/mach/hurd/munlock.c

index 95f3ddf3c3ad3afd737c930464956c2751959b33..ed509cf597de5b8e6916573498c1bdfb05736df8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2015-07-09  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+       * sysdeps/mach/hurd/mlock.c (mlock): When __get_privileged_ports
+       returns an error, also try to use host port from __mach_host_self for
+       the __vm_wire call.
+       * sysdeps/mach/hurd/munlock.c (munlock): Likewise.
+
 2015-07-09  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        [BZ #18400]
index 10078e7f800c0e21aba663ee41082da7c131ad76..8ef568ea4c02ca60e58a1cd826a4a183d5953d39 100644 (file)
 int
 mlock (const void *addr, size_t len)
 {
-  mach_port_t hostpriv;
+  mach_port_t host;
   vm_address_t page;
   error_t err;
 
-  err = __get_privileged_ports (&hostpriv, NULL);
+  err = __get_privileged_ports (&host, NULL);
   if (err)
-    return __hurd_fail (EPERM);
+    host = __mach_host_self();
 
   page = trunc_page ((vm_address_t) addr);
   len = round_page ((vm_address_t) addr + len) - page;
-  err = __vm_wire (hostpriv, __mach_task_self (), page, len,
-                  VM_PROT_READ);
-  __mach_port_deallocate (__mach_task_self (), hostpriv);
+
+  err = __vm_wire (host, __mach_task_self (), page, len, VM_PROT_READ);
+  if (host != __mach_host_self())
+    __mach_port_deallocate (__mach_task_self (), host);
 
   return err ? __hurd_fail (err) : 0;
 }
index 411115df460f448b1a07c94269661effc29136f7..d063afc9c98a8b8082db05acca4413284a0a0853 100644 (file)
 int
 munlock (const void *addr, size_t len)
 {
-  mach_port_t hostpriv;
+  mach_port_t host;
   vm_address_t page;
   error_t err;
 
-  err = __get_privileged_ports (&hostpriv, NULL);
+  err = __get_privileged_ports (&host, NULL);
   if (err)
-    return __hurd_fail (EPERM);
+    host = __mach_host_self();
 
   page = trunc_page ((vm_address_t) addr);
   len = round_page ((vm_address_t) addr + len) - page;
-  err = __vm_wire (hostpriv, __mach_task_self (), page, len, VM_PROT_NONE);
-  __mach_port_deallocate (__mach_task_self (), hostpriv);
+
+  err = __vm_wire (host, __mach_task_self (), page, len, VM_PROT_NONE);
+  if (host != __mach_host_self())
+    __mach_port_deallocate (__mach_task_self (), host);
 
   return err ? __hurd_fail (err) : 0;
 }
This page took 0.11694 seconds and 5 git commands to generate.