Hi Uwe,

On 9/16/26 11:40 AM, you wrote:

Hello Carl,

On Mon, Aug 31, 2026 at 12:23:35PM -0700, Carl Wuebker wrote:
Package: linux-libc-dev
Version: 6.12.107-1
Severity: normal
Dear Maintainer,

   The problem is that sbrk(2) checks each new request against the machine's
total RAM + swap space.  It should check each new request against total RAM
+ swap space - memory that has already been allocated to the current
process.

Steps to reproduce:
1. Compile & run the program below on a machine with 32 GiB memory & 24 GiB
swap

--- eatmem_bad.c
#include <stdio.h>
#include <unistd.h>

intptr_t bigMem = (intptr_t) 128LL*1024*1024*1024;

int main(int argc,char *argv[]) {
     intptr_t i;
     unsigned long long mem;

     if (argc != 1)
         { (void) fprintf(stderr,"Usage: %s\n", argv[0]); return 2; }

     mem=0;
     for (i = bigMem; i >= 16; i /= 2)
         if (sbrk(i) != (void *) -1)
             mem |= i;

     (void) printf("Memory=%llu MiB\n",mem / (1024*1024));

     return 0;
     }
---

Expected (and correct) result:
Memory=56718 MiB

Actual result:
Memory=65535 MiB
I wonder what your actual problem is.

It's quite usual that a process can get more memory assigned than there
is physically available. That's called "overcommitting" if you want to
research about that.

Unless there is a real problem to solve I suggest to either ignore it or
discuss with upstream what to do.

  Thanks for your reply.  The "real problem" comes from the current situation in CAD, AI & other single programs running on a Linux machine.  Some programs need a way to find out how much RAM is available and might use a technique similar to this one, which might report that almost 2x the available RAM is available because, as the man page says:

"On success, sbrk() returns the previous program break.  (If the break  was  increased,  then this  value is a pointer to the start of the newly allocated memory).  On error, (void *) -1 is returned, and errno is set to ENOMEM."

When I read this, I think "if the memory allocation was unsuccessful, I'll get an error."  But that's not the case -- I guess that if I ask it to allocate 128 GBy and get no error, I still need to check the brk(2) value to see if the memory was allocated.

So, in my mind (but maybe not obvious to others), there is a problem with 2 solutions -- one is to return an error if the last memory allocation fails, the other is to update the sbrk(2) documentation to tell the user that -- even if the sbrk(2) doesn't return an error -- they need to compare the sbrk(2) return value with the last sbrk(2) value to see if it moved -- if it didn't move, the allocation failed.

Where can I find a reasonably up-to-date copy of Linux's sbrk(2) code?  I might be better able to understand your comments and/or recommend a solution if I read that code.

Thanks,

Carl

Reply via email to