On 10/2/2023 7:23 PM, Michael Niedermayer wrote:
Hi

On Tue, Sep 05, 2023 at 09:25:45PM +0000, Paul B Mahol wrote:
ffmpeg | branch: master | Paul B Mahol <one...@gmail.com> | Tue Sep  5 23:14:58 
2023 +0200| [d464a687c9dd03246795d62151809167e8381932] | committer: Paul B Mahol

avcodec/hcadec: support decoding with extradata provided in first packet

I cannot find this patch on the mailing list

Also this adds null pointer writes
The init_hca() function which previously was only called once and failure
ended all further processing now is called optionally per frame and its
failure does not stop further processing so half initialized contexts
can be created by an attacker

Note, this sort of stuff delays the release

thx

Does the following fix it?

diff --git a/libavcodec/hcadec.c b/libavcodec/hcadec.c
index 6f277afb96..4e30d553de 100644
--- a/libavcodec/hcadec.c
+++ b/libavcodec/hcadec.c
@@ -65,6 +65,7 @@ typedef struct HCAContext {
     uint8_t stereo_band_count;
     uint8_t bands_per_hfr_group;

+    // Set during init() and freed on close(). Untouched on flush()
     av_tx_fn           tx_fn;
     AVTXContext       *tx_ctx;
     AVFloatDSPContext *fdsp;
@@ -196,6 +197,13 @@ static inline unsigned ceil2(unsigned a, unsigned b)
     return (b > 0) ? (a / b + ((a % b) ? 1 : 0)) : 0;
 }

+static av_cold void decode_flush(AVCodecContext *avctx)
+{
+    HCAContext *c = avctx->priv_data;
+
+    memset(c, 0, offsetof(HCAContext, tx_fn));
+}
+
 static int init_hca(AVCodecContext *avctx, const uint8_t *extradata,
                     const int extradata_size)
 {
@@ -205,6 +213,8 @@ static int init_hca(AVCodecContext *avctx, const uint8_t 
*extradata,
     unsigned b, chunk;
     int version, ret;

+    decode_flush(avctx);
+
     if (extradata_size < 36)
         return AVERROR_INVALIDDATA;

@@ -340,6 +350,9 @@ static int init_hca(AVCodecContext *avctx, const uint8_t 
*extradata,
             return AVERROR_INVALIDDATA;
     }

+    // Done last to signal init() finished
+    c->crc_table = av_crc_get_table(AV_CRC_16_ANSI);
+
     return 0;
 }

@@ -350,7 +363,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
     int ret;

     avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
-    c->crc_table = av_crc_get_table(AV_CRC_16_ANSI);

     if (avctx->ch_layout.nb_channels <= 0 || avctx->ch_layout.nb_channels > 
FF_ARRAY_ELEMS(c->ch))
         return AVERROR(EINVAL);
@@ -534,6 +546,9 @@ static int decode_frame(AVCodecContext *avctx, AVFrame 
*frame,
         }
     }

+    if (!c->crc_table)
+        return AVERROR_INVALIDDATA;
+
     if (c->key || c->subkey) {
         uint8_t *data, *cipher = c->cipher;

@@ -602,6 +617,7 @@ const FFCodec ff_hca_decoder = {
     .priv_data_size = sizeof(HCAContext),
     .init           = decode_init,
     FF_CODEC_DECODE_CB(decode_frame),
+    .flush          = decode_flush,
     .close          = decode_close,
     .p.capabilities = AV_CODEC_CAP_DR1,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to