mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Thomas Weißschuh" <linux@weissschuh.net>
To: Danish Khateeb <danishkhateeb03@gmail.com>
Cc: Willy Tarreau <w@1wt.eu>, Shuah Khan <shuah@kernel.org>,
	 linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] tools/nolibc: check for overflow in malloc()
Date: Sat, 26 Sep 2026 16:17:10 +0200	[thread overview]
Message-ID: <adcc9b9a-5788-48ef-af23-2895e4c8a924@t-8ch.de> (raw)
In-Reply-To: <20260926134332.58184-2-danishkhateeb03@gmail.com>

On 2026-09-26 08:43:31-0500, Danish Khateeb wrote:
> malloc() adds the size of its header to the requested size and rounds
> the sum up to a multiple of 4096, without checking either step for
> overflow. For a size within the header size of SIZE_MAX, the sum wraps
> around to a few bytes, and malloc() returns a single page instead of
> NULL. For a slightly smaller size, the rounding wraps around to 0, and
> malloc() fails with EINVAL from mmap() instead of ENOMEM.
> 
> calloc() checks its multiplication for overflow, but then passes the
> product to malloc(), so calloc(SIZE_MAX, 1) returns a single page too.
> So does realloc(ptr, SIZE_MAX).
> 
> Such a size is usually a bug in the caller, for instance a length of -1
> used as a size_t, and returning a page instead of NULL can turn it into
> a heap overflow.
> 
> Fail with ENOMEM when adding the header or rounding up overflows, as
> glibc does for sizes this large.
> 
> Fixes: 0e0ff638400b ("tools/nolibc/stdlib: Implement `malloc()`, `calloc()`, `realloc()` and `free()`")
> Assisted-by: LLM
> Signed-off-by: Danish Khateeb <danishkhateeb03@gmail.com>
> ---
>  tools/include/nolibc/stdlib.h | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/include/nolibc/stdlib.h b/tools/include/nolibc/stdlib.h
> index 6c3c620a04cf..ea315e60cdeb 100644
> --- a/tools/include/nolibc/stdlib.h
> +++ b/tools/include/nolibc/stdlib.h
> @@ -130,9 +130,15 @@ void *malloc(size_t len)
>  {
>  	struct nolibc_heap *heap;
>  
> -	/* Always allocate memory with size multiple of 4096. */
> -	len  = sizeof(*heap) + len;
> -	len  = (len + 4095UL) & -4096UL;
> +	/*
> +	 * Always allocate memory with size multiple of 4096, and reject sizes
> +	 * which would wrap around once the header is added and rounded up.
> +	 */

The rounding to a multiple to 4096 is probably meant to align the size
to a page boundary. But this is insufficient on systems where the page
size is not 4k. The kernel doesn't actually seem to care.
Let's drop the rounding instead, and then add the overflow check on top.

Also the unittest doesn't seem to be worth it.

> +	if (__builtin_expect(__builtin_add_overflow(len, sizeof(*heap) + 4095UL, &len), 0)) {
> +		SET_ERRNO(ENOMEM);
> +		return NULL;
> +	}
> +	len &= -4096UL;
>  	heap = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE,
>  		    -1, 0);
>  	if (__builtin_expect(heap == MAP_FAILED, 0))
> -- 
> 2.55.0
> 

  reply	other threads:[~2026-09-26 14:17 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-26 13:43 [PATCH 0/2] " Danish Khateeb
2026-09-26 13:43 ` [PATCH 1/2] " Danish Khateeb
2026-09-26 14:17   ` Thomas Weißschuh [this message]
2026-09-26 13:43 ` [PATCH 2/2] selftests/nolibc: test malloc() and calloc() with huge sizes Danish Khateeb

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=adcc9b9a-5788-48ef-af23-2895e4c8a924@t-8ch.de \
    --to=linux@weissschuh.net \
    --cc=danishkhateeb03@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=shuah@kernel.org \
    --cc=w@1wt.eu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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®