cups-filters/cups-filters-resolution-memleaks.patch
DistroBaker efcac2932d Merged update from upstream sources
This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/cups-filters.git#12bd6655362f7e0f8790c34a208d10ca6333f99e
2020-11-24 06:11:48 +00:00

125 lines
4.5 KiB
Diff

diff --git a/cupsfilters/ppdgenerator.c b/cupsfilters/ppdgenerator.c
index 7b4aa0c..bc694f0 100644
--- a/cupsfilters/ppdgenerator.c
+++ b/cupsfilters/ppdgenerator.c
@@ -1059,9 +1059,11 @@ ippResolutionListToArray(ipp_attribute_t *attr)
res_array = resolutionArrayNew();
if (res_array) {
for (i = 0; i < count; i ++)
- if ((res = ippResolutionToRes(attr, i)) != NULL &&
- cupsArrayFind(res_array, res) == NULL)
- cupsArrayAdd(res_array, res);
+ if ((res = ippResolutionToRes(attr, i)) != NULL) {
+ if (cupsArrayFind(res_array, res) == NULL)
+ cupsArrayAdd(res_array, res);
+ free_resolution(res, NULL);
+ }
}
if (cupsArrayCount(res_array) == 0) {
cupsArrayDelete(res_array);
diff --git a/cupsfilters/ppdgenerator.h b/cupsfilters/ppdgenerator.h
index 5e03e6d..050c320 100644
--- a/cupsfilters/ppdgenerator.h
+++ b/cupsfilters/ppdgenerator.h
@@ -71,6 +71,7 @@ char *ppdCreateFromIPP2(char *buffer, size_t bufsize,
const char *default_cluster_color);
int compare_resolutions(void *resolution_a, void *resolution_b,
void *user_data);
+void free_resolution(void *resolution, void *user_data);
res_t * ippResolutionToRes(ipp_attribute_t *attr, int index);
cups_array_t * resolutionArrayNew();
cups_array_t* generate_sizes(ipp_t *response,
diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c
index e2c9d38..8a882a1 100644
--- a/utils/cups-browsed.c
+++ b/utils/cups-browsed.c
@@ -1733,12 +1733,14 @@ void add_resolution_attributes(char* cluster_name, ipp_t **merged_attributes)
if ((attr = ippFindAttribute(p->prattrs, attributes[attr_no],
IPP_TAG_RESOLUTION)) != NULL) {
for (i = 0, count = ippGetCount(attr); i < count; i ++) {
- if ((res = ippResolutionToRes(attr, i)) != NULL &&
- cupsArrayFind(res_array, res) == NULL) {
- cupsArrayAdd(res_array, res);
- num_resolution ++;
- }
- }
+ if ((res = ippResolutionToRes(attr, i)) != NULL) {
+ if (cupsArrayFind(res_array, res) == NULL) {
+ cupsArrayAdd(res_array, res);
+ num_resolution ++;
+ }
+ free_resolution(res, NULL);
+ }
+ }
}
}
if (num_resolution) {
@@ -3219,6 +3221,7 @@ void get_cluster_default_attributes(ipp_t** merged_attributes,
"printer-resolution-default",
IPP_RES_PER_INCH, xres, yres);
debug_printf("Default Resolution : %dx%d\n", xres, yres);
+ free_resolution(res, NULL);
}
}
@@ -6157,7 +6160,7 @@ on_job_state (CupsNotifier *object,
const char *pdl = NULL;
cups_array_t *pdl_list;
char resolution[32];
- res_t *max_res = NULL, *min_res = NULL, *res;
+ res_t *max_res = NULL, *min_res = NULL, *res = NULL;
int xres, yres;
int got_printer_info;
static const char *pattrs[] =
@@ -6504,6 +6507,10 @@ on_job_state (CupsNotifier *object,
/* Deciding the resolution to be sent with the job */
/* Finding the minimum and maximum resolution supported by the printer */
+
+ max_res = resolutionNew(0, 0);
+ min_res = resolutionNew(0, 0);
+
if (s &&
((attr = ippFindAttribute(s->prattrs, "printer-resolution-supported",
IPP_TAG_RESOLUTION)) != NULL)) {
@@ -6511,14 +6518,20 @@ on_job_state (CupsNotifier *object,
if ((res = ippResolutionToRes(attr, i)) != NULL) {
debug_printf("%d %d\n",res->x,res->y);
if (i == 0) {
- max_res = res;
- min_res = res;
+ max_res->x = res->x;
+ max_res->y = res->y;
+ min_res->x = res->x;
+ min_res->y = res->y;
} else {
if(compare_resolutions((void *)res,(void *)max_res,NULL) > 0)
- max_res = res;
+ max_res->x = res->x;
+ max_res->y = res->y;
if(compare_resolutions((void *)res,(void *)min_res,NULL) < 0)
- min_res = res;
+ min_res->x = res->x;
+ min_res->y = res->y;
}
+ free_resolution(res, NULL);
+ res = NULL;
}
}
}
@@ -6555,10 +6568,14 @@ on_job_state (CupsNotifier *object,
snprintf(resolution, sizeof(resolution), "%ddpi", xres);
else
snprintf(resolution, sizeof(resolution), "%dx%ddpi", xres, yres);
+ free_resolution(res, NULL);
}
}
}
+ free_resolution(max_res, NULL);
+ free_resolution(min_res, NULL);
+
request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
"localhost", 0, "/printers/%s", printer);