On Mon, Dec 21, 2020 at 09:47:03AM -0700, Simon Glass wrote:
> On Mon, 21 Dec 2020 at 05:00, Andy Shevchenko
> <andriy.shevche...@linux.intel.com> wrote:
> > On Fri, Dec 18, 2020 at 07:29:19PM -0700, Simon Glass wrote:
> > > On Wed, 16 Dec 2020 at 16:16, Andy Shevchenko
> > > <andriy.shevche...@linux.intel.com> wrote:
> > > >
> > > > It's realloc() 101 to avoid `foo = realloc(foo, ...);` call
> > > > due to getting a memory leak.
> > >
> > > Hmm I don't think I knew that...
> >
> > When you use the same variable for the source and destination in case of 
> > NULL
> > the source gone.
> >
> > It's okay to have
> >
> >         foo = bar;
> >         bar = realloc(bar, ...);
> >         if (bar == NULL)
> >         ...do something with foo if needed...
> 
> Here is man malloc on this point:
> 
> If ptr is NULL, then  the  call  is  equivalent  to  mal‐
>        loc(size), for all values of size; if size is equal to zero, and ptr is
>        not NULL, then the call is equivalent  to  free(ptr).

But it's about another case.
I'm talking about realloc() to fail.

        foo = realloc(foo, ...);

will effectively leak memory if foo is not saved previously somewhere.
And this is the case here.

For instance [1] is telling about the same:
  "Of course if you will write

    p = realloc(p, 2 * sizeof(int));

  ... if the function was unable to reallocate memory. In this case a memory
  leak will occur provided that initial value of the pointer p was not equal
  to NULL."

Really, it's 101 of realloc() usage.

[1]: 
https://stackoverflow.com/questions/57498538/does-realloc-mutate-its-arguments

-- 
With Best Regards,
Andy Shevchenko


Reply via email to