From 523d9b4e96da5de6f6324fa727df1ac2cc36371a Mon Sep 17 00:00:00 2001 From: Josef Ridky Date: Thu, 23 Aug 2018 10:05:34 +0200 Subject: [PATCH] OpenScanHub: Fix a leak with missing fclose in file-xmc.c cherry picked from commit 2987f012f9289b7d608adbccc73166800b3dcf6a The code to output "seems to have an incorrect toc size." is not implemented, so no change about the part from the same commit. --- plug-ins/common/file-cel.c | 9 +++++ plug-ins/common/file-gif-load.c | 12 ++++++ plug-ins/common/file-xbm.c | 6 +++ plug-ins/common/file-xmc.c | 53 +++++++++++++++++++------- plug-ins/file-fli/fli-gimp.c | 11 +++++- plug-ins/pygimp/plug-ins/whirlpinch.py | 2 +- 6 files changed, 77 insertions(+), 16 deletions(-) diff --git a/plug-ins/common/file-cel.c b/plug-ins/common/file-cel.c index 4803275aa5..12418c4949 100644 --- a/plug-ins/common/file-cel.c +++ b/plug-ins/common/file-cel.c @@ -365,6 +365,7 @@ load_image (const gchar *file, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("EOF or error while reading image header")); + fclose (fp); return -1; } @@ -385,6 +386,7 @@ load_image (const gchar *file, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("EOF or error while reading image header")); + fclose (fp); return -1; } @@ -393,6 +395,7 @@ load_image (const gchar *file, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("is not a CEL image file")); + fclose (fp); return -1; } @@ -407,6 +410,7 @@ load_image (const gchar *file, default: g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("illegal bpp value in image: %hhu"), bpp); + fclose (fp); return -1; } @@ -423,6 +427,7 @@ load_image (const gchar *file, _("illegal image dimensions: width: %d, horizontal offset: " "%d, height: %d, vertical offset: %d"), width, offx, height, offy); + fclose (fp); return -1; } @@ -472,6 +477,7 @@ load_image (const gchar *file, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("EOF or error while reading image data")); + fclose (fp); return -1; } @@ -507,6 +513,7 @@ load_image (const gchar *file, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("EOF or error while reading image data")); + fclose (fp); return -1; } @@ -532,6 +539,7 @@ load_image (const gchar *file, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("EOF or error while reading image data")); + fclose (fp); return -1; } @@ -549,6 +557,7 @@ load_image (const gchar *file, default: g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Unsupported bit depth (%d)!"), bpp); + fclose (fp); return -1; } diff --git a/plug-ins/common/file-gif-load.c b/plug-ins/common/file-gif-load.c index 2aee9f37d9..9aa3f6ca0f 100644 --- a/plug-ins/common/file-gif-load.c +++ b/plug-ins/common/file-gif-load.c @@ -365,6 +365,7 @@ load_image (const gchar *filename, if (! ReadOK (fd, buf, 6)) { g_message ("Error reading magic number"); + fclose (fd); return -1; } @@ -372,6 +373,7 @@ load_image (const gchar *filename, { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, "%s", _("This is not a GIF file")); + fclose (fd); return -1; } @@ -381,12 +383,14 @@ load_image (const gchar *filename, if ((strcmp (version, "87a") != 0) && (strcmp (version, "89a") != 0)) { g_message ("Bad version number, not '87a' or '89a'"); + fclose (fd); return -1; } if (! ReadOK (fd, buf, 7)) { g_message ("Failed to read screen descriptor"); + fclose (fd); return -1; } @@ -404,6 +408,7 @@ load_image (const gchar *filename, &GifScreen.GrayScale)) { g_message ("Error reading global colormap"); + fclose (fd); return -1; } } @@ -421,12 +426,14 @@ load_image (const gchar *filename, if (! ReadOK (fd, &c, 1)) { g_message ("EOF / read error on image data"); + fclose (fd); return image_ID; /* will be -1 if failed on first image! */ } if (c == ';') { /* GIF terminator */ + fclose (fd); return image_ID; } @@ -436,6 +443,7 @@ load_image (const gchar *filename, if (! ReadOK (fd, &c, 1)) { g_message ("EOF / read error on extension function code"); + fclose (fd); return image_ID; /* will be -1 if failed on first image! */ } @@ -455,6 +463,7 @@ load_image (const gchar *filename, if (! ReadOK (fd, buf, 9)) { g_message ("Couldn't read left/top/width/height"); + fclose (fd); return image_ID; /* will be -1 if failed on first image! */ } @@ -467,6 +476,7 @@ load_image (const gchar *filename, if (! ReadColorMap (fd, bitPixel, localColorMap, &grayScale)) { g_message ("Error reading local colormap"); + fclose (fd); return image_ID; /* will be -1 if failed on first image! */ } @@ -514,6 +524,8 @@ load_image (const gchar *filename, break; } + fclose (fd); + return image_ID; } diff --git a/plug-ins/common/file-xbm.c b/plug-ins/common/file-xbm.c index cdf30eaf90..5737001792 100644 --- a/plug-ins/common/file-xbm.c +++ b/plug-ins/common/file-xbm.c @@ -820,6 +820,7 @@ load_image (const gchar *filename, { g_message (_("'%s':\nCould not read header (ftell == %ld)"), gimp_filename_to_utf8 (filename), ftell (fp)); + fclose (fp); return -1; } @@ -827,6 +828,7 @@ load_image (const gchar *filename, { g_message (_("'%s':\nNo image width specified"), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -834,6 +836,7 @@ load_image (const gchar *filename, { g_message (_("'%s':\nImage width is larger than GIMP can handle"), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -841,6 +844,7 @@ load_image (const gchar *filename, { g_message (_("'%s':\nNo image height specified"), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -848,6 +852,7 @@ load_image (const gchar *filename, { g_message (_("'%s':\nImage height is larger than GIMP can handle"), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -855,6 +860,7 @@ load_image (const gchar *filename, { g_message (_("'%s':\nNo image data type specified"), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } diff --git a/plug-ins/common/file-xmc.c b/plug-ins/common/file-xmc.c index a75c8fbde3..6d054fc4cc 100644 --- a/plug-ins/common/file-xmc.c +++ b/plug-ins/common/file-xmc.c @@ -659,10 +659,11 @@ load_image (const gchar *filename, GError **error) return -1; } - if (!XcursorFileLoad (fp, &commentsp, &imagesp)) + if (! XcursorFileLoad (fp, &commentsp, &imagesp)) { g_set_error (error, 0, 0, _("'%s' is not a valid X cursor."), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -679,6 +680,7 @@ load_image (const gchar *filename, GError **error) g_set_error (error, 0, 0, _("Frame %d of '%s' is too wide for an X cursor."), i + 1, gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } if (imagesp->images[i]->height > MAX_LOAD_DIMENSION) @@ -686,6 +688,7 @@ load_image (const gchar *filename, GError **error) g_set_error (error, 0, 0, _("Frame %d of '%s' is too high for an X cursor."), i + 1, gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } } @@ -704,7 +707,10 @@ load_image (const gchar *filename, GError **error) gimp_image_set_filename (image_ID, filename); if (! set_hotspot_to_parasite (image_ID)) - return -1; + { + fclose (fp); + return -1; + } /* Temporary buffer */ tmppixel = g_new (guint32, img_width * img_height); @@ -722,9 +728,12 @@ load_image (const gchar *filename, GError **error) ,i ,delay, imagesp->images[i]->width, imagesp->images[i]->height); framename = make_framename (imagesp->images[i]->size, delay, - DISPLAY_DIGIT(imagesp->nimage), error); - if (!framename) - return -1; + DISPLAY_DIGIT (imagesp->nimage), error); + if (! framename) + { + fclose (fp); + return -1; + } layer_ID = gimp_layer_new (image_ID, framename, imagesp->images[i]->width, @@ -782,6 +791,7 @@ load_image (const gchar *filename, GError **error) parasiteName[commentsp->comments[i]->comment_type -1])) { DM_XMC ("Failed to write %ith comment.\n", i); + fclose (fp); return -1; } } @@ -889,6 +899,7 @@ load_thumbnail (const gchar *filename, gint32 thumb_size, g_set_error (error, 0, 0, _("there is no image chunk in \"%s\"."), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -931,6 +942,7 @@ load_thumbnail (const gchar *filename, gint32 thumb_size, g_set_error (error, 0, 0, _("'%s' is too wide for an X cursor."), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } if (*thumb_height > MAX_LOAD_DIMENSION) @@ -938,6 +950,7 @@ load_thumbnail (const gchar *filename, gint32 thumb_size, g_set_error (error, 0, 0, _("'%s' is too high for an X cursor."), gimp_filename_to_utf8 (filename)); + fclose (fp); return -1; } @@ -1462,7 +1475,8 @@ save_image (const gchar *filename, imagesp = XcursorImagesCreate(nlayers); if (!imagesp) { - DM_XMC("Failed to XcursorImagesCreate!\n"); + DM_XMC ("Failed to XcursorImagesCreate!\n"); + fclose (fp); return FALSE; } imagesp->nimage = nlayers; @@ -1499,14 +1513,18 @@ save_image (const gchar *filename, { g_set_error (error, 0, 0, _("Frame '%s' is too wide. Please reduce to no more than %dpx."), - gimp_any_to_utf8 (framename, -1, NULL), MAX_SAVE_DIMENSION); + gimp_any_to_utf8 (framename, -1, NULL), + MAX_SAVE_DIMENSION); + fclose (fp); return FALSE; } if (drawable->height > MAX_SAVE_DIMENSION) { g_set_error (error, 0, 0, _("Frame '%s' is too high. Please reduce to no more than %dpx."), - gimp_any_to_utf8 (framename, -1, NULL), MAX_SAVE_DIMENSION); + gimp_any_to_utf8 (framename, -1, NULL), + MAX_SAVE_DIMENSION); + fclose (fp); return FALSE; } if (drawable->height == 0 ||drawable->width == 0) @@ -1514,6 +1532,7 @@ save_image (const gchar *filename, g_set_error (error, 0, 0, _("Width and/or height of frame '%s' is zero!"), gimp_any_to_utf8 (framename, -1, NULL)); + fclose (fp); return FALSE; } @@ -1535,6 +1554,7 @@ save_image (const gchar *filename, if (!imagesp->images[i]) { DM_XMC ("Failed to XcursorImageCreate.\n"); + fclose (fp); return FALSE; } imagesp->images[i]->pixels[0] = 0x0; @@ -1557,6 +1577,7 @@ save_image (const gchar *filename, "Try to change the hot spot position, " "layer geometry or save without auto-crop."), gimp_any_to_utf8 (framename, -1, NULL)); + fclose (fp); return FALSE; } } @@ -1589,6 +1610,7 @@ save_image (const gchar *filename, if (!imagesp->images[i]) { DM_XMC ("Failed to XcursorImageCreate.\n"); + fclose (fp); return FALSE; } /* @@ -1636,8 +1658,11 @@ save_image (const gchar *filename, imagesp->images[i]->delay, DISPLAY_DIGIT(imagesp->nimage), error); - if (!framename) - return FALSE; + if (! framename) + { + fclose (fp); + return FALSE; + } gimp_item_set_name (orig_layers[nlayers - 1 - i], framename); g_free (framename); @@ -1691,8 +1716,9 @@ save_image (const gchar *filename, { if (! XcursorFileSave (fp, commentsp, imagesp)) { - DM_XMC("Failed to XcursorFileSave.\t%p\t%p\t%p\n", - fp, commentsp, imagesp); + DM_XMC ("Failed to XcursorFileSave.\t%p\t%p\t%p\n", + fp, commentsp, imagesp); + fclose (fp); return FALSE; } @@ -1701,7 +1727,8 @@ save_image (const gchar *filename, { if (! XcursorFileSaveImages (fp, imagesp)) { - DM_XMC("Failed to XcursorFileSaveImages.\t%p\t%p\n", fp, imagesp); + DM_XMC ("Failed to XcursorFileSaveImages.\t%p\t%p\n", fp, imagesp); + fclose (fp); return FALSE; } } diff --git a/plug-ins/file-fli/fli-gimp.c b/plug-ins/file-fli/fli-gimp.c index e3843eb5db..be772d3c3f 100644 --- a/plug-ins/file-fli/fli-gimp.c +++ b/plug-ins/file-fli/fli-gimp.c @@ -505,9 +505,14 @@ load_image (const gchar *filename, fli_read_header (file, &fli_header); if (fli_header.magic == NO_HEADER) - return -1; + { + fclose (file); + return -1; + } else - fseek (file, 128, SEEK_SET); + { + fseek (file, 128, SEEK_SET); + } /* * Fix parameters @@ -528,11 +533,13 @@ load_image (const gchar *filename, if (to_frame < 1) { /* nothing to do ... */ + fclose (file); return -1; } if (from_frame >= fli_header.frames) { /* nothing to do ... */ + fclose (file); return -1; } if (to_frame>fli_header.frames) diff --git a/plug-ins/pygimp/plug-ins/whirlpinch.py b/plug-ins/pygimp/plug-ins/whirlpinch.py index 7897f13294..e1fbc376de 100755 --- a/plug-ins/pygimp/plug-ins/whirlpinch.py +++ b/plug-ins/pygimp/plug-ins/whirlpinch.py @@ -125,7 +125,7 @@ def whirl_pinch(image, drawable, whirl, pinch, radius): if cx >= 0: ix = int(cx) else: ix = -(int(-cx) + 1) if cy >= 0: iy = int(cy) - else: iy = -(int(-cx) + 1) + else: iy = -(int(-cy) + 1) pixel[0] = pft.get_pixel(ix, iy) pixel[1] = pft.get_pixel(ix+1, iy) pixel[2] = pft.get_pixel(ix, iy+1) -- 2.43.0