Date: Thu, 20 Aug 1998 13:49:38 -0600 From: Nate Williams <nate@mt.sri.com> To: Warner Losh <imp@village.org> Cc: hackers@FreeBSD.ORG Subject: Re: Realloc fix for review Message-ID: <199808201949.NAA08010@mt.sri.com> In-Reply-To: <199808201619.KAA20970@harmony.village.org> References: <199808201619.KAA20970@harmony.village.org>
next in thread | previous in thread | raw e-mail | index | archive | help
> Recently, OpenBSD went through their source tree and fixed all > instances of > a = realloc(a, size); > with > na = realloc(a, size); > if (!na) > free(a); > a = na; I just went through the manpage, and it appears that this code is in fact in-correct. The realloc() function changes the size of the previously allocated memo- ry referenced by ptr to size bytes. The contents of the memory are un- changed up to the lesser of the new and old sizes. If the new size is larger, the value of the newly allocated portion of the memory is unde- fined. If the requested memory cannot be allocated, NULL is returned and the memory referenced by ptr is valid and unchanged. If ptr is NULL, the realloc() function behaves identically to malloc() for the specified size. So, assuming we want a smaller chunk, then we can potentally end up with the old chunk back. The return is successful, and we end up freeing it. :( It is also possible to return the same pointer back to us, (we just extended the bucket), and we end up freeing the valid pointer. Finally, if NULL is returned, then it's up to the coder to 'Do The Right Thing', and we've violated POLA. In short, I think it's the *wrong* thing to do, and has too many worse side-effects than the original code. Nate To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199808201949.NAA08010>