diff options
| author | m <m@pop-os.localdomain> | 2022-02-11 20:11:23 +0100 |
|---|---|---|
| committer | m <m@pop-os.localdomain> | 2022-02-11 22:15:46 +0100 |
| commit | 65299c37d1b4b4395616d6f86b5f064000951cf6 (patch) | |
| tree | cf763fc14a86fa29d548936555f196a8c99cfaa5 /lib/std/debug.zig | |
| parent | bd8d6a8342914974ca163fa75db0562d181f6d27 (diff) | |
| download | zig-65299c37d1b4b4395616d6f86b5f064000951cf6.tar.gz zig-65299c37d1b4b4395616d6f86b5f064000951cf6.zip | |
validate in Windows using VirtualQuery
Diffstat (limited to 'lib/std/debug.zig')
| -rw-r--r-- | lib/std/debug.zig | 56 |
1 files changed, 40 insertions, 16 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig index be47985041..c1571a70c6 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -424,24 +424,48 @@ pub const StackIterator = struct { return address; } - fn isValidMemory(address: u64) bool { + fn isValidMemory(address: usize) bool { + const aligned_address = address & ~@intCast(usize, (mem.page_size - 1)); + + // If the address does not span 2 pages, query only the first one + const length: usize = if (aligned_address == address) mem.page_size else 2 * mem.page_size; + + const aligned_memory = @intToPtr([*]align(mem.page_size) u8, aligned_address)[0..length]; + if (native_os != .windows) { - var res = true; - const length = 2 * mem.page_size; - const aligned_address = address & ~@intCast(u64, (mem.page_size - 1)); - const aligned_memory = @intToPtr([*]align(mem.page_size) u8, aligned_address)[0..length]; - - os.msync(aligned_memory, os.MSF.ASYNC) catch |err| { - switch (err) { - os.MSyncError.UnmappedMemory => { - res = false; - }, - else => unreachable, - } - }; - return res; + if (native_os != .wasi) { + os.msync(aligned_memory, os.MSF.ASYNC) catch |err| { + switch (err) { + os.MSyncError.UnmappedMemory => { + return false; + }, + else => unreachable, + } + }; + } + + return true; } else { - // TODO: Using windows memory API check if a page is mapped + const w = os.windows; + var memory_info: w.MEMORY_BASIC_INFORMATION = undefined; + //const memory_info_ptr = @ptrCast(w.PMEMORY_BASIC_INFORMATION, buffer); + + // The only error this function can throw is ERROR_INVALID_PARAMETER. + // supply an address that invalid i'll be thrown. + const rc = w.VirtualQuery(aligned_memory.ptr, &memory_info, aligned_memory.len) catch { + return false; + }; + + // Result code has to be bigger than zero (number of bytes written) + if (rc == 0) { + return false; + } + + // Free pages cannot be read, they are unmapped + if (memory_info.State == w.MEM_FREE) { + return false; + } + return true; } } |
