Hi,

When libpager's data_return receives non-dirty data, it doesn't properly
release the memory that comes with the message.



diff -dur orig2/hurd-20111206/libpager/data-return.c orig/hurd-20111106/libpager/data-return.c
--- orig2/hurd-20111206/libpager/data-return.c	2011-12-28 21:18:48.000000000 +0000
+++ orig/hurd-20111106/libpager/data-return.c	2011-12-28 20:43:09.000000000 +0000
@@ -93,21 +93,22 @@
 
   pm_entries = &p->pagemap[offset / __vm_page_size];
 
-  if (! dirty && ! kcopy)
-    {
-      /* Prepare notified array.  */
-      for (i = 0; i < npages; i++)
-	notified[i] = (p->notify_on_evict
-		       && ! (pm_entries[i] & PM_PAGEINWAIT));
-
-      _pager_release_seqno (p, seqno);
-      goto notify;
-    }
-
   if (! dirty)
     {
-      _pager_allow_termination (p);
-      goto release_out;
+      munmap ((caddr_t) data, length);
+      if (!kcopy) {
+        /* Prepare notified array.  */
+        for (i = 0; i < npages; i++)
+          notified[i] = (p->notify_on_evict
+                         && ! (pm_entries[i] & PM_PAGEINWAIT));
+
+        _pager_release_seqno (p, seqno);
+        goto notify;
+      }
+      else {
+        _pager_allow_termination (p);
+        goto release_out;
+      }
     }
 
   /* Make sure there are no other in-progress writes for any of these

Reply via email to