[eros-cvs] cvs commit: eros/src/base/sys/arch/i486/kernel PageFault.cxx UserContext.cxx

shap@eros.cs.jhu.edu shap@eros.cs.jhu.edu
Sat, 20 Jan 2001 14:36:16 -0500


shap        01/01/20 14:36:16

  Modified:    src/base/sys/arch/i486/kernel PageFault.cxx UserContext.cxx
  Log:
  Add some missing assertion checks to the PageFault handlers.
  
  Fix WalkSeg() and WalkSeg64() so that if the slot being traversed
  contains a node key or segment key, and the LSS of this segment key is
  out of range, that we generate a malformed segment fault. In this
  context, "out of range" means keyBlss<=EROS_PAGE_BLSS and
  keyBlss!=RedSegBlss.

Revision  Changes    Path
1.160     +12 -4     eros/src/base/sys/arch/i486/kernel/PageFault.cxx

Index: PageFault.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/arch/i486/kernel/PageFault.cxx,v
retrieving revision 1.159
retrieving revision 1.160
diff -u -r1.159 -r1.160
--- PageFault.cxx	2001/01/10 13:16:41	1.159
+++ PageFault.cxx	2001/01/20 19:36:16	1.160
@@ -861,6 +861,10 @@
     if ( !proc_WalkSeg(this, wi, EROS_PAGE_BLSS, &thePTE, 0, true) )
       return false;
 
+    assert(wi.segObj);
+    assert(wi.segObj->obType == ObType::PtCapPage ||
+	   wi.segObj->obType == ObType::PtDataPage);
+    
     kpa_t pageAddr = 0;
 
     uint32_t flags = DATA_PAGE_FLAGS;
@@ -880,8 +884,8 @@
     pageAddr = VTOP(ObjectCache::ObHdrToPage(wi.segObj));
 
     if (pageAddr == 0)
-      MsgLog::dprintf(true, "pPageHdr 0x%08x at addr 0x%08x!!\n",
-		      wi.segObj, pageAddr);
+      MsgLog::dprintf(true, "wi.segObj 0x%08x at addr 0x%08x!! (wi=0x%08x)\n",
+		      wi.segObj, pageAddr, &wi);
 
     assert ((pageAddr & EROS_PAGE_MASK) == 0);
     assert (pageAddr < (kpa_t) start || pageAddr >= (kpa_t) end);
@@ -1139,6 +1143,10 @@
   if ( !proc_WalkSeg(this, wi, EROS_PAGE_BLSS, &thePTE, 0, true) )
     return false;
 
+  assert(wi.segObj);
+  assert(wi.segObj->obType == ObType::PtCapPage ||
+	 wi.segObj->obType == ObType::PtDataPage);
+    
   if (isWrite)
     PTE_SET(thePDE, PTE_W);
   if (isCap)
@@ -1163,8 +1171,8 @@
   pageAddr = VTOP(ObjectCache::ObHdrToPage(pPageHdr));
 
   if (pageAddr == 0)
-    MsgLog::dprintf(true, "pPageHdr 0x%08x at addr 0x%08x!!\n",
-		    pPageHdr, pageAddr);
+    MsgLog::dprintf(true, "pPageHdr 0x%08x at addr 0x%08x!! (wi=0x%08x)\n",
+		    pPageHdr, pageAddr, &wi);
 
   assert ((pageAddr & EROS_PAGE_MASK) == 0);
   assert (pageAddr < (kpa_t) start || pageAddr >= (kpa_t) end);



1.247     +8 -0      eros/src/base/sys/arch/i486/kernel/UserContext.cxx

Index: UserContext.cxx
===================================================================
RCS file: /cvs/eros/src/base/sys/arch/i486/kernel/UserContext.cxx,v
retrieving revision 1.246
retrieving revision 1.247
diff -u -r1.246 -r1.247
--- UserContext.cxx	2001/01/16 12:54:44	1.246
+++ UserContext.cxx	2001/01/20 19:36:16	1.247
@@ -1732,6 +1732,10 @@
 	  wi.segObjIsRed = false;
 
 	  if ( keyType == KtNode || keyType == KtSegment ) {
+	    if (wi.segBlss <= EROS_PAGE_BLSS &&
+		wi.segBlss != BLSS::RedSeg)
+	      goto seg_malformed;
+	    
 	    segNode = (Node *) wi.segObj;
 	  
 	    if (segNode->PrepAsSegment() == false)
@@ -2053,6 +2057,10 @@
 	  if ( keyType == KtNode || keyType == KtSegment ) {
 	    segNode = (Node *) wi.segObj;
 	  
+	    if (wi.segBlss <= EROS_PAGE_BLSS &&
+		wi.segBlss != BLSS::RedSeg)
+	      goto seg_malformed;
+
 	    if (segNode->PrepAsSegment() == false)
 	      goto seg_thru_process;