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 /src | |
parent | 7b9f47555515346b1b04d8b9eb599a931e6b56da (diff) |
force mmap to return page-aligned addresses, and check for valid input in munmap
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 37 |
1 files changed, 29 insertions, 8 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; }, |