mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-15 21:39:59 +02:00
fix overread in Intra4Preds_NEON
Extend VP8EncIterator::i4_boundary_ by 3 bytes to avoid Intra4Preds_NEON
reading deeper into the struct (likely padding) when top is positioned
at offset 29. This data is memset with MSan to prevent a warning due to
its incorrect modeling of tbl instructions.
Prior to:
169dfbf9
disable Intra4Preds_NEON
there was a mismatch in the preprocessor checks for enabling the
function in NEON and removing the C version; NEON used `BPS == 32` while
the C code was removed unconditionally when building for aarch64. This
patch also normalizes those checks to look for `BPS == 32` and `BPS !=
32` as appropriate.
Bug: b:366668849,webp:372109644
Change-Id: Ic9e6ad4b2d844cb446decd63aec0b2676a89c8d0
This commit is contained in:
@ -13,6 +13,7 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "src/dsp/cpu.h"
|
||||
#include "src/enc/vp8i_enc.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@ -425,6 +426,15 @@ void VP8IteratorStartI4(VP8EncIterator* const it) {
|
||||
it->i4_boundary_[17 + i] = it->i4_boundary_[17 + 15];
|
||||
}
|
||||
}
|
||||
#if WEBP_AARCH64 && BPS == 32 && defined(WEBP_MSAN)
|
||||
// Intra4Preds_NEON() reads 3 uninitialized bytes from i4_boundary_ when top
|
||||
// is positioned at offset 29 (VP8TopLeftI4[3]). The values are not used
|
||||
// meaningfully, but due to limitations in MemorySanitizer related to
|
||||
// modeling of tbl instructions, a warning will be issued. This can be
|
||||
// removed if MSan is updated to support the instructions. See
|
||||
// https://issues.webmproject.org/372109644.
|
||||
memset(it->i4_boundary_ + sizeof(it->i4_boundary_) - 3, 0xaa, 3);
|
||||
#endif
|
||||
VP8IteratorNzToBytes(it); // import the non-zero context
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user