#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>
/* 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;
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;
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;
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;
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;
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) {