[FFmpeg-devel] [PATCH] Implement av_strerror()

Måns Rullgård mans
Sun Mar 14 19:17:18 CET 2010


Stefano Sabatini <stefano.sabatini-lala at poste.it> writes:

> On date Sunday 2010-03-14 15:52:41 +0000, M?ns Rullg?rd encoded:
>> Stefano Sabatini <stefano.sabatini-lala at poste.it> writes:
> [...]
>> > +int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
>> > +{
>> > +    int ret = 0;
>> > +    const char *errstr = NULL;
>> > +
>> > +    switch (errnum) {
>> > +#define HANDLE_ERROR(ERR, ERRSTR) case AVERROR_##ERR: errstr = ERRSTR; break
>> > +
>> > +#if LIBAVUTIL_VERSION_MAJOR < 51
>> > +        HANDLE_ERROR(IO           , "I/O error");
>> > +        HANDLE_ERROR(NOENT        , "No such file or directory");
>> > +        HANDLE_ERROR(NOMEM        , "Not enough memory");
>> > +#endif
>> > +        HANDLE_ERROR(EOF          , "End of file");
>> > +        HANDLE_ERROR(INVALIDDATA  , "Invalid data found");
>> > +        HANDLE_ERROR(NOFMT        , "Unknown format");
>> > +        HANDLE_ERROR(NOTSUPP      , "Operation not supported");
>> > +        HANDLE_ERROR(NUMEXPECTED  , "Number syntax expected in filename");
>> > +        HANDLE_ERROR(PATCHWELCOME , "Not yet implemented in FFmpeg, patches welcome");
>> > +    }
>> 
>> Please drop the macro.  It only obfuscates.
>
> Dropeed.
>
>> > +    if (errstr) {
>> > +        av_strlcatf(errbuf, errbuf_size, errstr);
>> 
>> av_strlcpy()
>> 
>> > +    } else {
>> > +#if _POSIX_C_SOURCE >= 200112L
>> > +        ret = strerror_r(AVUNERROR(errnum), errbuf, errbuf_size);
>> > +#else
>> > +        av_strlcatf(errbuf, errbuf_size, "Error number %d", errnum);
>> > +#endif
>> 
>> This is wrong for two reasons:
>> 
>> 1.  We define _POSIX_C_SOURCE to 200112.
>> 2.  strerror_r() is optional.
>> 
>> The correct solution is to check_func it in configure.
>
> Done like that.
> -- 
> FFmpeg = Frenzy Frightening Multipurpose Peaceless Extended Guru
>
> From 1dd05293bed424bec0cebf4cf6486d436c13f36c Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> Date: Sun, 14 Mar 2010 01:06:46 +0100
> Subject: [PATCH 7/8] Implement av_strerror().
>
> ---
>  configure          |    2 +
>  libavutil/Makefile |    1 +
>  libavutil/avutil.h |    2 +-
>  libavutil/error.c  |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  libavutil/error.h  |    9 ++++++++
>  5 files changed, 67 insertions(+), 1 deletions(-)
>  create mode 100644 libavutil/error.c
>
> diff --git a/configure b/configure
> index 60834ca..459e990 100755
> --- a/configure
> +++ b/configure
> @@ -1071,6 +1071,7 @@ HAVE_LIST="
>      soundcard_h
>      poll_h
>      setrlimit
> +    strerror_r
>      struct_addrinfo
>      struct_ipv6_mreq
>      struct_sockaddr_in6
> @@ -2525,6 +2526,7 @@ check_func  ${malloc_prefix}memalign            && enable memalign
>  check_func  mkstemp
>  check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
>  check_func  setrlimit
> +check_func  strerror_r
>  check_func_headers io.h setmode
>  check_func_headers lzo/lzo1x.h lzo1x_999_compress
>  check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi

configure part OK.

> diff --git a/libavutil/Makefile b/libavutil/Makefile
> index 5b6cd0e..79506c0 100644
> --- a/libavutil/Makefile
> +++ b/libavutil/Makefile
> @@ -30,6 +30,7 @@ OBJS = adler32.o                                                        \
>         base64.o                                                         \
>         crc.o                                                            \
>         des.o                                                            \
> +       error.o                                                          \
>         fifo.o                                                           \
>         intfloat_readwrite.o                                             \
>         lfg.o                                                            \
> diff --git a/libavutil/avutil.h b/libavutil/avutil.h
> index 47630a7..968787c 100644
> --- a/libavutil/avutil.h
> +++ b/libavutil/avutil.h
> @@ -40,7 +40,7 @@
>  #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
>  
>  #define LIBAVUTIL_VERSION_MAJOR 50
> -#define LIBAVUTIL_VERSION_MINOR 12
> +#define LIBAVUTIL_VERSION_MINOR 13
>  #define LIBAVUTIL_VERSION_MICRO  0
>  
>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
> diff --git a/libavutil/error.c b/libavutil/error.c
> new file mode 100644
> index 0000000..975a394
> --- /dev/null
> +++ b/libavutil/error.c
> @@ -0,0 +1,54 @@
> +/*
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include "avutil.h"
> +#include "avstring.h"
> +
> +int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
> +{
> +    int ret = 0;
> +    const char *errstr = NULL;
> +    *errbuf = 0;
> +
> +    switch (errnum) {
> +#if LIBAVUTIL_VERSION_MAJOR < 51
> +    case AVERROR_IO:           errstr = "I/O error"; break;
> +    case AVERROR_NOENT:        errstr = "No such file or directory"; break;
> +    case AVERROR_NOMEM:        errstr = "Not enough memory"; break;
> +#endif
> +    case AVERROR_EOF:          errstr = "End of file"; break;
> +    case AVERROR_INVALIDDATA:  errstr = "Invalid data found"; break;
> +    case AVERROR_NOFMT:        errstr = "Unknown format"; break;
> +    case AVERROR_NOTSUPP:      errstr = "Operation not supported"; break;
> +    case AVERROR_NUMEXPECTED:  errstr = "Number syntax expected in filename"; break;
> +    case AVERROR_PATCHWELCOME: errstr = "Not yet implemented in FFmpeg, patches welcome"; break;
> +    }
> +
> +    if (errstr) {
> +        av_strlcatf(errbuf, errbuf_size, errstr);

This has to be av_strlcpy().  The buffer is uninitialised.

> +    } else {
> +#if HAVE_STRERROR_R
> +        ret = strerror_r(AVUNERROR(errnum), errbuf, errbuf_size);
> +#else
> +        av_strlcatf(errbuf, errbuf_size, "Error number %d", errnum);

snprintf

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list