| ... | ... | @@ -76,6 +76,14 @@ pub fn readILEB128(comptime T: type, reader: anytype) !T { |
| 76 | 76 | const remaining_shift = @intCast(u3, @typeInfo(U).Int.bits - @as(u16, shift)); |
| 77 | 77 | const remaining_bits = @bitCast(i8, byte | 0x80) >> remaining_shift; |
| 78 | 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 | 89 | value |= temp; |
| ... | ... | @@ -215,6 +223,8 @@ test "deserialize signed LEB128" { |
| 215 | 223 | try testing.expectError(error.Overflow, test_read_ileb128(i32, "\x80\x80\x80\x80\x40")); |
| 216 | 224 | try testing.expectError(error.Overflow, test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x40")); |
| 217 | 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 | 229 | // Decode SLEB128 |
| 220 | 230 | try testing.expect((try test_read_ileb128(i64, "\x00")) == 0); |
| ... | ... | @@ -233,8 +243,8 @@ test "deserialize signed LEB128" { |
| 233 | 243 | try testing.expect((try test_read_ileb128(i8, "\xff\x7f")) == -1); |
| 234 | 244 | try testing.expect((try test_read_ileb128(i16, "\xff\xff\x7f")) == -1); |
| 235 | 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); |
| 237 | | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01")) == @bitCast(i64, @intCast(u64, 0x8000000000000000))); |
| 246 | try testing.expect((try test_read_ileb128(i32, "\x80\x80\x80\x80\x78")) == -0x80000000); |
| 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 | 248 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x40")) == -0x4000000000000000); |
| 239 | 249 | try testing.expect((try test_read_ileb128(i64, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f")) == -0x8000000000000000); |
| 240 | 250 | |