authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-12-26 03:05:49-08:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2025-02-25 11:22:33-08:00
log658fba982ce7280721e770df1d7ce4ab3f4eaf40
tree6c5ad38136062108e1d068a227447fdc22c6daa5
parent590c613182d096e150dd9c882ab3bc6b20028011

ubsan: extend `ptr` before adding to avoid overflow


1 files changed, 1 insertions(+), 3 deletions(-)

lib/ubsan.zig+1-3
...@@ -1,5 +1,3 @@...@@ -1,5 +1,3 @@
1//! Minimal UBSan Runtime
2
3const std = @import("std");1const std = @import("std");
4const builtin = @import("builtin");2const builtin = @import("builtin");
5const assert = std.debug.assert;3const assert = std.debug.assert;
...@@ -471,7 +469,7 @@ fn floatCastOverflow(...@@ -471,7 +469,7 @@ fn floatCastOverflow(
471 // See: https://github.com/llvm/llvm-project/blob/release/19.x/compiler-rt/lib/ubsan/ubsan_handlers.cpp#L463469 // See: https://github.com/llvm/llvm-project/blob/release/19.x/compiler-rt/lib/ubsan/ubsan_handlers.cpp#L463
472 // for more information on this check.470 // for more information on this check.
473 const ptr: [*]const u8 = @ptrCast(data_handle);471 const ptr: [*]const u8 = @ptrCast(data_handle);
474 if (ptr[0] + ptr[1] < 2 or ptr[0] == 0xFF or ptr[1] == 0xFF) {472 if (@as(u16, ptr[0]) + @as(u16, ptr[1]) < 2 or ptr[0] == 0xFF or ptr[1] == 0xFF) {
475 const data: *const FloatCastOverflowData = @ptrCast(data_handle);473 const data: *const FloatCastOverflowData = @ptrCast(data_handle);
476 const from_value: Value = .{ .handle = from_handle, .type_descriptor = data.from };474 const from_value: Value = .{ .handle = from_handle, .type_descriptor = data.from };
477 logMessage("{} is outside the range of representable values of type {s}", .{475 logMessage("{} is outside the range of representable values of type {s}", .{