From owner-freebsd-bugs Sat Jun 14 06:08:40 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id GAA22290 for bugs-outgoing; Sat, 14 Jun 1997 06:08:40 -0700 (PDT) Received: from X2296 (ppp1616.on.sympatico.ca [206.172.249.80]) by hub.freebsd.org (8.8.5/8.8.5) with ESMTP id GAA22283; Sat, 14 Jun 1997 06:08:36 -0700 (PDT) Received: from localhost (tim@localhost) by X2296 (8.7.6/8.7.3) with SMTP id JAA00254; Sat, 14 Jun 1997 09:07:47 -0400 (EDT) Date: Sat, 14 Jun 1997 09:07:46 -0400 (EDT) From: Tim Vanderhoek Reply-To: ac199@hwcn.org To: Bruce Evans cc: ac199@hwcn.org, freebsd-bugs@hub.freebsd.org, freebsd-gnats-submit@freebsd.org Subject: Re: bin/3451: vasprintf() doesn't work. In-Reply-To: <199706140156.LAA12946@godzilla.zeta.org.au> Message-ID: X-OS: FreeBSD 2.2 X-Mailer: Pine MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-bugs@freebsd.org X-Loop: FreeBSD.org Precedence: bulk On Sat, 14 Jun 1997, Bruce Evans wrote: > > *str = realloc(h.base, (size_t)(h.size - h.left + 1)); > > if (*str == NULL) /* failed to realloc it to actual size */ > > ! return (-1); > > ! (*str)[h.size - h.left] = '\0'; > > return (ret); > > } > > One more problem: realloc() can fail, resulting in a leaking the memory > pointed to by h.base. Which, of course, points us to yet another error in the original vasprintf.c... :) The test to see if str is NULL is *str == NULL.... Final patch frees h.base (as is done everywhere else) and fixes that... :) *** old.vasprintf.c Tue Apr 29 21:32:00 1997 --- vasprintf.c Sat Jun 14 08:56:41 1997 *************** *** 111,119 **** if (h.base == NULL) /* failed to realloc in writehook */ return (-1); - h.base[h.size - h.left] = '\0'; *str = realloc(h.base, (size_t)(h.size - h.left + 1)); ! if (*str == NULL) /* failed to realloc it to actual size */ ! *str = h.base; /* return oversize buffer */ return (ret); } --- 111,121 ---- if (h.base == NULL) /* failed to realloc in writehook */ return (-1); *str = realloc(h.base, (size_t)(h.size - h.left + 1)); ! if (str == NULL) { /* failed to realloc it to actual size */ ! free(h.base); ! return (-1); ! } ! (*str)[h.size - h.left] = '\0'; return (ret); } -- tIM...HOEk optimization: The theory that making your code incomprehensible by using only one-letter variable names will make it run faster.