| ... | @@ -76,6 +76,14 @@ pub fn readILEB128(comptime T: type, reader: anytype) !T { | ... | @@ -76,6 +76,14 @@ pub fn readILEB128(comptime T: type, reader: anytype) !T { |
| 76 | const remaining_shift = @intCast(u3, @typeInfo(U).Int.bits - @as(u16, shift)); | 76 | const remaining_shift = @intCast(u3, @typeInfo(U).Int.bits - @as(u16, shift)); |
| 77 | const remaining_bits = @bitCast(i8, byte | 0x80) >> remaining_shift; | 77 | const remaining_bits = @bitCast(i8, byte | 0x80) >> remaining_shift; |
| 78 | if (remaining_bits != -1) return error.Overflow; | 78 | if (remaining_bits != -1) return error.Overflow; |
| | 79 | } else { |
| | 80 | // If we don't overflow and this is the last byte and the number being decoded |
| | 81 | // is negative, check that the remaining bits are 1 |
| | 82 | if ((byte & 0x80 == 0) and (@bitCast(S, temp) < 0)) { |
| | 83 | const remaining_shift = @intCast(u3, @typeInfo(U).Int.bits - @as(u16, shift)); |
| | 84 | const remaining_bits = @bitCast(i8, byte | 0x80) >> remaining_shift; |
| | 85 | if (remaining_bits != -1) return error.Overflow; |
| | 86 | } |
| 79 | } | 87 | } |
| 80 | | 88 | |
| 81 | value |= temp; | 89 | value |= temp; |
| ... | @@ -215,6 +223,8 @@ test "deserialize signed LEB128" { | ... | @@ -215,6 +223,8 @@ test "deserialize signed LEB128" { |
| 215 | try testing.expectError(error.Overflow, test_read_ileb128(i32, "\x80\x80\x80\x80\x40")); | 223 | try testing.expectError(error.Overflow, test_read_ileb128(i32, "\x80\x80\x80\x80\x40")); |
| 216 | try testing.expectError(error.Overflow, test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x40")); | 224 | try testing.expectError(error.Overflow, test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x40")); |
| 217 | try testing.expectError(error.Overflow, test_read_ileb128(i8, "\xff\x7e")); | 225 | try testing.expectError(error.Overflow, test_read_ileb128(i8, "\xff\x7e")); |
| | 226 | try testing.expectError(error.Overflow, test_read_ileb128(i32, "\x80\x80\x80\x80\x08")); |
| | 227 | try testing.expectError(error.Overflow, test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01")); |
| 218 | | 228 | |
| 219 | // Decode SLEB128 | 229 | // Decode SLEB128 |
| 220 | try testing.expect((try test_read_ileb128(i64, "\x00")) == 0); | 230 | try testing.expect((try test_read_ileb128(i64, "\x00")) == 0); |
| ... | @@ -233,8 +243,8 @@ test "deserialize signed LEB128" { | ... | @@ -233,8 +243,8 @@ test "deserialize signed LEB128" { |
| 233 | try testing.expect((try test_read_ileb128(i8, "\xff\x7f")) == -1); | 243 | try testing.expect((try test_read_ileb128(i8, "\xff\x7f")) == -1); |
| 234 | try testing.expect((try test_read_ileb128(i16, "\xff\xff\x7f")) == -1); | 244 | try testing.expect((try test_read_ileb128(i16, "\xff\xff\x7f")) == -1); |
| 235 | try testing.expect((try test_read_ileb128(i32, "\xff\xff\xff\xff\x7f")) == -1); | 245 | try testing.expect((try test_read_ileb128(i32, "\xff\xff\xff\xff\x7f")) == -1); |
| 236 | try testing.expect((try test_read_ileb128(i32, "\x80\x80\x80\x80\x08")) == -0x80000000); | 246 | try testing.expect((try test_read_ileb128(i32, "\x80\x80\x80\x80\x78")) == -0x80000000); |
| 237 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01")) == @bitCast(i64, @intCast(u64, 0x8000000000000000))); | 247 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f")) == @bitCast(i64, @intCast(u64, 0x8000000000000000))); |
| 238 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x40")) == -0x4000000000000000); | 248 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x40")) == -0x4000000000000000); |
| 239 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f")) == -0x8000000000000000); | 249 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f")) == -0x8000000000000000); |
| 240 | | 250 | |