Skip to content

Commit

Permalink
avifRWStreamWriteBits: Check v for valid range
Browse files Browse the repository at this point in the history
Make sure the input parameter `v` can be represented in `bitCount` bits.
This was checked by an assertion. Replace the assertion by an error
return.
  • Loading branch information
wantehchang committed Jul 1, 2024
1 parent f1b4923 commit e10e6d9
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ avifResult avifRWStreamWriteZeros(avifRWStream * stream, size_t byteCount)

avifResult avifRWStreamWriteBits(avifRWStream * stream, uint32_t v, size_t bitCount)
{
assert(((uint64_t)v >> bitCount) == 0); // (uint32_t >> 32 is undefined behavior)
AVIF_CHECKERR(bitCount >= 32 || (v >> bitCount) == 0, AVIF_RESULT_INVALID_ARGUMENT);
while (bitCount) {
if (stream->numUsedBitsInPartialByte == 0) {
AVIF_CHECKRES(makeRoom(stream, 1)); // Book a new partial byte in the stream.
Expand Down
9 changes: 9 additions & 0 deletions tests/gtest/avifstreamtest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,15 @@ TEST(StreamTest, Roundtrip) {
EXPECT_FALSE(avifROStreamSkip(&ro_stream, /*byteCount=*/1));
}

TEST(StreamTest, WriteBitsLimit) {
testutil::AvifRwData rw_data;
avifRWStream rw_stream;
avifRWStreamStart(&rw_stream, &rw_data);
EXPECT_EQ(avifRWStreamWriteBits(&rw_stream, 7, 3), AVIF_RESULT_OK);
EXPECT_EQ(avifRWStreamWriteBits(&rw_stream, 8, 3),
AVIF_RESULT_INVALID_ARGUMENT);
}

//------------------------------------------------------------------------------
// Variable length integer implementation

Expand Down

0 comments on commit e10e6d9

Please sign in to comment.