From: Ilia Alshanetsky Date: Sun, 24 Nov 2002 01:15:34 +0000 (+0000) Subject: Fixed 3 memory leaks. X-Git-Tag: RELEASE_1_0b2~37 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ef26e2d1f83ec3ad30af9e66f69f62e4d170ee70;p=php Fixed 3 memory leaks. Formatted the code to meet PHP's coding standards, which makes it MUCH easier to understand. --- diff --git a/ext/gd/libgd/gdft.c b/ext/gd/libgd/gdft.c index 022604b6ad..620ff9c7a2 100644 --- a/ext/gd/libgd/gdft.c +++ b/ext/gd/libgd/gdft.c @@ -330,153 +330,147 @@ fontTest (void *element, void *key) return (strcmp (a->fontlist, b->fontlist) == 0); } -static void * -fontFetch (char **error, void *key) +static void *fontFetch (char **error, void *key) { - font_t *a; - fontkey_t *b = (fontkey_t *) key; - int n; - int font_found = 0; - unsigned short platform, encoding; - char *fontsearchpath, *fontlist; - char *fullname = NULL; - char *name, *path, *dir; - char *strtok_ptr; - FT_Error err; - FT_CharMap found = 0; - FT_CharMap charmap; - - a = (font_t *) gdMalloc (sizeof (font_t)); - a->fontlist = gdEstrdup (b->fontlist); - a->library = b->library; - - /* - * Search the pathlist for any of a list of font names. - */ - fontsearchpath = getenv ("GDFONTPATH"); - if (!fontsearchpath) - fontsearchpath = DEFAULT_FONTPATH; - fontlist = gdEstrdup (a->fontlist); - - /* - * Must use gd_strtok_r else pointer corrupted by strtok in nested loop. - */ - for (name = gd_strtok_r (fontlist, LISTSEPARATOR, &strtok_ptr); name; - name = gd_strtok_r (0, LISTSEPARATOR, &strtok_ptr)) - { - - /* make a fresh copy each time - strtok corrupts it. */ - path = gdEstrdup (fontsearchpath); - /* - * Allocate an oversized buffer that is guaranteed to be - * big enough for all paths to be tested. - */ - fullname = gdRealloc (fullname, - strlen (fontsearchpath) + strlen (name) + 6); - /* if name is an absolute filename then test directly */ - if (*name == '/' || (name[0] != 0 && name[1] == ':' && (name[2] == '/' || name[2] == '\\'))) - { - sprintf (fullname, "%s", name); - if (access (fullname, R_OK) == 0) - { - font_found++; - break; - } + font_t *a; + fontkey_t *b = (fontkey_t *) key; + int n; + int font_found = 0; + unsigned short platform, encoding; + char *fontsearchpath, *fontlist; + char *fullname = NULL; + char *name, *path=NULL, *dir; + char *strtok_ptr; + FT_Error err; + FT_CharMap found = 0; + FT_CharMap charmap; + + a = (font_t *) gdPMalloc(sizeof(font_t)); + a->fontlist = gdPEstrdup(b->fontlist); + a->library = b->library; + + /* + * Search the pathlist for any of a list of font names. + */ + fontsearchpath = getenv ("GDFONTPATH"); + if (!fontsearchpath) { + fontsearchpath = DEFAULT_FONTPATH; + } + fontlist = gdEstrdup(a->fontlist); + + /* + * Must use gd_strtok_r else pointer corrupted by strtok in nested loop. + */ + for (name = gd_strtok_r (fontlist, LISTSEPARATOR, &strtok_ptr); name; name = gd_strtok_r (0, LISTSEPARATOR, &strtok_ptr)) { + /* make a fresh copy each time - strtok corrupts it. */ + path = gdEstrdup (fontsearchpath); + + /* + * Allocate an oversized buffer that is guaranteed to be + * big enough for all paths to be tested. + */ + fullname = gdRealloc (fullname, strlen (fontsearchpath) + strlen (name) + 6); + + /* if name is an absolute filename then test directly */ + if (*name == '/' || (name[0] != 0 && name[1] == ':' && (name[2] == '/' || name[2] == '\\'))) { + sprintf(fullname, "%s", name); + if (access(fullname, R_OK) == 0) { + font_found++; + break; + } + } + for (dir = strtok (path, PATHSEPARATOR); dir; dir = strtok (0, PATHSEPARATOR)) { + sprintf(fullname, "%s/%s.ttf", dir, name); + if (access (fullname, R_OK) == 0) { + font_found++; + break; + } + sprintf(fullname, "%s/%s.pfa", dir, name); + if (access(fullname, R_OK) == 0) { + font_found++; + break; + } + sprintf (fullname, "%s/%s.pfb", dir, name); + if (access(fullname, R_OK) == 0) { + font_found++; + break; + } + } + gdFree(path); + if (font_found) { + break; + } } - for (dir = strtok (path, PATHSEPARATOR); dir; - dir = strtok (0, PATHSEPARATOR)) - { - sprintf (fullname, "%s/%s.ttf", dir, name); - if (access (fullname, R_OK) == 0) - { - font_found++; - break; - } - sprintf (fullname, "%s/%s.pfa", dir, name); - if (access (fullname, R_OK) == 0) - { - font_found++; - break; + + if (path) { + gdFree(path); } - sprintf (fullname, "%s/%s.pfb", dir, name); - if (access (fullname, R_OK) == 0) - { - font_found++; - break; - } + + gdFree(fontlist); + + if (!font_found) { + gdPFree(a->fontlist); + gdPFree(a); + *error = "Could not find/open font"; + return NULL; } - gdFree (path); - if (font_found) - break; - } - gdFree (fontlist); - if (!font_found) - { - *error = "Could not find/open font"; - return NULL; - } - - err = FT_New_Face (*b->library, fullname, 0, &a->face); - if (err) - { - *error = "Could not read font"; - return NULL; - } - gdFree (fullname); -/* FIXME - This mapping stuff is imcomplete - where is the spec? */ - - a->have_char_map_unicode = 0; - a->have_char_map_big5 = 0; - a->have_char_map_sjis = 0; - a->have_char_map_apple_roman = 0; - for (n = 0; n < a->face->num_charmaps; n++) - { - charmap = a->face->charmaps[n]; - platform = charmap->platform_id; - encoding = charmap->encoding_id; - if ((platform == 3 && encoding == 1) /* Windows Unicode */ - || (platform == 3 && encoding == 0) /* Windows Symbol */ - || (platform == 2 && encoding == 1) /* ISO Unicode */ - || (platform == 0)) - { /* Apple Unicode */ - a->have_char_map_unicode = 1; - found = charmap; - } - else if (platform == 3 && encoding == 4) - { /* Windows Big5 */ - a->have_char_map_big5 = 1; - found = charmap; + err = FT_New_Face (*b->library, fullname, 0, &a->face); + if (err) { + gdPFree(a->fontlist); + gdPFree(a); + *error = "Could not read font"; + return NULL; } - else if (platform == 3 && encoding == 2) - { /* Windows Sjis */ - a->have_char_map_sjis = 1; - found = charmap; + gdFree(fullname); + + /* FIXME - This mapping stuff is imcomplete - where is the spec? */ + + a->have_char_map_unicode = 0; + a->have_char_map_big5 = 0; + a->have_char_map_sjis = 0; + a->have_char_map_apple_roman = 0; + for (n = 0; n < a->face->num_charmaps; n++) { + charmap = a->face->charmaps[n]; + platform = charmap->platform_id; + encoding = charmap->encoding_id; + if ((platform == 3 && encoding == 1) /* Windows Unicode */ + || (platform == 3 && encoding == 0) /* Windows Symbol */ + || (platform == 2 && encoding == 1) /* ISO Unicode */ + || (platform == 0)) + { /* Apple Unicode */ + a->have_char_map_unicode = 1; + found = charmap; + } else if (platform == 3 && encoding == 4) { /* Windows Big5 */ + a->have_char_map_big5 = 1; + found = charmap; + } else if (platform == 3 && encoding == 2) { /* Windows Sjis */ + a->have_char_map_sjis = 1; + found = charmap; + } else if ((platform == 1 && encoding == 0) /* Apple Roman */ + || (platform == 2 && encoding == 0)) + { /* ISO ASCII */ + a->have_char_map_apple_roman = 1; + found = charmap; + } } - else if ((platform == 1 && encoding == 0) /* Apple Roman */ - || (platform == 2 && encoding == 0)) - { /* ISO ASCII */ - a->have_char_map_apple_roman = 1; - found = charmap; + if (!found) { + gdPFree(a->fontlist); + gdPFree(a); + *error = "Unable to find a CharMap that I can handle"; + return NULL; } - } - if (!found) - { - *error = "Unable to find a CharMap that I can handle"; - return NULL; - } - return (void *) a; + return (void *) a; } -static void -fontRelease (void *element) +static void fontRelease (void *element) { - font_t *a = (font_t *) element; + font_t *a = (font_t *) element; - FT_Done_Face (a->face); - gdFree (a->fontlist); - gdFree ((char *) element); + FT_Done_Face (a->face); + gdPFree(a->fontlist); + gdPFree((char *) element); } /********************************************************************/