[bug report] erofs: enable error reporting for z_erofs_fixup_insize()
Gao Xiang
hsiangkao at linux.alibaba.com
Tue Dec 2 19:47:54 AEDT 2025
On 2025/12/2 16:43, Gao Xiang wrote:
> Hi Dan,
>
> On 2025/12/2 16:32, Dan Carpenter wrote:
>> Hello Gao Xiang,
>>
>> Commit 30e13e41a0eb ("erofs: enable error reporting for
>> z_erofs_fixup_insize()") from Nov 27, 2025 (linux-next), leads to the
>> following Smatch static checker warning:
>>
>> fs/erofs/decompressor.c:217 z_erofs_lz4_decompress_mem() warn: 'reason' isn't an ERR_PTR
>> fs/erofs/decompressor_lzma.c:193 z_erofs_lzma_decompress() warn: 'reason' is an error pointer or valid
>> fs/erofs/decompressor_zstd.c:180 z_erofs_zstd_decompress() warn: 'reason' is an error pointer or valid
BTW, I don't think any issue out of `fs/erofs/decompressor_lzma.c`
and `fs/erofs/decompressor_zstd.c`.
"reason != NULL" means failure, so it will break and propagate to
the caller.
>>
>> fs/erofs/decompressor.c
>> 198 static int z_erofs_lz4_decompress_mem(struct z_erofs_decompress_req *rq, u8 *dst)
>> 199 {
>> 200 bool support_0padding = false, may_inplace = false;
>> 201 unsigned int inputmargin;
>> 202 u8 *out, *headpage, *src;
>> 203 const char *reason;
>> 204 int ret, maptype;
>> 205
>> 206 DBG_BUGON(*rq->in == NULL);
>> 207 headpage = kmap_local_page(*rq->in);
>> 208
>> 209 /* LZ4 decompression inplace is only safe if zero_padding is enabled */
>> 210 if (erofs_sb_has_zero_padding(EROFS_SB(rq->sb))) {
>> 211 support_0padding = true;
>> 212 reason = z_erofs_fixup_insize(rq, headpage + rq->pageofs_in,
>> 213 min_t(unsigned int, rq->inputsize,
>> 214 rq->sb->s_blocksize - rq->pageofs_in));
>> 215 if (reason) {
>> 216 kunmap_local(headpage);
>> --> 217 return IS_ERR(reason) ? PTR_ERR(reason) : -EFSCORRUPTED;
>> 218 }
>>
>> The z_erofs_fixup_insize() function used to return error pointers, but
>> now it returns an error string or NULL. So probably we could just
>> change this to:
>>
>> return -EFSCORRUPTED;
>
> I think `return -EFSCORRUPTED;` is valid for now, but later
> z_erofs_lz4_decompress_mem() will be changed into returning
> `const char *` as well but it's late for this cycle.
>
>>
>> Are we planning to make it return error pointers again?
>
> z_erofs_lz4_decompress_mem() will be `const char *` later too
> along with other cleanups, but it's somewhat late for this cycle.
>
>>
>> NULL means success in this case, right? It's sort of weird how NULL means
>> success and a valid pointer means failure.
>
> Because -EFSCORRUPTED isn't enough to represent the detailed
> decompression errors (because each decompressor has its own
> error messages and it's helpful for users to know how the
> compressed data is corrupted).
>
> NULL means success, and both valid pointers or error pointers
> != NULL means failure, so personally I don't think it's weird.
>
> A valid pointer indicates an detailed error string to be
> printed so that users know the detailed reasons and the error
> number is -EFSCORRUPTED.
>
> Thanks,
> Gao Xiang
More information about the Linux-erofs
mailing list