[PATCH 1/2] erofs-utils: lib: wrap up zeropadding calculation

Gao Xiang hsiangkao at linux.alibaba.com
Tue Jun 4 18:40:14 AEST 2024


Use a simple helper instead of open-coding.

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/decompress.c | 46 ++++++++++++++++++----------------------------
 1 file changed, 18 insertions(+), 28 deletions(-)

diff --git a/lib/decompress.c b/lib/decompress.c
index 58ce7e5..e65b924 100644
--- a/lib/decompress.c
+++ b/lib/decompress.c
@@ -9,6 +9,15 @@
 #include "erofs/err.h"
 #include "erofs/print.h"
 
+static unsigned int z_erofs_fixup_insize(const u8 *padbuf, unsigned int padbufsize)
+{
+	unsigned int inputmargin;
+
+	for (inputmargin = 0; inputmargin < padbufsize &&
+	     !padbuf[inputmargin]; ++inputmargin);
+	return inputmargin;
+}
+
 #ifdef HAVE_LIBZSTD
 #include <zstd.h>
 #include <zstd_errors.h>
@@ -16,7 +25,6 @@
 /* also a very preliminary userspace version */
 static int z_erofs_decompress_zstd(struct z_erofs_decompress_req *rq)
 {
-	struct erofs_sb_info *sbi = rq->sbi;
 	int ret = 0;
 	char *dest = rq->out;
 	char *src = rq->in;
@@ -24,10 +32,7 @@ static int z_erofs_decompress_zstd(struct z_erofs_decompress_req *rq)
 	unsigned int inputmargin = 0;
 	unsigned long long total;
 
-	while (!src[inputmargin & (erofs_blksiz(sbi) - 1)])
-		if (!(++inputmargin & (erofs_blksiz(sbi) - 1)))
-			break;
-
+	inputmargin = z_erofs_fixup_insize((u8 *)src, rq->inputsize);
 	if (inputmargin >= rq->inputsize)
 		return -EFSCORRUPTED;
 
@@ -78,19 +83,15 @@ out:
 
 static int z_erofs_decompress_deflate(struct z_erofs_decompress_req *rq)
 {
-	struct erofs_sb_info *sbi = rq->sbi;
 	u8 *dest = (u8 *)rq->out;
 	u8 *src = (u8 *)rq->in;
 	u8 *buff = NULL;
 	size_t actual_out;
-	unsigned int inputmargin = 0;
+	unsigned int inputmargin;
 	struct libdeflate_decompressor *inf;
 	enum libdeflate_result ret;
 
-	while (!src[inputmargin & (erofs_blksiz(sbi) - 1)])
-		if (!(++inputmargin & (erofs_blksiz(sbi) - 1)))
-			break;
-
+	inputmargin = z_erofs_fixup_insize(src, rq->inputsize);
 	if (inputmargin >= rq->inputsize)
 		return -EFSCORRUPTED;
 
@@ -160,18 +161,14 @@ static int zerr(int ret)
 
 static int z_erofs_decompress_deflate(struct z_erofs_decompress_req *rq)
 {
-	struct erofs_sb_info *sbi = rq->sbi;
 	u8 *dest = (u8 *)rq->out;
 	u8 *src = (u8 *)rq->in;
 	u8 *buff = NULL;
-	unsigned int inputmargin = 0;
+	unsigned int inputmargin;
 	z_stream strm;
 	int ret;
 
-	while (!src[inputmargin & (erofs_blksiz(sbi) - 1)])
-		if (!(++inputmargin & (erofs_blksiz(sbi) - 1)))
-			break;
-
+	inputmargin = z_erofs_fixup_insize(src, rq->inputsize);
 	if (inputmargin >= rq->inputsize)
 		return -EFSCORRUPTED;
 
@@ -225,18 +222,14 @@ out_inflate_end:
 static int z_erofs_decompress_lzma(struct z_erofs_decompress_req *rq)
 {
 	int ret = 0;
-	struct erofs_sb_info *sbi = rq->sbi;
 	u8 *dest = (u8 *)rq->out;
 	u8 *src = (u8 *)rq->in;
 	u8 *buff = NULL;
-	unsigned int inputmargin = 0;
+	unsigned int inputmargin;
 	lzma_stream strm;
 	lzma_ret ret2;
 
-	while (!src[inputmargin & (erofs_blksiz(sbi) - 1)])
-		if (!(++inputmargin & (erofs_blksiz(sbi) - 1)))
-			break;
-
+	inputmargin = z_erofs_fixup_insize(src, rq->inputsize);
 	if (inputmargin >= rq->inputsize)
 		return -EFSCORRUPTED;
 
@@ -297,12 +290,9 @@ static int z_erofs_decompress_lz4(struct z_erofs_decompress_req *rq)
 	if (erofs_sb_has_lz4_0padding(sbi)) {
 		support_0padding = true;
 
-		while (!src[inputmargin & (erofs_blksiz(sbi) - 1)])
-			if (!(++inputmargin & (erofs_blksiz(sbi) - 1)))
-				break;
-
+		inputmargin = z_erofs_fixup_insize((u8 *)src, rq->inputsize);
 		if (inputmargin >= rq->inputsize)
-			return -EIO;
+			return -EFSCORRUPTED;
 	}
 
 	if (rq->decodedskip) {
-- 
2.39.3



More information about the Linux-erofs mailing list