Fixed memory leaks.
authorArmin Novak <armin.novak@gmail.com>
Sun, 16 Nov 2014 22:37:02 +0000 (23:37 +0100)
committerArmin Novak <armin.novak@gmail.com>
Sun, 16 Nov 2014 22:37:02 +0000 (23:37 +0100)
rdtk/librdtk/rdtk_font.c

index 90837b8..91b3366 100644 (file)
@@ -583,30 +583,30 @@ rdtkFont* rdtk_font_new(rdtkEngine* engine, const char* path, const char* file)
 {
        int status;
        int length;
-       rdtkFont* font;
-       char* fontBaseFile;
-       char* fontImageFile;
-       char* fontDescriptorFile;
+       rdtkFont* font = NULL;
+       char* fontBaseFile = NULL;
+       char* fontImageFile = NULL;
+       char* fontDescriptorFile = NULL;
 
        fontBaseFile = GetCombinedPath(path, file);
 
        if (!fontBaseFile)
-               return NULL;
+               goto cleanup;
 
        length = strlen(fontBaseFile);
 
        fontImageFile = (char*) malloc(length + 8);
 
        if (!fontImageFile)
-               return NULL;
+               goto cleanup;
 
        strcpy(fontImageFile, fontBaseFile);
        strcpy(&fontImageFile[length], ".png");
 
        fontDescriptorFile = (char*) malloc(length + 8);
 
-       if (!fontImageFile)
-               return NULL;
+       if (!fontDescriptorFile)
+               goto cleanup;
 
        strcpy(fontDescriptorFile, fontBaseFile);
        strcpy(&fontDescriptorFile[length], ".xml");
@@ -614,27 +614,27 @@ rdtkFont* rdtk_font_new(rdtkEngine* engine, const char* path, const char* file)
        free(fontBaseFile);
 
        if (!PathFileExistsA(fontImageFile))
-               return NULL;
+               goto cleanup;
 
        if (!PathFileExistsA(fontDescriptorFile))
-               return NULL;
+               goto cleanup;
 
        font = (rdtkFont*) calloc(1, sizeof(rdtkFont));
 
        if (!font)
-               return NULL;
+               goto cleanup;
 
        font->engine = engine;
 
        font->image = winpr_image_new();
 
        if (!font->image)
-               return NULL;
+               goto cleanup;
 
        status = winpr_image_read(font->image, fontImageFile);
 
        if (status < 0)
-               return NULL;
+               goto cleanup;
 
        status = rdtk_font_load_descriptor(font, fontDescriptorFile);
 
@@ -642,6 +642,20 @@ rdtkFont* rdtk_font_new(rdtkEngine* engine, const char* path, const char* file)
        free(fontDescriptorFile);
 
        return font;
+
+cleanup:
+       if (fontImageFile)
+               free (fontImageFile);
+       if (fontDescriptorFile)
+               free (fontDescriptorFile);
+       if (font)
+       {
+               if (font->image)
+                       winpr_image_free(font->image);
+               free (font);
+       }
+
+       return NULL;
 }
 
 rdtkFont* rdtk_embedded_font_new(rdtkEngine* engine, BYTE* imageData, int imageSize, BYTE* descriptorData, int descriptorSize)