[FFmpeg-devel] [PATCH] ffmpeg: check fclose return values
Ganesh Ajjanagadde
gajjanagadde at gmail.com
Thu Jan 7 06:53:20 CET 2016
On Wed, Jan 6, 2016 at 9:00 PM, Ganesh Ajjanagadde
<gajjanagadde at gmail.com> wrote:
> In the spirit of commit a956840cbc. Simple method to reproduce:
> pass -vstats_file /dev/full to ffmpeg.
>
> All raw fclose usages in ffmpeg.c taken care of here.
>
> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
> ---
> ffmpeg.c | 13 ++++++++++---
> 1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/ffmpeg.c b/ffmpeg.c
> index 0c83165..858e6d7 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -554,8 +554,12 @@ static void ffmpeg_cleanup(int ret)
> av_freep(&input_streams[i]);
> }
>
> - if (vstats_file)
> - fclose(vstats_file);
> + if (vstats_file) {
> + if ((ret = fclose(vstats_file)) < 0)
> + av_log(NULL, AV_LOG_ERROR,
> + "Error closing vstats file, loss of information possible: %s\n",
> + av_err2str(ret));
> + }
> av_freep(&vstats_filename);
>
> av_freep(&input_streams);
> @@ -4200,7 +4204,10 @@ static int transcode(void)
> ost = output_streams[i];
> if (ost) {
> if (ost->logfile) {
> - fclose(ost->logfile);
> + if ((ret = fclose(ost->logfile)) < 0)
> + av_log(NULL, AV_LOG_ERROR,
> + "Error closing logfile, loss of information possible: %s\n",
> + av_err2str(ret));
> ost->logfile = NULL;
> }
> av_freep(&ost->forced_kf_pts);
> --
> 2.6.4
>
Should have mentioned this earlier, but this fclose related business
was due to listening to:
https://www.irill.org/events/ghm-gnu-hackers-meeting/videos/jim-meyering-goodbye-world-the-perils-of-relying-on-output-streams-in-c,
slides: https://www.gnu.org/ghm/2011/paris/slides/jim-meyering-goodbye-world.pdf.
For a more sustainable solution, we should create an API in e.g
libavutil for this IMHO, since fclose is called not just in ffmpeg but
also in libavfilter. There may be 2 ways of doing this:
1. Developing it organically in FFmpeg.
2. Using gnulib and associated close_stream/other API's (e.g
https://github.com/coreutils/gnulib/blob/master/lib/close-stream.c) as
suggested in the talk as a basis. There are some problems:
a) Licensing - it is GPL. There is some mention regarding relicensing
for gnulib, https://www.gnu.org/software/gnulib/manual/html_node/Copyright.html,
so it may be ok to relicense under lgpl. However, I am not a lawyer.
b) Care may need to be taken to make sure it is portable enough, and
refactoring may be necessary.
More information about the ffmpeg-devel
mailing list