[FFmpeg-devel] [PATCH] fix potential ff_mov_lang_to_iso639 segfault

Aurelien Jacobs aurel
Wed Jan 21 23:32:47 CET 2009


Baptiste Coudurier wrote:

> Hi Aurel,
> 
> Aurelien Jacobs wrote:
> > Hi,
> > 
> > ff_mov_lang_to_iso639() takes a code parameter as an int and uses it
> > to address memory: mov_mdhd_language_map[code]
> > There is proper upper bound check, but no lower bound check, so negative
> > value of code could generate a segfault.
> > Code is read directly from the mov bitstream, so specially crafted file
> > could trigger this segfault.
> > Attached patch changes code to unsigned to avoid this problem.
> > It may solve the segfault reported in issue793 (an mp3 file miss-detected
> > as mov).
> > 
> > Aurel
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > Index: libavformat/isom.c
> > ===================================================================
> > --- libavformat/isom.c	(revision 16686)
> > +++ libavformat/isom.c	(working copy)
> > @@ -274,7 +274,7 @@
> >      return code;
> >  }
> >  
> > -int ff_mov_lang_to_iso639(int code, char *to)
> > +int ff_mov_lang_to_iso639(unsigned int code, char *to)
> >  {
> >      int i;
> >      /* is it the mangled iso code? */
> > Index: libavformat/isom.h
> > ===================================================================
> > --- libavformat/isom.h	(revision 16686)
> > +++ libavformat/isom.h	(working copy)
> > @@ -33,7 +33,7 @@
> >  extern const AVCodecTag ff_codec_movsubtitle_tags[];
> >  
> >  int ff_mov_iso639_to_lang(const char *lang, int mp4);
> > -int ff_mov_lang_to_iso639(int code, char *to);
> > +int ff_mov_lang_to_iso639(unsigned int code, char *to);
> >  
> >  typedef struct {
> >      int count;
> > Index: libavformat/mov.c
> > ===================================================================
> > --- libavformat/mov.c	(revision 16686)
> > +++ libavformat/mov.c	(working copy)
> > @@ -493,7 +493,7 @@
> >      AVStream *st = c->fc->streams[c->fc->nb_streams-1];
> >      MOVStreamContext *sc = st->priv_data;
> >      int version = get_byte(pb);
> > -    int lang;
> > +    unsigned int lang;
> >  
> >      if (version > 1)
> >          return -1; /* unsupported */
> > 
> 
> Patch ok with "unsigned" instead of "unsigned int", shorter :>

OK. Applied with unsigned.

Aurel




More information about the ffmpeg-devel mailing list