VYPR
Unrated severityNVD Advisory· Published Jun 9, 2026

CVE-2026-46329

CVE-2026-46329

Description

In the Linux kernel, the following vulnerability has been resolved:

erofs: handle end of filesystem properly for file-backed mounts

I/O requests beyond the end of the filesystem should be zeroed out, similar to loopback devices and that is what we expect.

Affected products

1

Patches

8
8d582d65d20b

erofs: handle end of filesystem properly for file-backed mounts

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitGao XiangJan 30, 2026Fixed in 6.12.75via kernel-cna
1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index bc2c9fb44236e..2c7f066daacdd 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -25,21 +25,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -50,7 +46,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
e49abde0ffc3

erofs: handle end of filesystem properly for file-backed mounts

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitGao XiangJan 30, 2026Fixed in 6.18.14via kernel-cna
1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index e2eaa7119bd4f..5b77ee8cc99f4 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -25,21 +25,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -51,7 +47,7 @@ static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	const struct cred *old_cred;
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
fe4039034dcd

erofs: handle end of filesystem properly for file-backed mounts

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitGao XiangJan 30, 2026Fixed in 6.19.4via kernel-cna
1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index 1673c5416fba1..2a778a02681a0 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -25,21 +25,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -50,7 +46,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
bc804a8d7e86

erofs: handle end of filesystem properly for file-backed mounts

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitGao XiangJan 30, 2026Fixed in 7.0via kernel-cna
1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index c1d0081609dc2..43998fe1cce1d 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -24,21 +24,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -48,7 +44,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
bc804a8d7e86

erofs: handle end of filesystem properly for file-backed mounts

1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index c1d0081609dc2..43998fe1cce1d 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -24,21 +24,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -48,7 +44,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
8d582d65d20b

erofs: handle end of filesystem properly for file-backed mounts

1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index bc2c9fb44236e..2c7f066daacdd 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -25,21 +25,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -50,7 +46,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
e49abde0ffc3

erofs: handle end of filesystem properly for file-backed mounts

1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index e2eaa7119bd4f..5b77ee8cc99f4 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -25,21 +25,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -51,7 +47,7 @@ static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	const struct cred *old_cred;
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    
fe4039034dcd

erofs: handle end of filesystem properly for file-backed mounts

1 file changed · +8 13
  • fs/erofs/fileio.c+8 13 modified
    diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
    index 1673c5416fba1..2a778a02681a0 100644
    --- a/fs/erofs/fileio.c
    +++ b/fs/erofs/fileio.c
    @@ -25,21 +25,17 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     			container_of(iocb, struct erofs_fileio_rq, iocb);
     	struct folio_iter fi;
     
    -	if (ret > 0) {
    -		if (ret != rq->bio.bi_iter.bi_size) {
    -			bio_advance(&rq->bio, ret);
    -			zero_fill_bio(&rq->bio);
    -		}
    -		ret = 0;
    +	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
    +		bio_advance(&rq->bio, ret);
    +		zero_fill_bio(&rq->bio);
     	}
    -	if (rq->bio.bi_end_io) {
    -		if (ret < 0 && !rq->bio.bi_status)
    -			rq->bio.bi_status = errno_to_blk_status(ret);
    -	} else {
    +	if (!rq->bio.bi_end_io) {
     		bio_for_each_folio_all(fi, &rq->bio) {
     			DBG_BUGON(folio_test_uptodate(fi.folio));
    -			erofs_onlinefolio_end(fi.folio, ret, false);
    +			erofs_onlinefolio_end(fi.folio, ret < 0, false);
     		}
    +	} else if (ret < 0 && !rq->bio.bi_status) {
    +		rq->bio.bi_status = errno_to_blk_status(ret);
     	}
     	bio_endio(&rq->bio);
     	bio_uninit(&rq->bio);
    @@ -50,7 +46,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
     static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
     {
     	struct iov_iter iter;
    -	int ret;
    +	ssize_t ret;
     
     	if (!rq)
     		return;
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"The erofs filesystem incorrectly handles I/O requests that extend beyond the end of the filesystem when mounted with file-backed storage."

Attack vector

An attacker can trigger this vulnerability by performing I/O operations on a file-backed erofs filesystem that extend beyond its defined end. This could involve read or write operations that attempt to access data beyond the filesystem's boundaries. The vulnerability lies in how the filesystem handles these out-of-bounds requests, leading to improper zeroing of data.

Affected code

The vulnerability resides in the `erofs_fileio_ki_complete` function within the `fs/erofs/fileio.c` file. Specifically, the logic handling the completion of I/O requests and the subsequent zero-filling of data beyond the filesystem's end was found to be incorrect.

What the fix does

The patch modifies the `erofs_fileio_ki_complete` function in `fs/erofs/fileio.c` to correctly handle I/O requests that go beyond the end of the filesystem. Previously, the logic for zeroing out excess data was not applied correctly. The updated code ensures that if an I/O request's returned size is less than the requested size, the remaining portion of the buffer is zero-filled, aligning the behavior with loopback devices and preventing potential data corruption or information disclosure.

Preconditions

  • configThe system must be running a Linux kernel with the erofs filesystem module loaded.
  • inputA file-backed erofs filesystem must be mounted.

Generated on Jun 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

4

News mentions

1