mirror of
https://github.com/webmproject/libwebp.git
synced 2025-08-28 06:42:27 +02:00
Add fbounds-safety annotations for data
.
Reasoning: Analysis of `GetLE32` and its called function `GetLE16` (src/utils/utils.h:95) showed that `GetLE32` requires access to 4 bytes starting from `data`. `GetLE16` accesses 2 bytes. Therefore, `WEBP_COUNTED_BY(4)` was added to the `data` parameter of `GetLE32`. Similarly, `WEBP_COUNTED_BY(2)` was added to `GetLE16`. During this analysis, related functions `GetLE24`, `PutLE16`, `PutLE24`, and `PutLE32` (src/utils/utils.h lines 99-123) were also identified as needing similar annotations. They were annotated with `WEBP_COUNTED_BY(3)`, `WEBP_COUNTED_BY(2)`, `WEBP_COUNTED_BY(3)`, and `WEBP_COUNTED_BY(4)` respectively, based on the number of bytes they access or modify. Bug: 432511821 Change-Id: I5783392bc8dcaa2f346a81928ef496fc52da3a30
This commit is contained in:
@@ -93,32 +93,36 @@ static WEBP_INLINE void WebPInt32ToMem(uint8_t* const ptr, int val) {
|
||||
// Reading/writing data.
|
||||
|
||||
// Read 16, 24 or 32 bits stored in little-endian order.
|
||||
static WEBP_INLINE int GetLE16(const uint8_t* const data) {
|
||||
static WEBP_INLINE int GetLE16(const uint8_t* const WEBP_COUNTED_BY(2) data) {
|
||||
return (int)(data[0] << 0) | (data[1] << 8);
|
||||
}
|
||||
|
||||
static WEBP_INLINE int GetLE24(const uint8_t* const data) {
|
||||
static WEBP_INLINE int GetLE24(const uint8_t* const WEBP_COUNTED_BY(3) data) {
|
||||
return GetLE16(data) | (data[2] << 16);
|
||||
}
|
||||
|
||||
static WEBP_INLINE uint32_t GetLE32(const uint8_t* const data) {
|
||||
static WEBP_INLINE uint32_t GetLE32(const uint8_t* const WEBP_COUNTED_BY(4)
|
||||
data) {
|
||||
return GetLE16(data) | ((uint32_t)GetLE16(data + 2) << 16);
|
||||
}
|
||||
|
||||
// Store 16, 24 or 32 bits in little-endian order.
|
||||
static WEBP_INLINE void PutLE16(uint8_t* const data, int val) {
|
||||
static WEBP_INLINE void PutLE16(uint8_t* const WEBP_COUNTED_BY(2) data,
|
||||
int val) {
|
||||
assert(val < (1 << 16));
|
||||
data[0] = (val >> 0) & 0xff;
|
||||
data[1] = (val >> 8) & 0xff;
|
||||
}
|
||||
|
||||
static WEBP_INLINE void PutLE24(uint8_t* const data, int val) {
|
||||
static WEBP_INLINE void PutLE24(uint8_t* const WEBP_COUNTED_BY(3) data,
|
||||
int val) {
|
||||
assert(val < (1 << 24));
|
||||
PutLE16(data, val & 0xffff);
|
||||
data[2] = (val >> 16) & 0xff;
|
||||
}
|
||||
|
||||
static WEBP_INLINE void PutLE32(uint8_t* const data, uint32_t val) {
|
||||
static WEBP_INLINE void PutLE32(uint8_t* const WEBP_COUNTED_BY(4) data,
|
||||
uint32_t val) {
|
||||
PutLE16(data, (int)(val & 0xffff));
|
||||
PutLE16(data + 2, (int)(val >> 16));
|
||||
}
|
||||
|
Reference in New Issue
Block a user