Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 02/21] avcodec/zlib_wrapper: Add wrappers for zlib inflateInit, inflateEnd
Date: Tue, 15 Mar 2022 21:05:52 +0100
Message-ID: <AS1PR01MB95648094D8A35D5C772293AD8F109@AS1PR01MB9564.eurprd01.prod.exchangelabs.com> (raw)
In-Reply-To: <AS1PR01MB956473F7529A463D0DFC230B8F109@AS1PR01MB9564.eurprd01.prod.exchangelabs.com>

It is not documented to be safe to call inflateEnd() on a z_stream
that has never been successfully been initialized by inflateInit(),
but just zeroed. It just happens to work and several codecs rely
on this (they have FF_CODEC_CAP_INIT_CLEANUP set and even call
inflateEnd() when inflateInit() failed or has never been called).
To avoid this, other codecs recorded whether their zstream has been
initialized successfully or not.

This commit adds wrappers for inflateInit() and inflateEnd() that
do what these other codecs do; furthermore, they also take care of
properly setting up the zstream before inflateInit() and emit
an error message in case of error.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 configure                 |  2 ++
 libavcodec/Makefile       |  1 +
 libavcodec/zlib_wrapper.c | 57 +++++++++++++++++++++++++++++++++++++++
 libavcodec/zlib_wrapper.h | 51 +++++++++++++++++++++++++++++++++++
 4 files changed, 111 insertions(+)
 create mode 100644 libavcodec/zlib_wrapper.c
 create mode 100644 libavcodec/zlib_wrapper.h

diff --git a/configure b/configure
index 82642deabe..6254dc9dc1 100755
--- a/configure
+++ b/configure
@@ -2461,6 +2461,7 @@ CONFIG_EXTRA="
     idctdsp
     iirfilter
     mdct15
+    inflate_wrapper
     intrax8
     iso_media
     ividsp
@@ -2722,6 +2723,7 @@ faanidct_select="idctdsp"
 h264dsp_select="startcode"
 hevcparse_select="atsc_a53 golomb"
 frame_thread_encoder_deps="encoders threads"
+inflate_wrapper_deps="zlib"
 intrax8_select="blockdsp idctdsp"
 iso_media_select="mpeg4audio"
 mdct_select="fft"
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index f36b2e992d..62c8e34963 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -104,6 +104,7 @@ OBJS-$(CONFIG_HUFFYUVENCDSP)           += huffyuvencdsp.o
 OBJS-$(CONFIG_IDCTDSP)                 += idctdsp.o simple_idct.o jrevdct.o
 OBJS-$(CONFIG_IIRFILTER)               += iirfilter.o
 OBJS-$(CONFIG_MDCT15)                  += mdct15.o
+OBJS-$(CONFIG_INFLATE_WRAPPER)         += zlib_wrapper.o
 OBJS-$(CONFIG_INTRAX8)                 += intrax8.o intrax8dsp.o msmpeg4data.o
 OBJS-$(CONFIG_IVIDSP)                  += ivi_dsp.o
 OBJS-$(CONFIG_JNI)                     += ffjni.o jni.o
diff --git a/libavcodec/zlib_wrapper.c b/libavcodec/zlib_wrapper.c
new file mode 100644
index 0000000000..b15d5be2b8
--- /dev/null
+++ b/libavcodec/zlib_wrapper.c
@@ -0,0 +1,57 @@
+/*
+ * Wrappers for zlib
+ * Copyright (C) 2022 Andreas Rheinhardt
+ *
+ * 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 <zlib.h>
+
+#include "libavutil/error.h"
+#include "libavutil/log.h"
+#include "zlib_wrapper.h"
+
+int ff_inflate_init(FFZStream *z, void *logctx)
+{
+    z_stream *const zstream = &z->zstream;
+    int zret;
+
+    z->inited = 0;
+    zstream->next_in  = Z_NULL;
+    zstream->avail_in = 0;
+    zstream->zalloc   = Z_NULL;
+    zstream->zfree    = Z_NULL;
+    zstream->opaque   = Z_NULL;
+
+    zret = inflateInit(zstream);
+    if (zret == Z_OK) {
+        z->inited = 1;
+    } else {
+        av_log(logctx, AV_LOG_ERROR, "inflateInit error %d, message: %s\n",
+               zret, zstream->msg ? zstream->msg : "");
+        return AVERROR_EXTERNAL;
+    }
+    return 0;
+}
+
+void ff_inflate_end(FFZStream *z)
+{
+    if (z->inited) {
+        z->inited = 0;
+        inflateEnd(&z->zstream);
+    }
+}
diff --git a/libavcodec/zlib_wrapper.h b/libavcodec/zlib_wrapper.h
new file mode 100644
index 0000000000..0e91713b25
--- /dev/null
+++ b/libavcodec/zlib_wrapper.h
@@ -0,0 +1,51 @@
+/*
+ * Wrappers for zlib
+ * Copyright (C) 2022 Andreas Rheinhardt
+ *
+ * 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
+ */
+
+#ifndef AVCODEC_ZLIB_WRAPPER_H
+#define AVCODEC_ZLIB_WRAPPER_H
+
+#include <zlib.h>
+
+typedef struct FFZStream {
+    z_stream zstream;
+    int inited;
+} FFZStream;
+
+/**
+ * Wrapper around inflateInit(). It initializes the fields that zlib
+ * requires to be initialized before inflateInit().
+ * In case of error it also returns an error message to the provided logctx;
+ * in any case, it sets zstream->inited to indicate whether inflateInit()
+ * succeeded.
+ * @return Returns 0 on success or a negative error code on failure
+ */
+int ff_inflate_init(FFZStream *zstream, void *logctx);
+
+/**
+ * Wrapper around inflateEnd(). It calls inflateEnd() iff
+ * zstream->inited is set and resets zstream->inited.
+ * It is therefore safe to be called even if
+ * ff_inflate_init() has never been called on it (or errored out)
+ * provided that the FFZStream (or just FFZStream.inited) has been zeroed.
+ */
+void ff_inflate_end(FFZStream *zstream);
+
+#endif /* AVCODEC_ZLIB_WRAPPER_H */
-- 
2.32.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2022-03-15 20:06 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-15 20:03 [FFmpeg-devel] [PATCH 01/21] avcodec/pngenc: Avoid potentially truncating integers Andreas Rheinhardt
2022-03-15 20:05 ` Andreas Rheinhardt [this message]
2022-03-16 19:24   ` [FFmpeg-devel] [PATCH 02/21] avcodec/zlib_wrapper: Add wrappers for zlib inflateInit, inflateEnd Tomas Härdin
2022-03-16 19:32     ` Andreas Rheinhardt
2022-03-16 20:07       ` Tomas Härdin
2022-03-17  7:29         ` Andreas Rheinhardt
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 03/21] avcodec/zmbv: Use ff_inflate_init/end() Andreas Rheinhardt
2022-03-16 19:31   ` Tomas Härdin
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 04/21] avcodec/zerocodec: " Andreas Rheinhardt
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 05/21] avcodec/wcmv: " Andreas Rheinhardt
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 06/21] avcodec/tscc: " Andreas Rheinhardt
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 07/21] avcodec/rasc: " Andreas Rheinhardt
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 08/21] avcodec/mwsc: " Andreas Rheinhardt
2022-03-15 20:05 ` [FFmpeg-devel] [PATCH 09/21] avcodec/mvha: " Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 10/21] avcodec/mscc: " Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 11/21] avcodec/lcldec: Use ff_inflate_init/end(), cleanup generically Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 12/21] avcodec/flashsv: Use ff_inflate_init/end() Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 13/21] avcodec/zlib_wrapper: Use our allocation, freeing functions Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 14/21] avcodec/lscrdec: Don't open and close z_streams unnecessarily Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 15/21] avcodec/pngdec: " Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 16/21] avcodec/pngenc: Don't use deflateInit2() with default parameters Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 17/21] avcodec/zlib_wrapper: Add wrapper for deflateInit() Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 18/21] avcodec/zmbvenc: Use ff_deflate_init/end() wrappers Andreas Rheinhardt
2022-03-16 20:03   ` Tomas Härdin
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 19/21] avcodec/pngenc: " Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 20/21] avcodec/lclenc: " Andreas Rheinhardt
2022-03-15 20:06 ` [FFmpeg-devel] [PATCH 21/21] avcodec/flashsv2enc: Avoid opening and closing z_stream Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AS1PR01MB95648094D8A35D5C772293AD8F109@AS1PR01MB9564.eurprd01.prod.exchangelabs.com \
    --to=andreas.rheinhardt@outlook.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git