diff options
author | alc <alc@FreeBSD.org> | 2005-10-22 20:02:59 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2005-10-22 20:02:59 +0000 |
commit | 9a35a868f7ef71e215531cb52ee94eca295e3aeb (patch) | |
tree | ae0adc0df0a13cfd195154dcc527b93e0ae55dfc /sys/kern/uipc_cow.c | |
parent | 80f50568e4f2db57f16eb7523394a4e9556d0cc4 (diff) | |
download | FreeBSD-src-9a35a868f7ef71e215531cb52ee94eca295e3aeb.zip FreeBSD-src-9a35a868f7ef71e215531cb52ee94eca295e3aeb.tar.gz |
Verify that access to the given address is allowed from user-space.
Discussed with: rwatson@
Diffstat (limited to 'sys/kern/uipc_cow.c')
-rw-r--r-- | sys/kern/uipc_cow.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/kern/uipc_cow.c b/sys/kern/uipc_cow.c index 1dfeff1..c3a437c 100644 --- a/sys/kern/uipc_cow.c +++ b/sys/kern/uipc_cow.c @@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$"); #include <sys/uio.h> #include <vm/vm.h> +#include <vm/vm_extern.h> #include <vm/vm_param.h> #include <vm/pmap.h> #include <vm/vm_map.h> @@ -104,15 +105,21 @@ socow_setup(struct mbuf *m0, struct uio *uio) struct vm_map *map; vm_offset_t offset, uva; + socow_stats.attempted++; vmspace = curproc->p_vmspace; map = &vmspace->vm_map; uva = (vm_offset_t) uio->uio_iov->iov_base; offset = uva & PAGE_MASK; + /* + * Verify that access to the given address is allowed from user-space. + */ + if (vm_fault_quick((caddr_t)uva, VM_PROT_READ) < 0) + return (0); + /* * verify page is mapped & not already wired for i/o */ - socow_stats.attempted++; pa=pmap_extract(map->pmap, uva); if(!pa) { socow_stats.fail_not_mapped++; |