diff --git a/src/literal.cc b/src/literal.cc index b10b5ad43..a7edce94d 100644 --- a/src/literal.cc +++ b/src/literal.cc @@ -474,6 +474,10 @@ Result FloatParser::Parse(LiteralType literal_type, // static template void FloatWriter::WriteHex(char* out, size_t size, Uint bits) { + if (size == 0) { + return; + } + static constexpr int kNumNybbles = Traits::kBits / 4; static constexpr int kTopNybbleShift = Traits::kBits - 4; static constexpr Uint kTopNybble = Uint(0xf) << kTopNybbleShift; @@ -811,6 +815,10 @@ void WriteDoubleHex(char* buffer, size_t size, uint64_t bits) { } void WriteUint128(char* buffer, size_t size, v128 bits) { + if (size == 0) { + return; + } + uint64_t digits; uint64_t remainder; char reversed_buffer[40]; diff --git a/src/test-literal.cc b/src/test-literal.cc index 4408f64e8..05da7338e 100644 --- a/src/test-literal.cc +++ b/src/test-literal.cc @@ -29,6 +29,16 @@ using namespace wabt; namespace { +TEST(WriteHexTest, ZeroSizeDoesNotAccessOutput) { + char output = 'x'; + + WriteFloatHex(&output, 0, 0); + EXPECT_EQ('x', output); + + WriteDoubleHex(&output, 0, 0); + EXPECT_EQ('x', output); +} + enum ParseIntTypeCombo { UnsignedOnly, SignedAndUnsigned, @@ -853,6 +863,13 @@ TEST(WriteUint128, Basic) { AssertWriteUint128Equals({0, 0, 1, 0}, "18446744073709551616"); } +TEST(WriteUint128, ZeroSizeDoesNotAccessOutput) { + char output = 'x'; + + WriteUint128(&output, 0, {0, 0, 0, 0}); + EXPECT_EQ('x', output); +} + TEST(WriteUint128, BufferTooSmall) { { char buffer[20];