diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-12-29 13:31:07 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-12-29 13:31:07 -0500 |
commit | 9f8132c93fc0669e08187f55204f440f8363b9a1 (patch) | |
tree | 9c70c5cf1d1fadedcf60f0b9453b820e61f4df81 | |
parent | 7b9f47555515346b1b04d8b9eb599a931e6b56da (diff) |
force mmap to return page-aligned addresses, and check for valid input in munmap
-rw-r--r-- | src/library.js | 37 | ||||
-rwxr-xr-x | tests/runner.py | 9 |
2 files changed, 37 insertions, 9 deletions
diff --git a/src/library.js b/src/library.js index c5347045..956d062c 100644 --- a/src/library.js +++ b/src/library.js @@ -3548,21 +3548,42 @@ LibraryManager.library = { * this implementation simply uses malloc underneath the call to * mmap. */ + if (!_mmap.mappings) _mmap.mappings = {}; if (stream == -1) { var ptr = _malloc(num); - _memset(ptr, 0, num); - return ptr; + } else { + var info = FS.streams[stream]; + if (!info) return -1; + var contents = info.object.contents; + contents = Array.prototype.slice.call(contents, offset, offset+num); + ptr = allocate(contents, 'i8', ALLOC_NORMAL); + } + // align to page size + var ret = ptr; + if (ptr % PAGE_SIZE != 0) { + var old = ptr; + ptr = _malloc(num + PAGE_SIZE); + _memcpy(ptr, old, num); + _free(old); + ret = alignMemoryPage(ptr); } - var info = FS.streams[stream]; - if (!info) return -1; - var contents = info.object.contents; - contents = Array.prototype.slice.call(contents, offset, offset+num); - return allocate(contents, 'i8', ALLOC_NORMAL); + if (stream == -1) { + _memset(ret, 0, num); + } + _mmap.mappings[ret] = { malloc: ptr, num: num }; + return ret; }, __01mmap64_: 'mmap', munmap: function(start, num) { - _free(start); + if (!_mmap.mappings) _mmap.mappings = {}; + // TODO: support unmmap'ing parts of allocations + var info = _mmap.mappings[start]; + if (!info) return 0; + if (num == info.num) { + _mmap.mappings[start] = null; + _free(info.malloc); + } return 0; }, diff --git a/tests/runner.py b/tests/runner.py index 66331a86..f3602097 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -6181,13 +6181,20 @@ void*:16 #include <assert.h> int main(int argc, char *argv[]) { + for (int i = 0; i < 10; i++) { + int* map = (int*)mmap(0, 5000, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANON, -1, 0); + assert(((int)map) % 4096 == 0); // aligned + assert(munmap(map, 5000) == 0); + } + const int NUM_BYTES = 8 * 1024 * 1024; const int NUM_INTS = NUM_BYTES / sizeof(int); int* map = (int*)mmap(0, NUM_BYTES, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); assert(map != MAP_FAILED); - + int i; for (i = 0; i < NUM_INTS; i++) { |