diff options
Diffstat (limited to 'libpager')
-rw-r--r-- | libpager/object-terminate.c | 5 | ||||
-rw-r--r-- | libpager/pagemap.c | 26 |
2 files changed, 12 insertions, 19 deletions
diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c index 95298217..3e7df167 100644 --- a/libpager/object-terminate.c +++ b/libpager/object-terminate.c @@ -17,6 +17,7 @@ #include "priv.h" #include "memory_object_S.h" +#include <stdlib.h> #include <stdio.h> /* Implement the object termination call from the kernel as described @@ -118,10 +119,10 @@ _pager_free_structure (struct pager *p) /* Free the pagemap */ if (p->pagemapsize) { - munmap (p->pagemap, p->pagemapsize * sizeof (* p->pagemap)); + free (p->pagemap); p->pagemapsize = 0; p->pagemap = 0; } - + p->pager_state = NOTINIT; } diff --git a/libpager/pagemap.c b/libpager/pagemap.c index 1570c75b..7bbb8c56 100644 --- a/libpager/pagemap.c +++ b/libpager/pagemap.c @@ -16,33 +16,25 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "priv.h" +#include <stdlib.h> #include <string.h> /* Grow the pagemap of pager P as necessary to deal with address OFF */ error_t _pager_pagemap_resize (struct pager *p, vm_address_t off) { - error_t err = 0; - off /= __vm_page_size; if (p->pagemapsize < off) { - void *newaddr; - vm_size_t newsize = round_page (off * sizeof (*p->pagemap)) - / sizeof (*p->pagemap); - - newaddr = mmap (0, newsize * sizeof (*p->pagemap), - PROT_READ|PROT_WRITE, MAP_ANON, 0, 0); - err = (newaddr == (void *) -1) ? errno : 0; - if (! err) - { - memcpy (newaddr, p->pagemap, p->pagemapsize * sizeof (*p->pagemap)); - munmap (p->pagemap, p->pagemapsize * sizeof (*p->pagemap)); - p->pagemap = newaddr; - p->pagemapsize = newsize; - } + void *newaddr = reallocarray (p->pagemap, off, + sizeof (*p->pagemap)); + if (!newaddr) + return errno; + + p->pagemap = newaddr; + p->pagemapsize = off; } - return err; + return 0; } |