public inbox for linux-erofs@ozlabs.org
 help / color / mirror / Atom feed
* [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions
@ 2026-04-14 14:13 Zhan Xusheng
  2026-04-14 14:13 ` [PATCH 1/2] erofs-utils: tar: fix out-of-bounds access when trimming pax path Zhan Xusheng
  2026-04-14 14:13 ` [PATCH 2/2] erofs-utils: tar: add missing NULL checks for GNU long name/link Zhan Xusheng
  0 siblings, 2 replies; 7+ messages in thread
From: Zhan Xusheng @ 2026-04-14 14:13 UTC (permalink / raw)
  To: Gao Xiang; +Cc: linux-erofs, Zhan Xusheng

This series fixes two issues in tar parsing:

- An out-of-bounds access when trimming PAX path entries
- Missing NULL pointer checks when handling GNU long name/link records

These issues can be triggered by malformed tar archives and may lead
to crashes. The fixes improve robustness when processing untrusted
inputs.

Zhan Xusheng (2):
  erofs-utils: tar: fix out-of-bounds access when trimming pax path
  erofs-utils: tar: add missing NULL checks for GNU long name/link

 lib/tar.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/2] erofs-utils: tar: fix out-of-bounds access when trimming pax path
  2026-04-14 14:13 [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions Zhan Xusheng
@ 2026-04-14 14:13 ` Zhan Xusheng
  2026-04-14 14:19   ` Gao Xiang
  2026-04-14 14:13 ` [PATCH 2/2] erofs-utils: tar: add missing NULL checks for GNU long name/link Zhan Xusheng
  1 sibling, 1 reply; 7+ messages in thread
From: Zhan Xusheng @ 2026-04-14 14:13 UTC (permalink / raw)
  To: Gao Xiang; +Cc: linux-erofs, Zhan Xusheng

When a PAX extended header contains a path consisting entirely of '/'
characters (e.g., "path=/"), the trailing-slash trimming loop in
tarerofs_parse_pax_header() decrements j to 0, then accesses
eh->path[-1] which is an out-of-bounds heap read.

The tar header path trimming had a similar issue fixed by commit
dcd06f421003 ("erofs-utils: mkfs: tar: fix SIGSEGV on `/` entry"),
but the PAX header path trimming was not addressed.

Add a j > 0 guard to the while condition.

Fixes: 95d315fd7958 ("erofs-utils: introduce tarerofs")
Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
---
 lib/tar.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/tar.c b/lib/tar.c
index eca29f5..3d92f48 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -509,7 +509,7 @@ int tarerofs_parse_pax_header(struct erofs_iostream *ios,
 				int j = p - 1 - value;
 				free(eh->path);
 				eh->path = strdup(value);
-				while (eh->path[j - 1] == '/')
+				while (j > 0 && eh->path[j - 1] == '/')
 					eh->path[--j] = '\0';
 			} else if (!strncmp(kv, "linkpath=",
 					sizeof("linkpath=") - 1)) {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] erofs-utils: tar: add missing NULL checks for GNU long name/link
  2026-04-14 14:13 [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions Zhan Xusheng
  2026-04-14 14:13 ` [PATCH 1/2] erofs-utils: tar: fix out-of-bounds access when trimming pax path Zhan Xusheng
@ 2026-04-14 14:13 ` Zhan Xusheng
  1 sibling, 0 replies; 7+ messages in thread
From: Zhan Xusheng @ 2026-04-14 14:13 UTC (permalink / raw)
  To: Gao Xiang; +Cc: linux-erofs, Zhan Xusheng

In the GNU long name ('L') and long link ('K') handling, malloc()
return values are not checked.  If st.st_size is excessively large
from a crafted tar header, malloc() fails and returns NULL, then
erofs_iostream_bread() writes to a NULL pointer causing a crash.

Also add the missing PATH_MAX bound check for 'L' entries, which
the 'K' path already had.

Fixes: 95d315fd7958 ("erofs-utils: introduce tarerofs")
Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
---
 lib/tar.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lib/tar.c b/lib/tar.c
index 3d92f48..24d8314 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -886,7 +886,8 @@ out_eot:
 	case 'L':
 		free(eh.path);
 		eh.path = malloc(st.st_size + 1);
-		if (st.st_size != erofs_iostream_bread(&tar->ios, eh.path,
+		if (!eh.path || st.st_size > PATH_MAX ||
+		    st.st_size != erofs_iostream_bread(&tar->ios, eh.path,
 						       st.st_size))
 			goto invalid_tar;
 		eh.path[st.st_size] = '\0';
@@ -894,8 +895,9 @@ out_eot:
 	case 'K':
 		free(eh.link);
 		eh.link = malloc(st.st_size + 1);
-		if (st.st_size > PATH_MAX || st.st_size !=
-		    erofs_iostream_bread(&tar->ios, eh.link, st.st_size))
+		if (!eh.link || st.st_size > PATH_MAX ||
+		    st.st_size != erofs_iostream_bread(&tar->ios, eh.link,
+						       st.st_size))
 			goto invalid_tar;
 		eh.link[st.st_size] = '\0';
 		goto restart;
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] erofs-utils: tar: fix out-of-bounds access when trimming pax path
  2026-04-14 14:13 ` [PATCH 1/2] erofs-utils: tar: fix out-of-bounds access when trimming pax path Zhan Xusheng
@ 2026-04-14 14:19   ` Gao Xiang
  2026-04-14 14:46     ` [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions Zhan Xusheng
  0 siblings, 1 reply; 7+ messages in thread
From: Gao Xiang @ 2026-04-14 14:19 UTC (permalink / raw)
  To: Zhan Xusheng; +Cc: linux-erofs, Zhan Xusheng

Hi,

On 2026/4/14 22:13, Zhan Xusheng wrote:
> When a PAX extended header contains a path consisting entirely of '/'
> characters (e.g., "path=/"), the trailing-slash trimming loop in
> tarerofs_parse_pax_header() decrements j to 0, then accesses
> eh->path[-1] which is an out-of-bounds heap read.
> 
> The tar header path trimming had a similar issue fixed by commit
> dcd06f421003 ("erofs-utils: mkfs: tar: fix SIGSEGV on `/` entry"),
> but the PAX header path trimming was not addressed.
> 
> Add a j > 0 guard to the while condition.
> 
> Fixes: 95d315fd7958 ("erofs-utils: introduce tarerofs")
> Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>

That was addressed by others before: I think I will add
your `Signed-off-by:` into the original patch.

BTW, are you using LLM to discover bugs too?

Thanks,
Gao Xiang

> ---
>   lib/tar.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/lib/tar.c b/lib/tar.c
> index eca29f5..3d92f48 100644
> --- a/lib/tar.c
> +++ b/lib/tar.c
> @@ -509,7 +509,7 @@ int tarerofs_parse_pax_header(struct erofs_iostream *ios,
>   				int j = p - 1 - value;
>   				free(eh->path);
>   				eh->path = strdup(value);
> -				while (eh->path[j - 1] == '/')
> +				while (j > 0 && eh->path[j - 1] == '/')
>   					eh->path[--j] = '\0';
>   			} else if (!strncmp(kv, "linkpath=",
>   					sizeof("linkpath=") - 1)) {



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions
  2026-04-14 14:19   ` Gao Xiang
@ 2026-04-14 14:46     ` Zhan Xusheng
  2026-04-14 14:49       ` Gao Xiang
  0 siblings, 1 reply; 7+ messages in thread
From: Zhan Xusheng @ 2026-04-14 14:46 UTC (permalink / raw)
  To: Gao Xiang; +Cc: linux-erofs

Hi Gao,

Thanks!

The issue was identified during manual code review. I occasionally
use LLMs to help polish commit messages or double-check wording.

Thanks for adding my Signed-off-by.

Best regards,
Zhan Xusheng


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions
  2026-04-14 14:46     ` [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions Zhan Xusheng
@ 2026-04-14 14:49       ` Gao Xiang
  2026-04-14 14:55         ` Zhan Xusheng
  0 siblings, 1 reply; 7+ messages in thread
From: Gao Xiang @ 2026-04-14 14:49 UTC (permalink / raw)
  To: Zhan Xusheng; +Cc: linux-erofs

Hi Zhan,

On 2026/4/14 22:46, Zhan Xusheng wrote:
> Hi Gao,
> 
> Thanks!
> 
> The issue was identified during manual code review. I occasionally
> use LLMs to help polish commit messages or double-check wording.
> 
> Thanks for adding my Signed-off-by.

For example, this:
https://lore.kernel.org/linux-erofs/20260326125406.61001-1-ch@vnsh.in

I've lost my similiar commits like this,
but I will address them all soon.

Thanks,
Gao Xiang

> 
> Best regards,
> Zhan Xusheng



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions
  2026-04-14 14:49       ` Gao Xiang
@ 2026-04-14 14:55         ` Zhan Xusheng
  0 siblings, 0 replies; 7+ messages in thread
From: Zhan Xusheng @ 2026-04-14 14:55 UTC (permalink / raw)
  To: Gao Xiang; +Cc: linux-erofs

Hi Gao,

Thanks for the reference!

I see, that looks like a similar issue. Please feel free to take over
and address them together.

Let me know if I can help with anything.

Best regards,
Zhan Xusheng


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-04-14 14:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-14 14:13 [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions Zhan Xusheng
2026-04-14 14:13 ` [PATCH 1/2] erofs-utils: tar: fix out-of-bounds access when trimming pax path Zhan Xusheng
2026-04-14 14:19   ` Gao Xiang
2026-04-14 14:46     ` [PATCH erofs-utils 0/2] tar: fix parsing issues for pax and GNU extensions Zhan Xusheng
2026-04-14 14:49       ` Gao Xiang
2026-04-14 14:55         ` Zhan Xusheng
2026-04-14 14:13 ` [PATCH 2/2] erofs-utils: tar: add missing NULL checks for GNU long name/link Zhan Xusheng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox