summaryrefslogtreecommitdiff
path: root/cups
diff options
context:
space:
mode:
authorShailesh Mistry <shailesh.mistry@hotmail.co.uk>2015-11-04 15:47:02 +0000
committerShailesh Mistry <shailesh.mistry@hotmail.co.uk>2015-12-09 21:21:44 +0000
commit47dd8a92aeb7b574748871127a6621ce9f7abbb9 (patch)
treed2b7868408c0923fa676b4529876706da52c08d6 /cups
parent160665445b3b10da794959e508b5dd800b0592e5 (diff)
downloadghostpdl-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.c161
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;
}
/*