Fix ignore_too_much_pixel_data infinite loop
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index b4f77fc..ce57f3e 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -11045,8 +11045,10 @@
label_0_continue:;
while (v_src_ri < ((uint64_t)(a_src.len))) {
v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri);
- if ((self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) &&
- !self->private_impl.f_quirk_enabled_ignore_too_much_pixel_data) {
+ if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) {
+ if (self->private_impl.f_quirk_enabled_ignore_too_much_pixel_data) {
+ return NULL;
+ }
return wuffs_base__error__too_much_data;
}
v_dst = wuffs_base__table_u8__row(v_tab, self->private_impl.f_dst_y);
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index 2f1fce8..d37643d 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -1009,8 +1009,10 @@
while src_ri < args.src.length() {
src = args.src[src_ri:]
- if (this.dst_y >= this.frame_rect_y1) and
- (not this.quirk_enabled_ignore_too_much_pixel_data) {
+ if this.dst_y >= this.frame_rect_y1 {
+ if this.quirk_enabled_ignore_too_much_pixel_data {
+ return ok
+ }
return base."#too much data"
}
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index bfc55ee..d90f04b 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -1031,6 +1031,55 @@
return NULL;
}
+const char* test_wuffs_gif_decode_zero_width_frame() {
+ CHECK_FOCUS(__func__);
+ wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
+ .data = global_src_slice,
+ });
+ const char* status =
+ read_file(&src, "test/data/artificial/gif-zero-width-frame.gif");
+ if (status) {
+ return status;
+ }
+ int q;
+ for (q = 0; q < 2; q++) {
+ src.meta.ri = 0;
+
+ wuffs_gif__decoder dec;
+ status = wuffs_gif__decoder__initialize(
+ &dec, sizeof dec, WUFFS_VERSION,
+ WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+ if (status) {
+ RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+ }
+ wuffs_gif__decoder__set_quirk_enabled(
+ &dec, wuffs_gif__quirk_ignore_too_much_pixel_data, q);
+
+ wuffs_base__image_config ic = ((wuffs_base__image_config){});
+ status = wuffs_gif__decoder__decode_image_config(
+ &dec, &ic, wuffs_base__io_buffer__reader(&src));
+ if (status) {
+ RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status);
+ }
+
+ wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
+ status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
+ global_pixel_slice);
+ if (status) {
+ RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status);
+ }
+
+ const char* got = wuffs_gif__decoder__decode_frame(
+ &dec, &pb, wuffs_base__io_buffer__reader(&src), global_work_slice,
+ NULL);
+ const char* want = q ? NULL : wuffs_base__error__too_much_data;
+ if (got != want) {
+ RETURN_FAIL("q=%d: decode_frame: got \"%s\", want \"%s\"", q, got, want);
+ }
+ }
+ return NULL;
+}
+
const char* test_wuffs_gif_decode_bgra_nonpremul() {
CHECK_FOCUS(__func__);
return do_test_wuffs_gif_decode("test/data/bricks-dither.gif",
@@ -2108,6 +2157,7 @@
test_wuffs_gif_decode_pixel_data_not_enough, //
test_wuffs_gif_decode_pixel_data_too_much_sans_quirk, //
test_wuffs_gif_decode_pixel_data_too_much_with_quirk, //
+ test_wuffs_gif_decode_zero_width_frame, //
test_wuffs_gif_frame_dirty_rect, //
test_wuffs_gif_num_decoded_frame_configs, //
test_wuffs_gif_num_decoded_frames, //
diff --git a/test/data/artificial/gif-zero-width-frame.gif b/test/data/artificial/gif-zero-width-frame.gif
new file mode 100644
index 0000000..b88b4b4
--- /dev/null
+++ b/test/data/artificial/gif-zero-width-frame.gif
Binary files differ
diff --git a/test/data/artificial/gif-zero-width-frame.gif.make-artificial.txt b/test/data/artificial/gif-zero-width-frame.gif.make-artificial.txt
new file mode 100644
index 0000000..a7d16b5
--- /dev/null
+++ b/test/data/artificial/gif-zero-width-frame.gif.make-artificial.txt
@@ -0,0 +1,23 @@
+# Feed this file to script/make-artificial.go
+
+make gif
+
+header
+
+image {
+ imageWidthHeight 2 2
+ palette {
+ 0x00 0x00 0xFF
+ 0x11 0x00 0xFF
+ 0x22 0x00 0xFF
+ 0x33 0x00 0xFF
+ }
+}
+
+frame {
+ frameLeftTopWidthHeight 0 0 0 0
+}
+# The frame is 0 pixels, but we supply 1.
+lzw 2 0x00
+
+trailer