Samuel Thibault, le Wed 08 Jul 2015 18:22:56 +0200, a écrit :
> Justus Winter, le Wed 08 Jul 2015 16:22:28 +0200, a écrit :
> > Alternatively, you could re-purpose the existing RPC `vm_wire',
> > changing the type of its first argument from `host_priv_t' to `host_t'
> > (this is backwards compatible as the privileged host control port is
> > also a host port), and changing the behavior slightly depending on
> > whether the user passed the priv port or a normal host port.
> 
> Ok, so it'd look like this? (I can't reuse the intran, since the
> obtained host_t is the same in non-priv and priv cases).

I forgot the glibc part, which becomes different.

Samuel
diff --git a/sysdeps/mach/hurd/mlock.c b/sysdeps/mach/hurd/mlock.c
index 14c311c..ed54166 100644
--- a/sysdeps/mach/hurd/mlock.c
+++ b/sysdeps/mach/hurd/mlock.c
@@ -28,19 +28,21 @@
 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);
-  if (err)
-    return __hurd_fail (EPERM);
-
   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,
+
+  err = __get_privileged_ports (&host, NULL);
+  if (err)
+    host = __mach_host_self();
+
+  err = __vm_wire (host, __mach_task_self (), page, len,
                   VM_PROT_READ);
-  __mach_port_deallocate (__mach_task_self (), hostpriv);
+  if (host != __mach_host_self())
+    __mach_port_deallocate (__mach_task_self (), host);
 
   return err ? __hurd_fail (err) : 0;
 }
diff --git a/sysdeps/mach/hurd/munlock.c b/sysdeps/mach/hurd/munlock.c
index c03af90..e2fe21c 100644
--- a/sysdeps/mach/hurd/munlock.c
+++ b/sysdeps/mach/hurd/munlock.c
@@ -27,18 +27,20 @@
 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);
-  if (err)
-    return __hurd_fail (EPERM);
-
   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 = __get_privileged_ports (&host, NULL);
+  if (err)
+    host = __mach_host_self();
+
+  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;
 }

Reply via email to