diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2021-05-06 15:56:30 +0300 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-05-07 00:04:35 +0200 |
commit | 93023e79f28a85b5e3f2a05c95b49719b3f72bb1 (patch) | |
tree | 8983012972718e762de1afde5860cb217f2b9fd5 /libpager | |
parent | 9dfc92959856e660c73c1b4d92d4b1e5e3f98b76 (diff) | |
download | hurd-93023e79f28a85b5e3f2a05c95b49719b3f72bb1.tar.gz hurd-93023e79f28a85b5e3f2a05c95b49719b3f72bb1.tar.bz2 hurd-93023e79f28a85b5e3f2a05c95b49719b3f72bb1.zip |
libpager: Fix overallocating pagemap
The code tried to round up the allocation size to a multiple of page size.
But we actually allocate newsize * sizeof (*p->pagemap) bytes, not newsize
bytes, which meant allocations were sizeof (*p->pagemap) times larger than
they needed to be.
Message-Id: <20210506125631.79117-6-bugaevc@gmail.com>
Diffstat (limited to 'libpager')
-rw-r--r-- | libpager/pagemap.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/libpager/pagemap.c b/libpager/pagemap.c index 63c5f44d..1570c75b 100644 --- a/libpager/pagemap.c +++ b/libpager/pagemap.c @@ -17,21 +17,22 @@ #include "priv.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); + vm_size_t newsize = round_page (off * sizeof (*p->pagemap)) + / sizeof (*p->pagemap); - newaddr = mmap (0, newsize * 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) |