aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
diff options
context:
space:
mode:
authorm <m@pop-os.localdomain>2022-02-11 20:11:23 +0100
committerm <m@pop-os.localdomain>2022-02-11 22:15:46 +0100
commit65299c37d1b4b4395616d6f86b5f064000951cf6 (patch)
treecf763fc14a86fa29d548936555f196a8c99cfaa5 /lib/std/debug.zig
parentbd8d6a8342914974ca163fa75db0562d181f6d27 (diff)
downloadzig-65299c37d1b4b4395616d6f86b5f064000951cf6.tar.gz
zig-65299c37d1b4b4395616d6f86b5f064000951cf6.zip
validate in Windows using VirtualQuery
Diffstat (limited to 'lib/std/debug.zig')
-rw-r--r--lib/std/debug.zig56
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;
}
}