[Haiku-commits] r33031 - haiku/trunk/src/system/kernel/vm

mmlr at mail.berlios.de mmlr at mail.berlios.de
Thu Sep 10 03:47:23 CEST 2009


Author: mmlr
Date: 2009-09-10 03:47:22 +0200 (Thu, 10 Sep 2009)
New Revision: 33031
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=33031&view=rev

Modified:
   haiku/trunk/src/system/kernel/vm/vm.cpp
Log:
Also check for read-protection of an area. Adjusted naming from read-only to
write-protected and read-protected.


Modified: haiku/trunk/src/system/kernel/vm/vm.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/vm.cpp	2009-09-10 01:40:46 UTC (rev 33030)
+++ haiku/trunk/src/system/kernel/vm/vm.cpp	2009-09-10 01:47:22 UTC (rev 33031)
@@ -798,7 +798,8 @@
 enum {
 	PAGE_FAULT_ERROR_NO_AREA		= 0,
 	PAGE_FAULT_ERROR_KERNEL_ONLY,
-	PAGE_FAULT_ERROR_READ_ONLY,
+	PAGE_FAULT_ERROR_WRITE_PROTECTED,
+	PAGE_FAULT_ERROR_READ_PROTECTED,
 	PAGE_FAULT_ERROR_KERNEL_BAD_USER_MEMORY,
 	PAGE_FAULT_ERROR_NO_ADDRESS_SPACE
 };
@@ -823,9 +824,13 @@
 			case PAGE_FAULT_ERROR_KERNEL_ONLY:
 				out.Print("page fault error: area: %ld, kernel only", fArea);
 				break;
-			case PAGE_FAULT_ERROR_READ_ONLY:
-				out.Print("page fault error: area: %ld, read only", fArea);
+			case PAGE_FAULT_ERROR_WRITE_PROTECTED:
+				out.Print("page fault error: area: %ld, write protected",
+					fArea);
 				break;
+			case PAGE_FAULT_ERROR_READ_PROTECTED:
+				out.Print("page fault error: area: %ld, read protected", fArea);
+				break;
 			case PAGE_FAULT_ERROR_KERNEL_BAD_USER_MEMORY:
 				out.Print("page fault error: kernel touching bad user memory");
 				break;
@@ -4919,12 +4924,20 @@
 		}
 		if (isWrite && (protection
 				& (B_WRITE_AREA | (isUser ? 0 : B_KERNEL_WRITE_AREA))) == 0) {
-			dprintf("write access attempted on read-only area 0x%lx at %p\n",
-				area->id, (void*)originalAddress);
+			dprintf("write access attempted on write-protected area 0x%lx at"
+				" %p\n", area->id, (void*)originalAddress);
 			TPF(PageFaultError(area->id,
-				VMPageFaultTracing::PAGE_FAULT_ERROR_READ_ONLY));
+				VMPageFaultTracing::PAGE_FAULT_ERROR_WRITE_PROTECTED));
 			status = B_PERMISSION_DENIED;
 			break;
+		} else if (!isWrite && (protection
+				& (B_READ_AREA | (isUser ? 0 : B_KERNEL_READ_AREA))) == 0) {
+			dprintf("read access attempted on read-protected area 0x%lx at"
+				" %p\n", area->id, (void*)originalAddress);
+			TPF(PageFaultError(area->id,
+				VMPageFaultTracing::PAGE_FAULT_ERROR_READ_PROTECTED));
+			status = B_PERMISSION_DENIED;
+			break;
 		}
 
 		// We have the area, it was a valid access, so let's try to resolve the




More information about the Haiku-commits mailing list