diff options
author | Joan Lledó <jlledom@member.fsf.org> | 2021-08-09 19:27:52 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-08-09 19:28:31 +0200 |
commit | b12549f5cb0495085a39908bfe9c9c4d1b068cca (patch) | |
tree | 46a5e07562a866b4ad7936ef2fe2b5eddfcfe62d /vm/vm_user.c | |
parent | 5f709eace1fb688ed6dcfa7626c113791ed86dc6 (diff) | |
download | gnumach-b12549f5cb0495085a39908bfe9c9c4d1b068cca.tar.gz gnumach-b12549f5cb0495085a39908bfe9c9c4d1b068cca.tar.bz2 gnumach-b12549f5cb0495085a39908bfe9c9c4d1b068cca.zip |
Memory object proxy: add support for ranges and nesting
Diffstat (limited to 'vm/vm_user.c')
-rw-r--r-- | vm/vm_user.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/vm/vm_user.c b/vm/vm_user.c index 42ee5e08..8da8dea1 100644 --- a/vm/vm_user.c +++ b/vm/vm_user.c @@ -1,32 +1,32 @@ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ /* * File: vm/vm_user.c * Author: Avadis Tevanian, Jr., Michael Wayne Young - * + * * User-exported virtual memory functions. */ @@ -158,7 +158,7 @@ kern_return_t vm_protect( boolean_t set_maximum, vm_prot_t new_protection) { - if ((map == VM_MAP_NULL) || + if ((map == VM_MAP_NULL) || (new_protection & ~(VM_PROT_ALL|VM_PROT_NOTIFY))) return(KERN_INVALID_ARGUMENT); @@ -350,8 +350,11 @@ kern_return_t vm_map( { ipc_port_t real_memobj; vm_prot_t prot; + vm_offset_t start; + vm_offset_t len; + result = memory_object_proxy_lookup (memory_object, &real_memobj, - &prot); + &prot, &start, &len); if (result != KERN_SUCCESS) return result; @@ -368,6 +371,12 @@ kern_return_t vm_map( return KERN_PROTECTION_FAILURE; } + /* Reduce the allowed range */ + if ((start + offset + size) > (start + len)) + return KERN_INVALID_ARGUMENT; + + offset += start; + if ((object = vm_object_enter(real_memobj, size, FALSE)) == VM_OBJECT_NULL) return KERN_INVALID_ARGUMENT; |