[FFmpeg-devel] [PATCH] ffprobe: redesign json_escape_str(), to make use of a global buffer

Stefano Sabatini stefasab at gmail.com
Tue Oct 18 19:03:39 CEST 2011


On date Saturday 2011-10-15 22:31:18 +0200, Clément Bœsch encoded:
> On Fri, Oct 14, 2011 at 05:50:59PM +0200, Stefano Sabatini wrote:
> > The new code avoids to call av_malloc/av_free when escaping is needed
> > (possibly faster), and avoids an integer overflow in case of a huge
> 
> Not "possibly" faster, it is: 1.5sec while 1.9sec previously with my test
> case.
> 
> > string and provides feedback when a string cannot be escaped.
> > 
> > When a string cannot be escaped, a special string is printed instead.
> > ---
> >  ffprobe.c |  113 +++++++++++++++++++++++++++++++++++++++++-------------------
> >  1 files changed, 77 insertions(+), 36 deletions(-)
> > 
> > diff --git a/ffprobe.c b/ffprobe.c
> [...]
> > +static const char *json_escape_str(char **dst, size_t *dst_size, const char *src,
> > +                                   void *log_ctx)
> >  {
> >      static const char json_escape[] = {'"', '\\', '\b', '\f', '\n', '\r', '\t', 0};
> >      static const char json_subst[]  = {'"', '\\',  'b',  'f',  'n',  'r',  't', 0};
> > -    char *ret, *p;
> > -    int i, len = 0;
> > +    const char *p;
> > +    char *q;
> > +    size_t size = 1;
> >  
> >      // compute the length of the escaped string
> > -    for (i = 0; s[i]; i++) {
> > -        if (strchr(json_escape, s[i]))     len += 2; // simple escape
> > -        else if ((unsigned char)s[i] < 32) len += 6; // handle non-printable chars
> > -        else                               len += 1; // char copy
> > +    for (p = src; *p; p++) {
> > +        ESCAPE_CHECK_SIZE(src, size, SIZE_MAX-6);
> > +        if (strchr(json_escape, *p))     size += 2; // simple escape
> > +        else if ((unsigned char)*p < 32) size += 6; // handle non-printable chars
> > +        else                             size += 1; // char copy
> >      }
> 
> Not that I care much, but why did you change the i = 0 ... into a pointer?

An integer can overflow.

> Otherwise looks good to me, thanks.

Pushed.


More information about the ffmpeg-devel mailing list