Commit Graph

5107 Commits

Author SHA1 Message Date
Vincent Rabaud
5465220b03 Add arbitrary data for the encoding fuzzers
Change-Id: Ia264e0edf742630f45d22670f5e1ead140036046
2025-11-24 16:16:18 +01:00
Vincent Rabaud
4ebf0b0ac8 Properly validate picture dimensions for overflow
Change-Id: I42735f6c651d0bb768b9c727209a7b5fe991b456
2025-11-21 09:08:15 +01:00
James Zern
df24b5632e Merge "VP8ApplyNearLossless: skip alloc for small images" into main 2025-11-18 11:52:34 -08:00
James Zern
3697df15d7 Merge "io_dec,CustomSetup: rm unnecessary 'is_alpha' check" into main 2025-11-18 11:52:24 -08:00
Vincent Rabaud
acedec6860 Update the emscripten instructions
More info at:
https://wiki.libsdl.org/SDL2/README-emscripten#building-sdlemscripten

Change-Id: Iaec18c6f540d0753ef07327f4a7ecde7d86cea12
2025-11-18 19:09:01 +01:00
Andrzej Hunt
41c2a8d2f5 VP8ApplyNearLossless: skip alloc for small images
Change-Id: I193513c1fbbc5fab571014d3cfd3319d671d8949
2025-11-17 15:12:06 +00:00
James Zern
05934f93b9 io_dec,CustomSetup: rm unnecessary 'is_alpha' check
`WebPIoInitFromOptions()` doesn't distinguish between `MODE_YUV` and
`MODE_YUVA`, only RGB vs YUV. Removing this check also removes a
confusing mix up between `MODE_YUV` and `MODE_YUVA` in the conditional.

Change-Id: Id46b21785433aded733ad914941398b0bd5d6b8f
2025-11-11 16:18:13 -08:00
Vincent Rabaud
2760d87827 Do not index costs out of bounds.
In practice, the value is never read.

Change-Id: Idb33dad2581e597bd5e5b5c9414ae2c34f3a8ef2
2025-11-04 10:24:45 +01:00
Vincent Rabaud
2d16e4ac95 Use ptrdiff_t to avoid potential int overflow
Change-Id: I2a32506ee2e987b6b5a20a3f472af21b946289c3
2025-11-04 09:23:43 +01:00
Vincent Rabaud
2a755e7eec Set alpha to 0xff in ImportYUVAFromRGBA by default
Change-Id: I09d69aff23d990bf171cc0afaec0fd60e3ba9365
2025-10-30 11:40:58 +01:00
James Zern
d1e9c93961 Merge "Convert additional memcpy/memsets to unsafe variants" into main 2025-10-28 20:54:15 -07:00
Vincent Rabaud
160ad07632 Add a fuzzer for WebPDecoderConfig
Change-Id: I156304ae361c5f18ec2705adec51dae51ff91f2e
2025-10-28 11:28:23 +01:00
Vincent Rabaud
4efd97e825 Shorten sclip1
The maximum range for sclip1 is at:
https://chromium.googlesource.com/webm/libwebp/+/refs/tags/v1.6.0/src/dsp/dec.c#521
where:

const int a = VP8ksclip1[3 * (q0 - p0) + VP8ksclip1[p1 - q1]];
3 * 255 + 127 = 892 and 3 * -255 - 128 = -893

Change-Id: I13f73c28fad4429c1ba69b87cd6f6c0e97f40771
2025-10-28 10:09:02 +01:00
mxms
ea3f3f7c00 Convert additional memcpy/memsets to unsafe variants
Bug: 432511225
Change-Id: I5ea1fcc2e4884985bec0b3a7618dd75dbd6c21f8
2025-10-28 05:40:19 +00:00
Vincent Rabaud
3eb58b56d9 Fix clipping arrays
Those arrays are only used for filtering

Change-Id: Ic609222b51ba8509fca5f1a3119213d3e78ca6ad
2025-10-27 10:51:41 +01:00
mxms
ed05414168 Prepare decoder and demuxer for -fbounds-safety adoption
Change memcpy|memset|memchr to unsafe variants

Add WEBP_ASSUME_UNSAFE_INDEXABLE_ABI to relevant files. I've also added
it to lossless.h, yuv.h, and decode.h as they're all imported by code in
dec, which will have -fbounds-safety annotations.

Bug: 432511225
Change-Id: I3011a0a56633b8437ead31607c7ac5f6311fa846
2025-10-25 13:40:45 -07:00
James Zern
9f14c2605b Merge "Move non-abi breaking annotations into types.h" into main 2025-10-22 12:53:30 -07:00
mxms
0ee1a5f4b0 Move non-abi breaking annotations into types.h
By moving non-abi breaking annotations into types.h, this enables us to
mark more of libwebp as unsafe to allow better interop with struct
members which default to __single.

Change-Id: I54b78f68581e41389538f7332989c04c2e02ccc7
Bug: webp:432511225
2025-10-22 01:53:59 +00:00
James Zern
3066c7ea59 Merge changes I32b33cb9,I118aac97 into main
* changes:
  tests/fuzzer: apply clang-format
  .clang-format: add DerivePointerAlignment: false
2025-10-21 11:27:10 -07:00
Vincent Rabaud
23359a1039 Process rows properly in case of YUV cropping on odd lines.
Bug: 447845730,447958064,448792425,449246999,449546226,449781448
Change-Id: Ie8a855b5410019ec1f618fa4d4705ae3984db444
2025-10-10 11:03:26 +02:00
Vincent Rabaud
61791c774a Expand the 64-bit platforms for VP8LBitWriter
The defines are the same as the ones in bit_reader_utils.h

Change-Id: I3782425baf7dfb861dcc39d7683fba5c15e33f84
2025-10-10 09:22:25 +02:00
mxms
e40787da71 Add WEBP_UNSAFE_MEMCMP helper
Memcmp is used in other parts of libwebp which we didn't see yet in
webputils. The places that use memcp use it as an expression, (i.e. if
(memcmp(...)), so explicitly do not wrap in do { } while (0) guard.

Change-Id: Ifa972640bae052717a1af02112c62dc197dfe0f1
2025-10-09 16:38:41 +00:00
Vincent Rabaud
9636d8e04f Restrict MSAN fixes to old clang versions
Bug: 448420960
Change-Id: Ia9cb762bc9f5d9415a28ddebaf39855c46a51768
2025-10-09 10:19:04 +02:00
clang-format
bbbf29a9b6 tests/fuzzer: apply clang-format
Change-Id: I32b33cb911fe828b0c3f777e4e35fcd7b65068fb
2025-10-08 19:02:55 -07:00
James Zern
7a155ce913 .clang-format: add DerivePointerAlignment: false
This will become the default in later versions of clang-format with
--style=Google. This will normalize the pointer alignment in the
fuzzers.

Change-Id: I118aac9758ab2a1af82a907ee61f4a7af88209b1
2025-10-08 18:59:17 -07:00
James Zern
64dce5d826 api.md: mention 'exact' default in WebPEncodeLossless*
Note that config.exact defaults to 0 and point users to WebPEncode() if
the default isn't acceptable. This duplicates the comment from encode.h
for visibility. Follow up to:
6d2e11ec encode.h: mention 'exact' default in WebPEncodeLossless*

Bug: 449296530
Change-Id: Iba44dbcbb179bd80ea0a6b9e129b2c7e0a406916
2025-10-06 15:23:36 -07:00
Vincent Rabaud
1f0a494e80 Fix 32 bit writing in VP8LPutBits
>>32 is undefined. VP8LPutBits is never called for 32 bits in the
pipeline though.

Change-Id: I11f0a4c15380ab94213adab25f06b2ab73e73519
2025-10-01 09:15:34 +02:00
Vincent Rabaud
0e5f4ee3de Fix endianness with CMake.
Original patch from C. Neidahl.

Change-Id: I734d7cb33c3da5abb8d4faf074277dba53b37147
2025-09-29 22:26:10 +02:00
Vincent Rabaud
158b533d3e Fix potential integer overflow
Bug: 447862936

Change-Id: I58129333520facf213b7961a284e07fe04a0e55e
2025-09-29 21:11:03 +02:00
Vincent Rabaud
13f42ea2d2 Remove dead code
rg==NULL is dealt with above. Reported by Coverity.

Change-Id: I703698efaf9d5dd8cfd16309d3d83040a76c0749
2025-09-29 15:29:50 +02:00
Vincent Rabaud
74f6afd3e6 Merge "Have lossless use ImportYUVAFromRGB" into main 2025-09-27 04:56:31 -07:00
Vincent Rabaud
0d14d84bdb Have lossless use ImportYUVAFromRGB
There was a duplicated functionality with a lower quality which
could lead to decoded lossless WebP to YUV being different from
lossless WebP to PNG to YUV.

The rescaler is not using it yet.

Bug: 432241412
Change-Id: Id794880957935b69729d4b34ae453551d13364dc
2025-09-24 16:43:02 +02:00
James Zern
c00d83f664 {xcframework,ios}build.sh: remove 32-bit targets
The armv7, armv7s and i386 iOS targets were deprecated in Xcode 14 [1]
and failed to build with Xcode 16.4.

[1]: https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes
Building iOS projects with deployment targets for the armv7, armv7s, and
i386 architectures is no longer supported. (92831716)

Change-Id: I08d376fea64638d056258798bd7e586ca6880454
2025-09-22 15:35:12 -07:00
Philippe Antoine
d5b3883812 fuzz: fix typo in nalloc env variable
Change-Id: Icc0d48c8699b0fc8e820e89c44bfc55ddfe4d675
2025-09-21 20:51:59 +02:00
James Zern
aae8a3da33 Merge "Add fbounds-safety annotations in quant_levels_dec_utils.c/.h." into main 2025-09-18 12:46:00 -07:00
Arman Hasanzadeh
b4dbec562f Add fbounds-safety annotations in quant_levels_dec_utils.c/.h.
Reasoning:

Image Data Buffers:
The `data` parameter of `WebPDequantizeLevels` (in both .c and .h)
and `InitParams` (src/utils/quant_levels_dec_utils.c:232) is annotated
with `WEBP_SIZED_BY((long)stride * height)`, as it points to the start
of the image buffer.

The `src` and `dst` fields in `SmoothParams`
(src/utils/quant_levels_dec_utils.c:54) are annotated as
`WEBP_INDEXABLE`. They are initialized from `data` in `InitParams`
(L266) and are advanced row by row using pointer arithmetic (e.g.,
`p->src += p->stride` in `VFilter` L111, `p->dst += p->stride` in
`ApplyFilter` L165). `WEBP_INDEXABLE` is used because the pointers
iterate within the buffer and are only accessed with positive indices.

Scratch Buffers (`SmoothParams`):
Scratch buffers are allocated in `InitParams` via `WebPSafeMalloc`.
The local variable `mem` holding this allocation (L245) is explicitly
annotated as `WEBP_BIDI_INDEXABLE` to ensure safety when compiling with
error suppression.

- `start`, `cur`, `top`: These pointers are used for iteration and
  pointer arithmetic within the circular scratch buffer. They are
  annotated as `WEBP_INDEXABLE`.
- `end`: This pointer is annotated as `WEBP_BIDI_INDEXABLE` because it
  is used in subtraction (`p->end - width`) in `InitParams` (L257) to
  calculate `p->top`.
- `average`: This buffer is accessed sequentially up to `width`. It is
  annotated as `WEBP_COUNTED_BY(width)`. Initialization in `InitParams`
  is reordered (L261) to ensure `p->width` is set before `p->average`.
- `correction`: This lookup table requires negative indexing. To avoid
  using `WEBP_BIDI_INDEXABLE` in the struct, it is annotated as
  `WEBP_COUNTED_BY_OR_NULL(CORRECTION_LUT_SIZE)` (L75), pointing to the
  start of the buffer. `CORRECTION_LUT_SIZE` is defined (L33).
  `InitCorrectionLUT` (L188) and `ApplyFilter` (L147) calculate a local
  middle pointer which is explicitly annotated as `WEBP_BIDI_INDEXABLE`
  to allow safe negative indexing.

Local Pointers:
To ensure safety when compiling with error suppression (where locals
default to unsafe), explicit annotations are added to local pointers
derived from safe struct members:
- `VFilter` (L87): `src`, `cur`, `top`, `out` are `WEBP_INDEXABLE`.
- `HFilter` (L121): `in`, `out` are `WEBP_INDEXABLE`.
- `ApplyFilter` (L145): `average`, `dst` are `WEBP_INDEXABLE`.
- `CountLevels` (L214): `data` is `WEBP_INDEXABLE`.

Bug: 432511821
Change-Id: I6bdf86f80c94a5b182c5aef7e4092fe4ea24afb8
2025-09-17 15:31:57 -07:00
James Zern
d16489f66c Merge "fuzz: add allocations failures injections" into main 2025-09-17 15:18:26 -07:00
skal
0fd008f832 sharpyuv: remove unnecessary rgb_bit_depth -> bit_depth
Change-Id: I1c57dd83720ee286636762f0dd5ac586930d7838
2025-09-16 08:48:08 +02:00
James Zern
3779daa97f Merge "Add fbounds-safety annotations in huffman_utils.c/.h." into main 2025-08-27 12:34:36 -07:00
Arman Hasanzadeh
f2372fba3b Add fbounds-safety annotations in huffman_utils.c/.h.
Reasoning:

In `HuffmanTablesSegment` (`src/utils/huffman_utils.h`), `start`
was annotated `WEBP_COUNTED_BY_OR_NULL(size)` as it points to an
allocation of `size` elements. `curr_table` was annotated
`WEBP_UNSAFE_INDEXABLE` because it iterates within `[start, start
+ size)`, a bound that cannot be expressed statically in the struct
without ABI changes. The code manually checks bounds for
`curr_table` (e.g., `src/utils/huffman_utils.c:240-241`). To
support the annotation on `start`, allocation sites in
`VP8LBuildHuffmanTable` and `VP8LHuffmanTablesAllocate`
(`src/utils/huffman_utils.c`) were refactored to assign `start` and
`size` side-by-side, using `WEBP_BIDI_INDEXABLE` local variables to
hold the safe pointer returned by `WebPSafeMalloc`.
`VP8LHuffmanTablesDeallocate` was updated to set `size` to 0 when
`start` is freed.

The `root_table` parameter of `BuildHuffmanTable`
(`src/utils/huffman_utils.c:86`) was annotated `WEBP_BIDI_INDEXABLE` to
accommodate accesses to secondary tables beyond the `root table` size
since with explicitly annotating the local variable `table`
as `WEBP_BIDI_INDEXABLE`, `table` inherits its bounds from `root_table`.
Call sites in `VP8LBuildHuffmanTable`
required `WEBP_UNSAFE_FORGE_BIDI_INDEXABLE` to convert the unsafe
`curr_table` to the safe `root_table`.

The `table` parameter of `ReplicateValue`
(`src/utils/huffman_utils.c:59`) was annotated
`WEBP_COUNTED_BY(end - step + 1)` and the function was refactored to
avoid modifying `end`. Call sites in `BuildHuffmanTable` required
`WEBP_UNSAFE_FORGE_BIDI_INDEXABLE` because the strided access
patterns used for Huffman table construction cannot be statically
verified by the compiler.

Bug: 432511821
Change-Id: I77c5c82ac36bc9bb79cd5119a4113ac5d62af762
2025-08-27 10:31:58 -07:00
Yannis Guyon
fd2c2cc05b Merge "Add canvas carryover to libwebp anim_encode" into main 2025-08-26 13:40:53 -07:00
Philippe Antoine
fdc81cebda fuzz: add allocations failures injections
nallocfuzz comes from https://github.com/catenacyber/nallocfuzz

Change-Id: Ia5be1ffd91cccca135927f0f43da04abc8194d27
2025-08-26 21:20:12 +02:00
James Zern
ed8b34cf16 Merge "WebPEstimateBestFilter: remove unneeded stride param" into main 2025-08-26 10:49:51 -07:00
Yannis Guyon
94bfff3ffe Add canvas carryover to libwebp anim_encode
Memory footprint is increased by twice the canvas pixel count in bytes
at encoding. There should be little impact on encoding speed because
only buffer allocs/reads/writes are introduced, with little to no
added logic. Animation encoding may be 2% slower.

Bug: 42340478
Change-Id: I8f0048107a2bfbee7a8124c100f78eac93447d80
2025-08-22 12:00:22 +00:00
James Zern
1ba05593d0 Merge "Add missing {}s to conditionals & loops" into main 2025-08-21 12:37:16 -07:00
James Zern
b3f8ce7015 WebPEstimateBestFilter: remove unneeded stride param
The calling function, `GetFilterMap()` only takes `width` and `height`;
the alpha data is assumed to have a stride equal to its width. The
`WebPEstimateBestFilter()` was inconsistently using the parameters,
setting up the current row with `stride`, but accessing the previous one
with `width`.

Change-Id: I9dd90222b6923eea3626e426a61bdef3985546ff
2025-08-21 10:43:24 -07:00
James Zern
2074cb4ba1 Merge "Add fbounds-safety annotations for WebPRescaler." into main 2025-08-20 19:06:52 -07:00
Arman Hasanzadeh
1fdd4ef501 Add fbounds-safety annotations for WebPRescaler.
Reasoning:

The `irow` and `frow` pointers in `WebPRescaler`
(src/utils/rescaler_utils.h:49) were annotated with
`WEBP_COUNTED_BY(dst_width * num_channels)`. This is based on their
initialization in `WebPRescalerInit` (src/utils/rescaler_utils.c:82-83)
where they are assigned parts of the `work` buffer, whose total size
is `2 * dst_width * num_channels`. The `work` parameter in
`WebPRescalerInit` (src/utils/rescaler_utils.h:58,
src/utils/rescaler_utils.c:33) was also annotated accordingly.

To satisfy the side-by-side assignment requirement for external bounds,
assignments to `rescaler->irow` and `rescaler->frow` in
`WebPRescalerInit` were moved closer to the assignments of
`dst_width` and `num_channels` (src/utils/rescaler_utils.c:50-53).
Since `work` have bound information, `WEBP_UNSAFE_MEMSET` has
been changed to `memset`.

In `WebPRescalerImport` (src/utils/rescaler_utils.c:140-150), where
`irow` and `frow` are swapped, self-assignments for `dst_width` and
`num_channels` were added side-by-side with the pointer assignments.
Additionally, `WEBP_UNSAFE_FORGE_BIDI_INDEXABLE` was used for the
pointer assignments to handle the `WEBP_ASSUME_UNSAFE_INDEXABLE_ABI`
setting used during testing.

Bug: 432511821
Change-Id: If716fb79a06dee9e807eff060806daf038810523
2025-08-20 17:56:26 -07:00
James Zern
235286fd78 Add missing {}s to conditionals & loops
This was necessary after:
44257cb8 apply clang-format

Which made some single-line statements into multi-line. Using braces on
multi-line statements better conforms with the Google style guide.

Bug: 433996651
Change-Id: I615c0ecf3b94571f67fceadfe8c15914aea45ccb
2025-08-20 16:22:29 -07:00
James Zern
dab2cf21fa Merge "Add fbounds-safety annotations in palette.c/.h." into main 2025-08-20 15:10:00 -07:00