[PATCH v2] erofs-utils: lib: fix infinite loop on EOF in erofs_io_xcopy
Gao Xiang
hsiangkao at linux.alibaba.com
Sun Mar 22 14:23:30 AEDT 2026
On 2026/3/21 11:42, Ajay Rajera wrote:
> Thank you, I appreciate it.
>
> best regards,
> Ajay Rajera
>
> On Sat, 21 Mar 2026 at 08:41, Gao Xiang <hsiangkao at linux.alibaba.com> wrote:
>>
>>
>>
>> On 2026/3/21 02:50, Ajay Rajera wrote:
>>> erofs_io_xcopy() has a fallback do-while loop for when the
>>> kernel fast-paths (copy_file_range/sendfile) do not handle all
>>> the data. The loop does:
>>>
>>> ret = erofs_io_read(vin, buf, ret);
>>> if (ret < 0)
>>> return ret;
>>> if (ret > 0) { ... pos += ret; }
>>> len -= ret;
>>> } while (len);
>>>
>>> When erofs_io_read() returns 0 (EOF -- source exhausted before
>>> all bytes were copied), only the ret < 0 and ret > 0 branches
>>> were handled. Since ret == 0, `len -= ret` is a no-op and
>>> `while (len)` stays true, causing the loop to spin forever at
>>> 100% CPU with no error and no progress.
>>>
>>> This can be triggered when building an EROFS image from an input
>>> file that is shorter than expected -- e.g. a truncated source
>>> file, a pipe/FIFO that closes early, or a file being modified
>>> concurrently during mkfs.
>>>
>>> Fix it by treating a zero return as an error (-EIO) so the
>>> caller fails cleanly instead of hanging indefinitely.
>>>
>>> Also fix the long-standing 'pading' -> 'padding' typo in the
>>> short-read diagnostic message of erofs_dev_read().
>>>
>>> Signed-off-by: Ajay Rajera <newajay.11r at gmail.com>
>>
>> Look good to me, will apply.
This patch cause a regression which can cause build failure:
https://github.com/erofs/erofsnightly/actions/runs/23392598146/job/68049898517
It can be reproduced by:
$ mkfs/mkfs.erofs --zfeature-bits=78 foo.erofs linux-5.4.140
I dropped this patch.
Thanks,
Gao Xiang
>>
>> Thanks,
>> Gao Xiang
More information about the Linux-erofs
mailing list