changeset 3183:e066f975b8da

6496754 zfod_segvn_crargs overwrite may cause panic
author susans
date Mon, 27 Nov 2006 17:14:00 -0800
parents 175d080807a8
children 182e493de99b
files usr/src/uts/common/vm/vm_as.c
diffstat 1 files changed, 5 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/vm/vm_as.c	Mon Nov 27 16:54:30 2006 -0800
+++ b/usr/src/uts/common/vm/vm_as.c	Mon Nov 27 17:14:00 2006 -0800
@@ -1692,6 +1692,7 @@
 	int error;
 	int unmap = 0;
 	struct proc *p = curproc;
+	struct segvn_crargs crargs;
 
 	raddr = (caddr_t)((uintptr_t)addr & (uintptr_t)PAGEMASK);
 	rsize = (((size_t)(addr + size) + PAGEOFFSET) & PAGEMASK) -
@@ -1718,8 +1719,8 @@
 	}
 
 	if (AS_MAP_CHECK_VNODE_LPOOB(crfp, argsp)) {
-		error = as_map_vnsegs(as, raddr, rsize, crfp,
-		    (struct segvn_crargs *)argsp, &unmap);
+		crargs = *(struct segvn_crargs *)argsp;
+		error = as_map_vnsegs(as, raddr, rsize, crfp, &crargs, &unmap);
 		if (error != 0) {
 			AS_LOCK_EXIT(as, &as->a_lock);
 			if (unmap) {
@@ -1728,8 +1729,8 @@
 			return (error);
 		}
 	} else if (AS_MAP_CHECK_ANON_LPOOB(crfp, argsp)) {
-		error = as_map_ansegs(as, raddr, rsize, crfp,
-		    (struct segvn_crargs *)argsp, &unmap);
+		crargs = *(struct segvn_crargs *)argsp;
+		error = as_map_ansegs(as, raddr, rsize, crfp, &crargs, &unmap);
 		if (error != 0) {
 			AS_LOCK_EXIT(as, &as->a_lock);
 			if (unmap) {