[PATCH] erofs-utils: fuse: fix random readlink error
Gao Xiang
hsiangkao at redhat.com
Fri Jan 22 11:34:16 AEDT 2021
Hi Weiwen,
On Fri, Jan 22, 2021 at 12:31:43AM +0800, Hu Weiwen wrote:
> readlink should fill a **null terminated** string in buffer.
>
> Also, read should return number of bytes remaining on EOF.
>
> Link: https://lore.kernel.org/linux-erofs/20210121101233.GC6680@DESKTOP-N4CECTO.huww98.cn/
> Signed-off-by: Hu Weiwen <sehuww at mail.scut.edu.cn>
Thanks for catching this!
> ---
> fuse/main.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/fuse/main.c b/fuse/main.c
> index c162912..bc1e496 100644
> --- a/fuse/main.c
> +++ b/fuse/main.c
> @@ -71,6 +71,12 @@ static int erofsfuse_read(const char *path, char *buffer,
> if (ret)
> return ret;
>
> + if (offset >= vi.i_size)
> + return 0;
> +
> + if (offset + size > vi.i_size)
> + size = vi.i_size - offset;
> +
It would be better to call erofs_pread() with the original offset
and size (also I think there is some missing memset(0) for
!EROFS_MAP_MAPPED), and fix up the return value to the needed value.
Thanks,
Gao Xiang
> ret = erofs_pread(&vi, buffer, size, offset);
> if (ret)
> return ret;
> @@ -79,10 +85,16 @@ static int erofsfuse_read(const char *path, char *buffer,
>
> static int erofsfuse_readlink(const char *path, char *buffer, size_t size)
> {
> - int ret = erofsfuse_read(path, buffer, size, 0, NULL);
> + int ret;
> + size_t path_len;
> +
> + erofs_dbg("path:%s size=%zd", path, size);
> + ret = erofsfuse_read(path, buffer, size, 0, NULL);
>
> if (ret < 0)
> return ret;
> + path_len = min(size - 1, (size_t)ret);
> + buffer[path_len] = '\0';
> return 0;
> }
>
> --
> 2.30.0
>
More information about the Linux-erofs
mailing list