diff options
author | Shailesh Mistry <shailesh.mistry@hotmail.co.uk> | 2015-11-04 15:47:02 +0000 |
---|---|---|
committer | Shailesh Mistry <shailesh.mistry@hotmail.co.uk> | 2015-12-09 21:21:44 +0000 |
commit | 47dd8a92aeb7b574748871127a6621ce9f7abbb9 (patch) | |
tree | d2b7868408c0923fa676b4529876706da52c08d6 /cups | |
parent | 160665445b3b10da794959e508b5dd800b0592e5 (diff) | |
download | ghostpdl-47dd8a92aeb7b574748871127a6621ce9f7abbb9.tar.gz |
Fix memory leaks in cups device
Noticed while debugging Bug 694179.
The main leak here is due to the strdup in cups_get_params and cups_put_params.
The code was then refactored to have one exit point to catch the remaining
6K leak.
However, the final 6k is due to the global structure created in
cups_globals_alloc and later freed in cups_globals_free. The free function
call is only done on windows due to a #define WIN32 and not called on a
Linux machine where the server continues to run.
No cluster differences
Diffstat (limited to 'cups')
-rw-r--r-- | cups/gdevcups.c | 161 |
1 files changed, 87 insertions, 74 deletions
diff --git a/cups/gdevcups.c b/cups/gdevcups.c index ccd3bcb42..84fc6599f 100644 --- a/cups/gdevcups.c +++ b/cups/gdevcups.c @@ -870,13 +870,16 @@ private int /* O - Error status */ cups_get_params(gx_device *pdev, /* I - Device info */ gs_param_list *plist) /* I - Parameter list */ { -#ifdef CUPS_RASTER_SYNCv1 - int i; /* Looping var */ - char name[255]; /* Attribute name */ -#endif /* CUPS_RASTER_SYNCv1 */ int code; /* Return code */ gs_param_string s; /* Temporary string value */ bool b; /* Temporary boolean value */ +#ifdef CUPS_RASTER_SYNCv1 + int i; /* Looping var */ + char *get_name = (char *)gs_alloc_bytes(pdev->memory->non_gc_memory, gp_file_name_sizeof, "cups_get_params(get_name)"); + + if (get_name == NULL) + return(gs_note_error(gs_error_VMerror)); +#endif /* CUPS_RASTER_SYNCv1 */ #ifdef CUPS_DEBUG2 @@ -892,7 +895,7 @@ cups_get_params(gx_device *pdev, /* I - Device info */ #endif /* CUPS_DEBUG2 */ if ((code = gdev_prn_get_params(pdev, plist)) < 0) - return (code); + goto done; #ifdef CUPS_DEBUG2 dmprintf(pdev->memory, "DEBUG2: after gdev_prn_get_params()\n"); @@ -904,191 +907,193 @@ cups_get_params(gx_device *pdev, /* I - Device info */ param_string_from_transient_string(s, cups->header.MediaClass); if ((code = param_write_string(plist, "MediaClass", &s)) < 0) - return (code); + goto done; param_string_from_transient_string(s, cups->header.MediaColor); if ((code = param_write_string(plist, "MediaColor", &s)) < 0) - return (code); + goto done; param_string_from_transient_string(s, cups->header.MediaType); if ((code = param_write_string(plist, "MediaType", &s)) < 0) - return (code); + goto done; param_string_from_transient_string(s, cups->header.OutputType); if ((code = param_write_string(plist, "OutputType", &s)) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "AdvanceDistance", (int *)&(cups->header.AdvanceDistance))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "AdvanceMedia", (int *)&(cups->header.AdvanceMedia))) < 0) - return (code); + goto done; b = cups->header.Collate; if ((code = param_write_bool(plist, "Collate", &b)) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "CutMedia", (int *)&(cups->header.CutMedia))) < 0) - return (code); + goto done; b = cups->header.Duplex; if ((code = param_write_bool(plist, "Duplex", &b)) < 0) - return (code); + goto done; b = cups->header.InsertSheet; if ((code = param_write_bool(plist, "InsertSheet", &b)) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "Jog", (int *)&(cups->header.Jog))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "LeadingEdge", (int *)&(cups->header.LeadingEdge))) < 0) - return (code); + goto done; b = cups->header.ManualFeed; if ((code = param_write_bool(plist, "ManualFeed", &b)) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "MediaPosition", (int *)&(cups->header.MediaPosition))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "MediaWeight", (int *)&(cups->header.MediaWeight))) < 0) - return (code); + goto done; b = cups->header.MirrorPrint; if ((code = param_write_bool(plist, "MirrorPrint", &b)) < 0) - return (code); + goto done; b = cups->header.NegativePrint; if ((code = param_write_bool(plist, "NegativePrint", &b)) < 0) - return (code); + goto done; b = cups->header.OutputFaceUp; if ((code = param_write_bool(plist, "OutputFaceUp", &b)) < 0) - return (code); + goto done; b = cups->header.Separations; if ((code = param_write_bool(plist, "Separations", &b)) < 0) - return (code); + goto done; b = cups->header.TraySwitch; if ((code = param_write_bool(plist, "TraySwitch", &b)) < 0) - return (code); + goto done; b = cups->header.Tumble; if ((code = param_write_bool(plist, "Tumble", &b)) < 0) - return (code); + goto done; #if 0 /* Don't include read-only parameters... */ if ((code = param_write_int(plist, "cupsWidth", (int *)&(cups->header.cupsWidth))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsHeight", (int *)&(cups->header.cupsHeight))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsBitsPerPixel", (int *)&(cups->header.cupsBitsPerPixel))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsBytesPerLine", (int *)&(cups->header.cupsBytesPerLine))) < 0) - return (code); + goto done; #endif /* 0 */ if ((code = param_write_int(plist, "cupsMediaType", (int *)&(cups->header.cupsMediaType))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsBitsPerColor", (int *)&(cups->header.cupsBitsPerColor))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsColorOrder", (int *)&(cups->header.cupsColorOrder))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsColorSpace", (int *)&(cups->header.cupsColorSpace))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsCompression", (int *)&(cups->header.cupsCompression))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsRowCount", (int *)&(cups->header.cupsRowCount))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsRowFeed", (int *)&(cups->header.cupsRowFeed))) < 0) - return (code); + goto done; if ((code = param_write_int(plist, "cupsRowStep", (int *)&(cups->header.cupsRowStep))) < 0) - return (code); + goto done; #ifdef CUPS_RASTER_SYNCv1 #if 0 /* Don't include read-only parameters... */ if ((code = param_write_int(plist, "cupsNumColors", (int *)&(cups->header.cupsNumColors))) < 0) - return (code); + goto done; #endif /* 0 */ if ((code = param_write_float(plist, "cupsBorderlessScalingFactor", &(cups->header.cupsBorderlessScalingFactor))) < 0) - return (code); + goto done; for (i = 0; i < 16; i ++) { - sprintf(name, "cupsInteger%d", i); - if ((code = param_write_int(plist, strdup(name), + gs_sprintf(get_name, "cupsInteger%d", i); + if ((code = param_write_int(plist, get_name, (int *)(cups->header.cupsInteger + i))) < 0) - return (code); + goto done; } for (i = 0; i < 16; i ++) { - sprintf(name, "cupsReal%d", i); - if ((code = param_write_float(plist, strdup(name), + gs_sprintf(get_name, "cupsReal%d", i); + if ((code = param_write_float(plist, get_name, cups->header.cupsReal + i)) < 0) - return (code); + goto done; } for (i = 0; i < 16; i ++) { - sprintf(name, "cupsString%d", i); + gs_sprintf(get_name, "cupsString%d", i); param_string_from_transient_string(s, cups->header.cupsString[i]); - if ((code = param_write_string(plist, strdup(name), &s)) < 0) - return (code); + if ((code = param_write_string(plist, get_name, &s)) < 0) + goto done; } param_string_from_transient_string(s, cups->header.cupsMarkerType); if ((code = param_write_string(plist, "cupsMarkerType", &s)) < 0) - return (code); + goto done; param_string_from_transient_string(s, cups->header.cupsRenderingIntent); if ((code = param_write_string(plist, "cupsRenderingIntent", &s)) < 0) - return (code); + goto done; param_string_from_transient_string(s, cups->header.cupsPageSizeName); if ((code = param_write_string(plist, "cupsPageSizeName", &s)) < 0) - return (code); + goto done; #endif /* CUPS_RASTER_SYNCv1 */ +done: + #ifdef CUPS_DEBUG2 dmprintf(pdev->memory, "DEBUG2: Leaving cups_get_params()\n"); #endif /* CUPS_DEBUG2 */ - return (0); + return code; } @@ -2772,7 +2777,7 @@ cups_open(gx_device *pdev) /* I - Device info */ } if ((code = gdev_prn_open(pdev)) != 0) - return (code); + return(code); if (cups->PPD == NULL) cups->PPD = ppdOpenFile(getenv("PPD")); @@ -2996,10 +3001,6 @@ cups_put_params(gx_device *pdev, /* I - Device info */ gs_param_list *plist) /* I - Parameter list */ { int i; /* Looping var */ -#ifdef CUPS_RASTER_SYNCv1 - char name[255]; /* Name of attribute */ - float sf; /* cupsBorderlessScalingFactor */ -#endif /* CUPS_RASTER_SYNCv1 */ float margins[4]; /* Physical margins of print */ ppd_size_t *size; /* Page size */ int code; /* Error code */ @@ -3033,6 +3034,14 @@ cups_put_params(gx_device *pdev, /* I - Device info */ gs_param_string icc_pro_dummy; int old_cmps = cups->color_info.num_components; int old_depth = cups->color_info.depth; +#ifdef CUPS_RASTER_SYNCv1 + float sf; /* cupsBorderlessScalingFactor */ + char *put_name = (char *)gs_alloc_bytes(pdev->memory->non_gc_memory, gp_file_name_sizeof, "cups_put_params(put_name)"); + + if (put_name == NULL) + return(gs_note_error(gs_error_VMerror)); + +#endif /* CUPS_RASTER_SYNCv1 */ #ifdef CUPS_DEBUG dmprintf2(pdev->memory, "DEBUG2: cups_put_params(%p, %p)\n", pdev, plist); @@ -3047,7 +3056,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ { \ dmprintf1(pdev->memory, "ERROR: Error setting %s...\n", sname); \ param_signal_error(plist, sname, code); \ - return (code); \ + goto done; \ } \ else if (code == 0) \ { \ @@ -3061,7 +3070,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ { \ dmprintf1(pdev->memory, "ERROR: Error setting %s ...\n", sname); \ param_signal_error(plist, sname, code); \ - return (code); \ + goto done; \ } \ else if (code == 0) \ { \ @@ -3073,7 +3082,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ { \ dmprintf1(pdev->memory, "ERROR: Error setting %s ...\n", sname); \ param_signal_error(plist, sname, code); \ - return (code); \ + goto done; \ } \ else if (code == 0) \ { \ @@ -3087,7 +3096,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ { \ dmprintf1(pdev->memory, "ERROR: Error setting %s ...\n", sname); \ param_signal_error(plist, sname, code); \ - return (code); \ + goto done; \ } \ if (code == 0) \ cups->header.name = CUPS_FALSE; \ @@ -3104,7 +3113,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ { \ dmprintf1(pdev->memory, "ERROR: Error setting %s...\n", sname); \ param_signal_error(plist, sname, code); \ - return (code); \ + goto done; \ } \ if (code == 0) \ { \ @@ -3200,20 +3209,20 @@ cups_put_params(gx_device *pdev, /* I - Device info */ for (i = 0; i < 16; i ++) { - sprintf(name, "cupsInteger%d", i); - intoption(cupsInteger[i],strdup(name), unsigned) + gs_sprintf(put_name, "cupsInteger%d", i); + intoption(cupsInteger[i], put_name, unsigned) } for (i = 0; i < 16; i ++) { - sprintf(name, "cupsReal%d", i); - floatoption(cupsReal[i], strdup(name)) + gs_sprintf(put_name, "cupsReal%d", i); + floatoption(cupsReal[i], put_name) } for (i = 0; i < 16; i ++) { - sprintf(name, "cupsString%d", i); - stringoption(cupsString[i], strdup(name)) + gs_sprintf(put_name, "cupsString%d", i); + stringoption(cupsString[i], put_name) } stringoption(cupsMarkerType, "cupsMarkerType"); @@ -3224,7 +3233,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ if ((code = param_read_string(plist, "cupsProfile", &stringval)) < 0) { param_signal_error(plist, "cupsProfile", code); - return (code); + goto done; } else if (code == 0) { @@ -3235,7 +3244,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ } if ((code = cups_set_color_info(pdev)) < 0) { - return(code); + goto done; } /* @@ -3243,7 +3252,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ */ if ((code = gdev_prn_put_params(pdev, plist)) < 0) - return (code); + goto done; /* If cups_set_color_info() changed the color model of the device we want to * force the raster memory to be recreated/reinitialized @@ -3751,7 +3760,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ width_old, height_old, transp_old)) < 0) - return (code); + goto done; #ifdef CUPS_DEBUG dmprintf4(pdev->memory, "DEBUG2: Reallocated memory, [%.0f %.0f] = %dx%d pixels...\n", pdev->MediaSize[0], pdev->MediaSize[1], width, height); @@ -3928,7 +3937,11 @@ cups_put_params(gx_device *pdev, /* I - Device info */ pdev->HWMargins[2], pdev->HWMargins[3]); #endif /* CUPS_DEBUG */ - return (0); +done: +#ifdef CUPS_RASTER_SYNCv1 + gs_free_object(pdev->memory->non_gc_memory, put_name, "cups_put_params(put_name)"); +#endif + return code; } /* |