diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-07-09 13:56:30 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-07-09 13:56:30 +0200 |
commit | ed4060f50ea84c7e238110955253647fc091aee9 (patch) | |
tree | dc91dd319ec29adf2120b970e3b732b93f371ef3 | |
parent | b8528e771c0f31ebb8ac2470e2cf7ee9a50693e2 (diff) | |
download | glibc-ed4060f50ea84c7e238110955253647fc091aee9.tar.gz glibc-ed4060f50ea84c7e238110955253647fc091aee9.tar.xz glibc-ed4060f50ea84c7e238110955253647fc091aee9.zip |
hurd: permit to use mlock from non-root process
* 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.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | sysdeps/mach/hurd/mlock.c | 13 | ||||
-rw-r--r-- | sysdeps/mach/hurd/munlock.c | 12 |
3 files changed, 21 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog index 95f3ddf3c3..ed509cf597 100644 --- 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] diff --git a/sysdeps/mach/hurd/mlock.c b/sysdeps/mach/hurd/mlock.c index 10078e7f80..8ef568ea4c 100644 --- a/sysdeps/mach/hurd/mlock.c +++ b/sysdeps/mach/hurd/mlock.c @@ -28,19 +28,20 @@ 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; } diff --git a/sysdeps/mach/hurd/munlock.c b/sysdeps/mach/hurd/munlock.c index 411115df46..d063afc9c9 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); + 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; } |