[FFmpeg-devel] [PATCH 1/2] asfdec_o: only set asf_pkt->data_size after sanity checks

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Fri Jan 15 01:01:58 CET 2016


On 05.01.2016 13:25, Andreas Cadhalpun wrote:
> Otherwise invalid values are used unchecked in the next run.
> This can cause NULL pointer dereferencing.
> 
> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> ---
>  libavformat/asfdec_o.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/libavformat/asfdec_o.c b/libavformat/asfdec_o.c
> index 38751d7..79b9ee4 100644
> --- a/libavformat/asfdec_o.c
> +++ b/libavformat/asfdec_o.c
> @@ -1136,14 +1136,15 @@ static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt)
>  {
>      ASFContext *asf = s->priv_data;
>      AVIOContext *pb = s->pb;
> -    int ret;
> +    int ret, data_size;
>  
>      if (!asf_pkt->data_size) {
> -        asf_pkt->data_size = asf_pkt->size_left = avio_rl32(pb); // read media object size
> -        if (asf_pkt->data_size <= 0)
> +        data_size = avio_rl32(pb); // read media object size
> +        if (data_size <= 0)
>              return AVERROR_INVALIDDATA;
> -        if ((ret = av_new_packet(&asf_pkt->avpkt, asf_pkt->data_size)) < 0)
> +        if ((ret = av_new_packet(&asf_pkt->avpkt, data_size)) < 0)
>              return ret;
> +        asf_pkt->data_size = asf_pkt->size_left = data_size;
>      } else
>          avio_skip(pb, 4); // reading of media object size is already done
>      asf_pkt->dts = avio_rl32(pb); // read presentation time
> @@ -1212,14 +1213,15 @@ static int asf_read_single_payload(AVFormatContext *s, AVPacket *pkt,
>      int64_t  offset;
>      uint64_t size;
>      unsigned char *p;
> -    int ret;
> +    int ret, data_size;
>  
>      if (!asf_pkt->data_size) {
> -        asf_pkt->data_size = asf_pkt->size_left = avio_rl32(pb); // read media object size
> -        if (asf_pkt->data_size <= 0)
> +        data_size = avio_rl32(pb); // read media object size
> +        if (data_size <= 0)
>              return AVERROR_EOF;
> -        if ((ret = av_new_packet(&asf_pkt->avpkt, asf_pkt->data_size)) < 0)
> +        if ((ret = av_new_packet(&asf_pkt->avpkt, data_size)) < 0)
>              return ret;
> +        asf_pkt->data_size = asf_pkt->size_left = data_size;
>      } else
>          avio_skip(pb, 4); // skip media object size
>      asf_pkt->dts = avio_rl32(pb); // read presentation time
> 

Pushed now, as Alexandra (the author over at Libav) seems fine with it.

Best regards,
Andreas


More information about the ffmpeg-devel mailing list