summaryrefslogtreecommitdiff
path: root/libavcodec/zlib_wrapper.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-03-15 10:46:09 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-03-19 00:18:35 +0100
commitdd8a55cb3e2014934a176a9962010a3c87d12704 (patch)
tree52aebbfec3baca47f46e837c96fd5eedc18969ba /libavcodec/zlib_wrapper.c
parentdb57a5370bd37105d389a45b04bf4970802407ec (diff)
downloadffmpeg-dd8a55cb3e2014934a176a9962010a3c87d12704.tar.gz
avcodec/zlib_wrapper: Add wrappers for zlib inflateInit, inflateEnd
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>
Diffstat (limited to 'libavcodec/zlib_wrapper.c')
-rw-r--r--libavcodec/zlib_wrapper.c57
1 files changed, 57 insertions, 0 deletions
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);
+ }
+}