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