All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
To: u-boot@lists.denx.de
Subject: [PATCH v3 3/5] include/u-boot, lib/zlib: add sources for zlib decompression
Date: Tue, 21 Jul 2020 11:22:57 +0200	[thread overview]
Message-ID: <20200721092259.26916-4-joaomarcos.costa@bootlin.com> (raw)
In-Reply-To: <20200721092259.26916-1-joaomarcos.costa@bootlin.com>

Add zlib (v1.2.11) uncompr() function to U-Boot. SquashFS depends on
this function to decompress data from a raw disk image. The actual
support for zlib into SquashFS sources will be added in a follow-up
commit.

Signed-off-by: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
---
Changes in v3:
	- No changes since v2.
Changes in v2:
	- Changed commit title and message, which were wrong and/or misleading
	in v1.
 include/u-boot/zlib.h | 32 ++++++++++++++
 lib/zlib/uncompr.c    | 97 +++++++++++++++++++++++++++++++++++++++++++
 lib/zlib/zlib.c       |  1 +
 3 files changed, 130 insertions(+)
 create mode 100644 lib/zlib/uncompr.c

diff --git a/include/u-boot/zlib.h b/include/u-boot/zlib.h
index e23ceb50ca..a33cc8780d 100644
--- a/include/u-boot/zlib.h
+++ b/include/u-boot/zlib.h
@@ -110,6 +110,12 @@ extern "C" {
 #  define voidp                 z_voidp
 #endif
 
+#if defined(ZLIB_CONST) && !defined(z_const)
+#  define z_const const
+#else
+#  define z_const
+#endif
+
 #if defined(__MSDOS__) && !defined(MSDOS)
 #  define MSDOS
 #endif
@@ -710,6 +716,32 @@ ZEXTERN  uInt ZEXPORT crc32  OF((uInt crc, const Bytef *buf, uInt len));
      if (crc != original_crc) error();
 */
 
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+				   const Bytef *source, uLong sourceLen));
+/*
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer.  Upon entry, destLen is the total size
+   of the destination buffer, which must be large enough to hold the entire
+   uncompressed data.  (The size of the uncompressed data must have been saved
+   previously by the compressor and transmitted to the decompressor by some
+   mechanism outside the scope of this compression library.) Upon exit, destLen
+   is the actual size of the uncompressed data.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.  In
+   the case where there is not enough room, uncompress() will fill the output
+   buffer with the uncompressed data up to that point.
+*/
+
+ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
+				    const Bytef *source, uLong *sourceLen));
+/*
+     Same as uncompress, except that sourceLen is a pointer, where the
+   length of the source is *sourceLen.  On return, *sourceLen is the number of
+   source bytes consumed.
+*/
+
 ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
                                       const char *version, int stream_size));
 #define inflateInit(strm) \
diff --git a/lib/zlib/uncompr.c b/lib/zlib/uncompr.c
new file mode 100644
index 0000000000..21e93933b2
--- /dev/null
+++ b/lib/zlib/uncompr.c
@@ -0,0 +1,97 @@
+/* uncompr.c -- decompress a memory buffer
+ * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+     Decompresses the source buffer into the destination buffer.  *sourceLen is
+   the byte length of the source buffer. Upon entry, *destLen is the total size
+   of the destination buffer, which must be large enough to hold the entire
+   uncompressed data. (The size of the uncompressed data must have been saved
+   previously by the compressor and transmitted to the decompressor by some
+   mechanism outside the scope of this compression library.) Upon exit,
+   *destLen is the size of the decompressed data and *sourceLen is the number
+   of source bytes consumed. Upon return, source + *sourceLen points to the
+   first unused input byte.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
+   Z_DATA_ERROR if the input data was corrupted, including if the input data is
+   an incomplete zlib stream.
+*/
+int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
+	Bytef *dest;
+	uLongf *destLen;
+	const Bytef *source;
+	uLong *sourceLen;
+
+{
+	z_stream stream;
+	int err;
+	const uInt max = (uInt)-1;
+	uLong len, left;
+	/* for detection of incomplete stream when *destLen == 0 */
+	Byte buf[1];
+
+	len = *sourceLen;
+	if (*destLen) {
+		left = *destLen;
+		*destLen = 0;
+	} else {
+		left = 1;
+		dest = buf;
+	}
+
+	stream.next_in = (z_const Bytef *)source;
+	stream.avail_in = 0;
+	stream.zalloc = (alloc_func)0;
+	stream.zfree = (free_func)0;
+	stream.opaque = (voidpf)0;
+
+	err = inflateInit(&stream);
+	if (err != Z_OK)
+		return err;
+
+	stream.next_out = dest;
+	stream.avail_out = 0;
+
+	do {
+		if (stream.avail_out == 0) {
+			stream.avail_out = left > (uLong)max ? max : (uInt)left;
+			left -= stream.avail_out;
+		}
+
+		if (stream.avail_in == 0) {
+			stream.avail_in = len > (uLong)max ? max : (uInt)len;
+			len -= stream.avail_in;
+		}
+
+		err = inflate(&stream, Z_NO_FLUSH);
+	} while (err == Z_OK);
+
+	*sourceLen -= len + stream.avail_in;
+	if (dest != buf)
+		*destLen = stream.total_out;
+	else if (stream.total_out && err == Z_BUF_ERROR)
+		left = 1;
+
+	inflateEnd(&stream);
+	return err == Z_STREAM_END ? Z_OK :
+		err == Z_NEED_DICT ? Z_DATA_ERROR  :
+		err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
+		err;
+}
+
+int ZEXPORT uncompress(dest, destLen, source, sourceLen)
+	Bytef *dest;
+	uLongf *destLen;
+	const Bytef *source;
+	uLong sourceLen;
+{
+	return uncompress2(dest, destLen, source, &sourceLen);
+}
diff --git a/lib/zlib/zlib.c b/lib/zlib/zlib.c
index 7e1570292c..05a2734086 100644
--- a/lib/zlib/zlib.c
+++ b/lib/zlib/zlib.c
@@ -30,3 +30,4 @@
 #include "inflate.c"
 #include "zutil.c"
 #include "adler32.c"
+#include "uncompr.c"
-- 
2.17.1

  parent reply	other threads:[~2020-07-21  9:22 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-21  9:22 [PATCH v3 0/5] Add support for the SquashFS filesystem Joao Marcos Costa
2020-07-21  9:22 ` [PATCH v3 1/5] fs/squashfs: new filesystem Joao Marcos Costa
2020-07-21  9:22 ` [PATCH v3 2/5] fs/squashfs: add filesystem commands Joao Marcos Costa
2020-07-21  9:22 ` Joao Marcos Costa [this message]
2020-07-29 15:27   ` [PATCH v3 3/5] include/u-boot, lib/zlib: add sources for zlib decompression Tom Rini
2020-07-29 16:00     ` Joao Marcos Costa
2020-07-29 16:54       ` Tom Rini
2020-07-30 12:10         ` Joao Marcos Costa
2020-07-30 12:17           ` Tom Rini
2020-07-30 13:27             ` Joao Marcos Costa
2020-07-21  9:22 ` [PATCH v3 4/5] fs/squashfs: add support " Joao Marcos Costa
2020-07-21  9:22 ` [PATCH v3 5/5] fs/fs.c: add symbolic link case to fs_ls_generic() Joao Marcos Costa
2020-07-29 12:54 ` [PATCH v3 0/5] Add support for the SquashFS filesystem Joao Marcos Costa
2020-07-29 15:21   ` Tom Rini
2020-07-29 16:02     ` Joao Marcos Costa

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=20200721092259.26916-4-joaomarcos.costa@bootlin.com \
    --to=joaomarcos.costa@bootlin.com \
    --cc=u-boot@lists.denx.de \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.