mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] lib: decompress_unxz: fix memory leak of 'in' buffer in single-call mode
@ 2026-08-25 19:13 Ivy Lopez
  2026-08-25 20:08 ` Lasse Collin
  0 siblings, 1 reply; 3+ messages in thread
From: Ivy Lopez @ 2026-08-25 19:13 UTC (permalink / raw)
  To: akpm, lasse.collin; +Cc: linux-kernel, Ivy Lopez

When fill and flush are both NULL (single-call mode), unxz() takes
the xz_dec_run() fast path and skips straight to xz_dec_end(s),
bypassing the free(in)/free(b.out) cleanup that only runs inside the
multi-call (fill/flush) branch. If 'in' was NULL on entry, it gets
allocated locally (must_free_in = true) and is never freed on this
path, leaking XZ_IOBUF_SIZE bytes on every single-call decompression
that doesn't supply its own input buffer.

Move the must_free_in/flush cleanup out of the multi-call branch so
it runs after both paths.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=207113
Signed-off-by: Ivy Lopez <skunkolee@gmail.com>
---
 lib/decompress_unxz.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lib/decompress_unxz.c b/lib/decompress_unxz.c
index 05d5cb490a44..9ccded9934c6 100644
--- a/lib/decompress_unxz.c
+++ b/lib/decompress_unxz.c
@@ -342,13 +342,13 @@ STATIC int INIT unxz(unsigned char *in, long in_size,
 				b.out_pos = 0;
 			}
 		} while (ret == XZ_OK);
+	}
 
-		if (must_free_in)
-			free(in);
+	if (must_free_in)
+		free(in);
 
-		if (flush != NULL)
-			free(b.out);
-	}
+	if (flush != NULL)
+		free(b.out);
 
 	if (in_used != NULL)
 		*in_used += b.in_pos;
-- 
2.55.0


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

* Re: [PATCH] lib: decompress_unxz: fix memory leak of 'in' buffer in single-call mode
  2026-08-25 19:13 [PATCH] lib: decompress_unxz: fix memory leak of 'in' buffer in single-call mode Ivy Lopez
@ 2026-08-25 20:08 ` Lasse Collin
  2026-08-26 18:04   ` Lasse Collin
  0 siblings, 1 reply; 3+ messages in thread
From: Lasse Collin @ 2026-08-25 20:08 UTC (permalink / raw)
  To: Ivy Lopez; +Cc: akpm, linux-kernel

On 2026-08-25 Ivy Lopez wrote:
> When fill and flush are both NULL (single-call mode), unxz() takes
> the xz_dec_run() fast path and skips straight to xz_dec_end(s),
> bypassing the free(in)/free(b.out) cleanup that only runs inside the
> multi-call (fill/flush) branch. If 'in' was NULL on entry, it gets
> allocated locally (must_free_in = true) and is never freed on this
> path, leaking XZ_IOBUF_SIZE bytes on every single-call decompression
> that doesn't supply its own input buffer.

There's no leak because calling with fill == NULL && flush == NULL &&
in == NULL is invalid. See this thread:

https://lore.kernel.org/lkml/20241006072542.66442-2-t.v.s10123@gmail.com/T/

Maybe the code needs to be changed to prevent repeated attempts to "fix"
it. I will get back to this in 1-3 days.

-- 
Lasse Collin

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

* Re: [PATCH] lib: decompress_unxz: fix memory leak of 'in' buffer in single-call mode
  2026-08-25 20:08 ` Lasse Collin
@ 2026-08-26 18:04   ` Lasse Collin
  0 siblings, 0 replies; 3+ messages in thread
From: Lasse Collin @ 2026-08-26 18:04 UTC (permalink / raw)
  To: Ivy Lopez; +Cc: akpm, linux-kernel

The diff is good, but I would like a different commit message because
there was no bug. I wrote a suggestion below. If you think it's OK,
please submit v2 with the same diff and the new commit message to
Andrew Morton. Thanks!

----%<----
lib: decompress_unxz: Make it obvious that there is no memory leak

Calling __decompress() or unxz() with fill == NULL && flush == NULL &&
in == NULL is invalid, thus there were no memory leaks even though it
might have looked like that. Move the conditional free() calls so that
it's obvious that there are no leaks.

Closes: https://bugzilla.kernel.org/show_bug.cgi?id=207113
Link: https://lore.kernel.org/lkml/20241006072542.66442-2-t.v.s10123@gmail.com/T/
Link: https://lore.kernel.org/lkml/20260825191333.34276-1-skunkolee@gmail.com/T/
Reviewed-by: Lasse Collin <lasse.collin@tukaani.org>
----%<----

-- 
Lasse Collin

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

end of thread, other threads:[~2026-08-26 18:12 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-25 19:13 [PATCH] lib: decompress_unxz: fix memory leak of 'in' buffer in single-call mode Ivy Lopez
2026-08-25 20:08 ` Lasse Collin
2026-08-26 18:04   ` Lasse Collin

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

all inboxes | Powered by JetHome®