VP8BitReaderSetBuffer: move NULL check to call site

This is a refinement of
654bfb04 Avoid nullptr arithmetic in VP8BitReaderSetBuffer
and removes an unneeded/redundant check in 2 of the 3 calls to this
function:

* VP8InitBitReader: `start` is guaranteed to be non-NULL
* CopyParts0Data: `start` is allocated and checked

In `DoRemap()` `last_start` will be NULL before the partitions are
parsed. This is the only call that was missing a check. The offsetting
of a NULL pointer in `VP8BitReaderSetBuffer` was harmless in this case
as the bitreader will not be used meaningfully until there is enough
data to begin decoding partition 0. In that case the bitreader will be
initialized by `ParsePartitions()` and updated by `DoRemap()` when more
data is available.

Bug: 393104377
Change-Id: Ib44bc35e00e5129c592d742a2469420cd3d0e858
This commit is contained in:
James Zern 2025-06-23 19:05:32 -07:00
parent 8852f89ab5
commit bbf3cbb1be
2 changed files with 13 additions and 8 deletions

View File

@ -141,8 +141,14 @@ static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) {
} }
{ {
const uint8_t* const last_start = dec->parts[last_part].buf; const uint8_t* const last_start = dec->parts[last_part].buf;
VP8BitReaderSetBuffer(&dec->parts[last_part], last_start, // 'last_start' will be NULL when 'idec->state' is < STATE_VP8_PARTS0
mem->buf + mem->end - last_start); // and through a portion of that state (when there isn't enough data to
// parse the partitions). The bitreader is only used meaningfully when
// there is enough data to begin parsing partition 0.
if (last_start != NULL) {
VP8BitReaderSetBuffer(&dec->parts[last_part], last_start,
mem->buf + mem->end - last_start);
}
} }
if (NeedCompressedAlpha(idec)) { if (NeedCompressedAlpha(idec)) {
ALPHDecoder* const alph_dec = dec->alph_dec; ALPHDecoder* const alph_dec = dec->alph_dec;

View File

@ -31,12 +31,11 @@
void VP8BitReaderSetBuffer(VP8BitReader* const br, void VP8BitReaderSetBuffer(VP8BitReader* const br,
const uint8_t* const start, const uint8_t* const start,
size_t size) { size_t size) {
if (start != NULL) { assert(start != NULL);
br->buf = start; br->buf = start;
br->buf_end = start + size; br->buf_end = start + size;
br->buf_max = br->buf_max =
(size >= sizeof(lbit_t)) ? start + size - sizeof(lbit_t) + 1 : start; (size >= sizeof(lbit_t)) ? start + size - sizeof(lbit_t) + 1 : start;
}
} }
void VP8InitBitReader(VP8BitReader* const br, void VP8InitBitReader(VP8BitReader* const br,