[PATCH:libXfont] Don't leak old allocation if realloc fails to enlarge it
Peter Hutterer
peter.hutterer at who-t.net
Sun Dec 8 15:57:57 PST 2013
On Sun, Dec 08, 2013 at 10:40:15AM -0800, Alan Coopersmith wrote:
> In ftfuncs.c, since the buffer being reallocated is a function local
> buffer, used to accumulate data for a single run of the function and
> then freed at the end of the function, we just free the old buffer if
> realloc fails.
>
> In atom.c however, the ReverseMap is a static buffer, so we operate in
> temporary variables until we know we're successful, then update the
> static variables. If we fail, we leave the old static variables in place,
> since they contain data about previous atoms we should maintain, not lose.
>
> Reported by cppcheck:
> [lib/libXfont/src/FreeType/ftfuncs.c:2122]: (error) Common realloc mistake:
> 'ranges' nulled but not freed upon failure
> [lib/libXfont/src/util/atom.c:126]: (error) Common realloc mistake:
> 'reverseMap' nulled but not freed upon failure
>
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
> ---
> src/FreeType/ftfuncs.c | 9 ++++++---
> src/util/atom.c | 20 ++++++++++++--------
> 2 files changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/src/FreeType/ftfuncs.c b/src/FreeType/ftfuncs.c
> index 2c90cf9..44e5e02 100644
> --- a/src/FreeType/ftfuncs.c
> +++ b/src/FreeType/ftfuncs.c
> @@ -2050,7 +2050,7 @@ restrict_code_range_by_str(int count,unsigned short *refFirstCol,
> {
> int nRanges = 0;
> int result = 0;
> - fsRange *ranges = NULL;
> + fsRange *ranges = NULL, *oldRanges;
> char const *p, *q;
>
> p = q = str;
> @@ -2119,10 +2119,13 @@ restrict_code_range_by_str(int count,unsigned short *refFirstCol,
> fflush(stderr);
> #endif
> nRanges++;
> + oldRanges = ranges;
> ranges = realloc(ranges, nRanges*sizeof(*ranges));
> - if (NULL == ranges)
> + if (NULL == ranges) {
> + free(oldRanges);
> break;
> - {
> + }
> + else {
> fsRange *r = ranges+nRanges-1;
>
> r->min_char_low = minpoint & 0xff;
> diff --git a/src/util/atom.c b/src/util/atom.c
> index c47cb5c..37811f9 100644
> --- a/src/util/atom.c
> +++ b/src/util/atom.c
> @@ -118,19 +118,23 @@ ResizeHashTable (void)
> static int
> ResizeReverseMap (void)
> {
> - int ret = TRUE;
> + AtomListPtr *newMap;
> + int newMapSize;
> +
> if (reverseMapSize == 0)
> - reverseMapSize = 1000;
> + newMapSize = 1000;
> else
> - reverseMapSize *= 2;
> - reverseMap = realloc (reverseMap, reverseMapSize * sizeof (AtomListPtr));
> - if (!reverseMap) {
> + newMapSize = reverseMapSize * 2;
> + newMap = realloc (reverseMap, newMapSize * sizeof (AtomListPtr));
> + if (newMap == NULL) {
> fprintf(stderr, "ResizeReverseMap(): Error: Couldn't reallocate"
> " reverseMap (%ld)\n",
> - reverseMapSize * (unsigned long)sizeof(AtomListPtr));
> - ret = FALSE;
> + newMapSize * (unsigned long)sizeof(AtomListPtr));
> + return FALSE;
> }
> - return ret;
> + reverseMap = newMap;
> + reverseMapSize = newMapSize;
> + return TRUE;
> }
>
> static int
> --
> 1.7.9.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list