summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_cow.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2005-10-22 20:02:59 +0000
committeralc <alc@FreeBSD.org>2005-10-22 20:02:59 +0000
commit9a35a868f7ef71e215531cb52ee94eca295e3aeb (patch)
treeae0adc0df0a13cfd195154dcc527b93e0ae55dfc /sys/kern/uipc_cow.c
parent80f50568e4f2db57f16eb7523394a4e9556d0cc4 (diff)
downloadFreeBSD-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.c9
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++;
OpenPOWER on IntegriCloud