Commit 2defa3985a for ffmpeg
commit 2defa3985ac653099d5568f2679f35b5e9c427b4
Author: Michael Niedermayer <michael@niedermayer.cc>
Date: Sat Oct 10 04:57:53 2026 +0200
avcodec/mjpegdec: handle THP restart intervals in all scan types
Timeout Replicated through API
Fixes: Timeout
Fixes: 565276248/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_THP_fuzzer-6001511570931712
Fixes: Z70IPpK3idWD
Regression since: 5672c410a6adc2764791e7fcc0e34acea07ac263
Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 3dc8662abb..cbb7268ed9 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -1477,20 +1477,9 @@ next_field:
const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);
int restart;
- if (s->avctx->codec_id == AV_CODEC_ID_THP) {
- if (s->restart_count < 0) {
- ret = ff_mjpeg_unescape_sos(s);
- if (ret < 0)
- return ret;
- }
- restart = ff_mjpeg_should_restart(s);
- if (restart)
- align_get_bits(&s->gb);
- } else {
- ret = ff_mjpeg_handle_restart(s, &restart);
- if (ret < 0)
- return ret;
- }
+ ret = ff_mjpeg_handle_restart(s, &restart);
+ if (ret < 0)
+ return ret;
if (restart) {
for (i = 0; i < nb_components; i++)
s->last_dc[i] = (4 << s->bits);
diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h
index 5ba96eaa3e..9162de851f 100644
--- a/libavcodec/mjpegdec.h
+++ b/libavcodec/mjpegdec.h
@@ -217,8 +217,13 @@ static inline int ff_mjpeg_should_restart(MJpegDecodeContext *s)
static inline int ff_mjpeg_handle_restart(MJpegDecodeContext *s, int *restart)
{
+ int first = s->restart_count < 0;
*restart = ff_mjpeg_should_restart(s);
if (*restart) {
+ if (s->avctx->codec_id == AV_CODEC_ID_THP && !first) {
+ align_get_bits(&s->gb);
+ return 0;
+ }
int ret = ff_mjpeg_unescape_sos(s);
if (ret < 0)
return ret;