diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16c03f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cups-filters-1.20.0.tar.xz diff --git a/0001-cups-browsed-Always-save-.-default-option-entries-fr.patch b/0001-cups-browsed-Always-save-.-default-option-entries-fr.patch new file mode 100644 index 0000000..1b871e6 --- /dev/null +++ b/0001-cups-browsed-Always-save-.-default-option-entries-fr.patch @@ -0,0 +1,28 @@ +From 144322be6e06ff12f101fc35e472d62978861e28 Mon Sep 17 00:00:00 2001 +From: Till Kamppeter +Date: Thu, 15 Apr 2021 14:26:44 +0200 +Subject: [PATCH] cups-browsed: Always save "...-default" option entries from + printers.conf + +(cherry picked from commit cdd61132e1719a88dd8006c65e8e260c1aaa02e4) +--- + utils/cups-browsed.c | 4 +--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index bffd1e09..0c335055 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -5648,9 +5648,7 @@ record_printer_options(const char *printer) { + strcasecmp(key + strlen(key) - strlen(*ptr) + 1, *ptr + 1) == 0)) + break; + if (*ptr != NULL) { +- if (strcasecmp(key, CUPS_BROWSED_DEST_PRINTER "-default") != 0 && +- (ppdname == NULL || +- strncasecmp(key + strlen(key) - 8, "-default", 8))) { ++ if (strcasecmp(key, CUPS_BROWSED_DEST_PRINTER "-default") != 0) { + ippAttributeString(attr, buf, sizeof(buf)); + buf[sizeof(buf) - 1] = '\0'; + c = buf; +-- +2.30.2 diff --git a/0001-foomatic-rip-Changed-Ghostscript-call-to-count-pages.patch b/0001-foomatic-rip-Changed-Ghostscript-call-to-count-pages.patch new file mode 100644 index 0000000..69adc6f --- /dev/null +++ b/0001-foomatic-rip-Changed-Ghostscript-call-to-count-pages.patch @@ -0,0 +1,22 @@ +From 297cc2decc53e0b08eb03049fce375db33df2131 Mon Sep 17 00:00:00 2001 +From: Till Kamppeter +Date: Sun, 7 Apr 2019 16:34:16 +0200 +Subject: [PATCH] foomatic-rip: Changed Ghostscript call to count pages in a + PDF file so that it works with GS 9.27. + +diff --git a/filter/foomatic-rip/pdf.c b/filter/foomatic-rip/pdf.c +index 9c3979bb..bc739bd8 100644 +--- a/filter/foomatic-rip/pdf.c ++++ b/filter/foomatic-rip/pdf.c +@@ -47,9 +47,8 @@ static int pdf_count_pages(const char *filename) + size_t bytes; + + snprintf(gscommand, CMDLINE_MAX, "%s -dNODISPLAY -q -c " +- "'/pdffile (%s) (r) file def pdfdict begin pdffile pdfopen begin " +- "(PageCount: ) print pdfpagecount == flush currentdict pdfclose " +- "end end quit'", ++ "'/pdffile (%s) (r) file runpdfbegin (PageCount: ) print " ++ "pdfpagecount = quit'", + gspath, filename); + + FILE *pd = popen(gscommand, "r"); diff --git a/0001-gstoraster-Use-.setfilladjust2-PostScript-command-fo.patch b/0001-gstoraster-Use-.setfilladjust2-PostScript-command-fo.patch new file mode 100644 index 0000000..aeaef68 --- /dev/null +++ b/0001-gstoraster-Use-.setfilladjust2-PostScript-command-fo.patch @@ -0,0 +1,27 @@ +From e7103a7aaa43ab613701cbf094e0aa91e6526112 Mon Sep 17 00:00:00 2001 +From: Till Kamppeter +Date: Tue, 8 Oct 2019 23:38:54 +0200 +Subject: [PATCH] gstoraster: Use ".setfilladjust2" PostScript command for + Center-of-Pixel method to fill paths. + +--- + NEWS | 6 ++++++ + filter/gstoraster.c | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/filter/gstoraster.c b/filter/gstoraster.c +index 4aec0799..59f39927 100644 +--- a/filter/gstoraster.c ++++ b/filter/gstoraster.c +@@ -895,7 +895,7 @@ main (int argc, char **argv, char *envp[]) + (t && (!strcasecmp(t, "true") || !strcasecmp(t, "on") || + !strcasecmp(t, "yes")))) { + fprintf(stderr, "DEBUG: Ghostscript using Center-of-Pixel method to fill paths.\n"); +- cupsArrayAdd(gs_args, strdup("0 .setfilladjust")); ++ cupsArrayAdd(gs_args, strdup("0 0 .setfilladjust2")); + } else + fprintf(stderr, "DEBUG: Ghostscript using Any-Part-of-Pixel method to fill paths.\n"); + +-- +2.26.2 + diff --git a/0001-libcupsfilters-Fix-page-range-like-10-in-pdftopdf-fi.patch b/0001-libcupsfilters-Fix-page-range-like-10-in-pdftopdf-fi.patch new file mode 100644 index 0000000..1baab50 --- /dev/null +++ b/0001-libcupsfilters-Fix-page-range-like-10-in-pdftopdf-fi.patch @@ -0,0 +1,26 @@ +From 022c34fedb66f706b2ab82d7506d5b5b1fa18e1f Mon Sep 17 00:00:00 2001 +From: Bryan Mason +Date: Fri, 16 Jul 2021 11:19:42 -0700 +Subject: [PATCH] libcupsfilter: Fix page range like "10-" in pdftopdf() + filter function + +--- + filter/pdftopdf/pdftopdf.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/filter/pdftopdf/pdftopdf.cc b/filter/pdftopdf/pdftopdf.cc +index 5725e199..979644f1 100644 +--- a/filter/pdftopdf/pdftopdf.cc ++++ b/filter/pdftopdf/pdftopdf.cc +@@ -256,7 +256,7 @@ static void parseRanges(const char *range,IntervalSet &ret) // {{{ + } else { + upper=strtol(range,(char **)&range,10); + if (upper>=2147483647) { +- ret.add(1); ++ ret.add(lower); + } else { + ret.add(lower,upper+1); + } +-- +2.31.1 + diff --git a/EMPTY b/EMPTY deleted file mode 100644 index 0519ecb..0000000 --- a/EMPTY +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/cups-browsed-error-messages.patch b/cups-browsed-error-messages.patch new file mode 100644 index 0000000..5962912 --- /dev/null +++ b/cups-browsed-error-messages.patch @@ -0,0 +1,63 @@ +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index 80bde46..54ae2ac 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -439,6 +439,19 @@ static remote_printer_t + #define HAVE_CUPS_1_6 1 + #endif + ++/* ++ * Option 'printer-is-shared' cannot be set on remote CUPS ++ * queue and requests for setting it ends with error since ++ * 2.1.1. Define HAVE_CUPS_2_2 to do not send IPP request ++ * for setting 'printer-is-shared' option on remote CUPS queues ++ * for newer versions of CUPS. ++ */ ++#if (CUPS_VERSION_MAJOR > 2) || (CUPS_VERSION_MINOR > 1) ++#define HAVE_CUPS_2_2 1 ++#else ++#define HAVE_CUPS_2_2 0 ++#endif ++ + /* + * CUPS 1.6 makes various structures private and + * introduces these ippGet and ippSet functions +@@ -4394,7 +4407,20 @@ gboolean update_cups_queues(gpointer unused) { + num_options, &options); + cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION); + cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER); +- ippDelete(cupsDoRequest(http, request, "/admin/")); ++ /* ++ * Do IPP request for printer-is-shared option only when we have ++ * network printer or if we have remote CUPS queue, do IPP request ++ * only if we have CUPS older than 2.2. ++ * When you have remote queue, clean up and break from the loop. ++ */ ++ if (p->netprinter != 0 || !HAVE_CUPS_2_2) ++ ippDelete(cupsDoRequest(http, request, "/admin/")); ++ else ++ { ++ ippDelete(request); ++ cupsFreeOptions(num_options, options); ++ break; ++ } + cupsFreeOptions(num_options, options); + if (cupsLastError() > IPP_STATUS_OK_EVENTS_COMPLETE) { + debug_printf("Unable change printer-is-shared bit to %s (%s)!\n", +@@ -4803,7 +4829,15 @@ gboolean update_cups_queues(gpointer unused) { + } + cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION); + cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER); +- ippDelete(cupsDoRequest(http, request, "/admin/")); ++ /* ++ * Do IPP request for printer-is-shared option only when we have ++ * network printer or if we have remote CUPS queue, do IPP request ++ * only if we have CUPS older than 2.2. ++ */ ++ if (p->netprinter != 0 || !HAVE_CUPS_2_2) ++ ippDelete(cupsDoRequest(http, request, "/admin/")); ++ else ++ ippDelete(request); + cupsFreeOptions(num_options, options); + if (cupsLastError() > IPP_STATUS_OK_EVENTS_COMPLETE) + debug_printf("Unable to set printer-is-shared bit to false (%s)!\n", diff --git a/cups-browsed-memory-leaks.patch b/cups-browsed-memory-leaks.patch new file mode 100644 index 0000000..23c2305 --- /dev/null +++ b/cups-browsed-memory-leaks.patch @@ -0,0 +1,219 @@ +diff --git a/cupsfilters/ppdgenerator.c b/cupsfilters/ppdgenerator.c +index 3bc4d8a..44d9313 100644 +--- a/cupsfilters/ppdgenerator.c ++++ b/cupsfilters/ppdgenerator.c +@@ -752,12 +752,17 @@ load_opt_strings_catalog(const char *location, cups_array_t *options) + 2: "..." = "..." + 10: EOF, save last entry */ + int digit; ++ int found_in_catalog = 0; + + if (location == NULL || (strncasecmp(location, "http:", 5) && + strncasecmp(location, "https:", 6))) { + if (location == NULL || + (stat(location, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))) /* directory? */ ++ { + filename = _findCUPSMessageCatalog(location); ++ if (filename) ++ found_in_catalog = 1; ++ } + else + filename = location; + } else { +@@ -943,6 +948,8 @@ load_opt_strings_catalog(const char *location, cups_array_t *options) + free(opt_name); + if (filename == tmpfile) + unlink(filename); ++ if (found_in_catalog) ++ free(filename); + } + + +@@ -1417,10 +1424,16 @@ ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ + } else { + if ((current_res = resolutionArrayNew()) != NULL) { + if ((current_def = resolutionNew(lowdpi, lowdpi)) != NULL) ++ { + cupsArrayAdd(current_res, current_def); ++ free_resolution(current_def, NULL); ++ } + if (hidpi != lowdpi && + (current_def = resolutionNew(hidpi, hidpi)) != NULL) ++ { + cupsArrayAdd(current_res, current_def); ++ free_resolution(current_def, NULL); ++ } + current_def = NULL; + if (cupsArrayCount(current_res) > 0 && + joinResolutionArrays(&common_res, ¤t_res, &common_def, +@@ -1506,7 +1519,10 @@ ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ + if (common_res == NULL) { + if ((common_res = resolutionArrayNew()) != NULL) { + if ((current_def = resolutionNew(300, 300)) != NULL) ++ { + cupsArrayAdd(common_res, current_def); ++ free_resolution(current_def, NULL); ++ } + current_def = NULL; + } else + goto bad_ppd; +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index 54ae2ac..507977c 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -2555,7 +2555,7 @@ record_printer_options(const char *printer) { + const char *key; + char buf[65536], *c; + const char *ppdname = NULL; +- ppd_file_t *ppd; ++ ppd_file_t *ppd = NULL; + ppd_option_t *ppd_opt; + cups_option_t *option; + int i; +@@ -2825,7 +2825,8 @@ on_printer_state_changed (CupsNotifier *object, + char *ptr, buf[1024]; + remote_printer_t *p, *q; + http_t *http = NULL; +- ipp_t *request, *response; ++ ipp_t *request = NULL; ++ ipp_t *response = NULL; + ipp_attribute_t *attr; + const char *pname = NULL; + char *remote_cups_queue; +@@ -3107,6 +3108,10 @@ on_printer_state_changed (CupsNotifier *object, + break; + } + } ++ if (response) { ++ ippDelete(response); ++ response = NULL; ++ } + if (pstate == IPP_PRINTER_IDLE && paccept) { + q->last_printer = i; + break; +@@ -3863,7 +3868,7 @@ create_remote_printer_entry (const char *queue_name, + debug_printf("Default page size: %s\n", + default_page_size); + p->num_options = cupsAddOption("media-default", +- strdup(default_page_size), ++ default_page_size, + p->num_options, &(p->options)); + } else { + attr = ippFindAttribute(response, +@@ -3874,7 +3879,7 @@ create_remote_printer_entry (const char *queue_name, + debug_printf("Default page size: %s\n", + default_page_size); + p->num_options = cupsAddOption("media-default", +- strdup(default_page_size), ++ default_page_size, + p->num_options, &(p->options)); + } else + debug_printf("No default page size found!\n"); +@@ -3889,7 +3894,7 @@ create_remote_printer_entry (const char *queue_name, + bottom = 1270; + snprintf(buffer, sizeof(buffer), "%d", bottom); + p->num_options = cupsAddOption("media-bottom-margin-default", +- strdup(buffer), ++ buffer, + p->num_options, &(p->options)); + + if ((attr = ippFindAttribute(response, "media-left-margin-supported", IPP_TAG_INTEGER)) != NULL) { +@@ -3900,7 +3905,7 @@ create_remote_printer_entry (const char *queue_name, + left = 635; + snprintf(buffer, sizeof(buffer), "%d", left); + p->num_options = cupsAddOption("media-left-margin-default", +- strdup(buffer), ++ buffer, + p->num_options, &(p->options)); + + if ((attr = ippFindAttribute(response, "media-right-margin-supported", IPP_TAG_INTEGER)) != NULL) { +@@ -3911,7 +3916,7 @@ create_remote_printer_entry (const char *queue_name, + right = 635; + snprintf(buffer, sizeof(buffer), "%d", right); + p->num_options = cupsAddOption("media-right-margin-default", +- strdup(buffer), ++ buffer, + p->num_options, &(p->options)); + + if ((attr = ippFindAttribute(response, "media-top-margin-supported", IPP_TAG_INTEGER)) != NULL) { +@@ -3922,7 +3927,7 @@ create_remote_printer_entry (const char *queue_name, + top = 1270; + snprintf(buffer, sizeof(buffer), "%d", top); + p->num_options = cupsAddOption("media-top-margin-default", +- strdup(buffer), ++ buffer, + p->num_options, &(p->options)); + + debug_printf("Margins: Left: %d, Right: %d, Top: %d, Bottom: %d\n", +@@ -3943,7 +3948,7 @@ create_remote_printer_entry (const char *queue_name, + debug_printf("Best color space: %s\n", + best_color_space); + p->num_options = cupsAddOption("print-color-mode-default", +- strdup(best_color_space), ++ best_color_space, + p->num_options, &(p->options)); + } else { + debug_printf("No info about supported color spaces found!\n"); +@@ -3956,7 +3961,7 @@ create_remote_printer_entry (const char *queue_name, + p->num_options = cupsAddOption("sides-default", "two-sided-long-edge", + p->num_options, &(p->options)); + +- p->num_options = cupsAddOption("output-format-default", strdup(pdl), ++ p->num_options = cupsAddOption("output-format-default", pdl, + p->num_options, &(p->options)); + p->num_options = cupsAddOption("make-and-model-default", + remove_bad_chars(make_model, 0), +@@ -4119,7 +4124,7 @@ gboolean update_cups_queues(gpointer unused) { + char *disabled_str, *ptr, *prefix; + const char *loadedppd = NULL; + int pass_through_ppd; +- ppd_file_t *ppd; ++ ppd_file_t *ppd = NULL; + ppd_choice_t *choice; + cups_file_t *in, *out; + char keyword[1024], *keyptr; +@@ -4588,6 +4593,7 @@ gboolean update_cups_queues(gpointer unused) { + p->timeout = current_time + TIMEOUT_RETRY; + p->no_autosave = 0; + ppdClose(ppd); ++ ppd = NULL; + unlink(loadedppd); + break; + } +@@ -4597,6 +4603,7 @@ gboolean update_cups_queues(gpointer unused) { + p->no_autosave = 0; + cupsFileClose(out); + ppdClose(ppd); ++ ppd = NULL; + unlink(loadedppd); + break; + } +@@ -4710,6 +4717,7 @@ gboolean update_cups_queues(gpointer unused) { + cupsFileClose(in); + cupsFileClose(out); + ppdClose(ppd); ++ ppd = NULL; + unlink(loadedppd); + loadedppd = NULL; + if (p->ppd) +@@ -4748,8 +4756,8 @@ gboolean update_cups_queues(gpointer unused) { + /* Default option settings from printer entry */ + for (i = 0; i < p->num_options; i ++) + if (strcasecmp(p->options[i].name, "printer-is-shared")) +- num_options = cupsAddOption(strdup(p->options[i].name), +- strdup(p->options[i].value), ++ num_options = cupsAddOption(p->options[i].name, ++ p->options[i].value, + num_options, &options); + /* Encode option list into IPP attributes */ + cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION); +@@ -8342,6 +8350,9 @@ fail: + + if (local_printers_context) { + browse_poll_cancel_subscription (local_printers_context); ++#ifdef HAVE_CUPS_2_0 ++ free(local_printers_context->server); ++#endif + g_list_free_full (local_printers_context->printers, + browsepoll_printer_free); + free (local_printers_context); diff --git a/cups-browsed-renew.patch b/cups-browsed-renew.patch new file mode 100644 index 0000000..4157bb2 --- /dev/null +++ b/cups-browsed-renew.patch @@ -0,0 +1,13 @@ +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index 078348a..2b30c63 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -8268,7 +8268,7 @@ int main(int argc, char*argv[]) { + /* Subscribe to CUPS' D-Bus notifications and create a proxy to receive + the notifications */ + subscription_id = create_subscription (); +- g_timeout_add_seconds (NOTIFY_LEASE_DURATION - 60, ++ g_timeout_add_seconds (NOTIFY_LEASE_DURATION / 2, + renew_subscription_timeout, + &subscription_id); + cups_notifier = cups_notifier_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, diff --git a/cups-browsed-socket-leak.patch b/cups-browsed-socket-leak.patch new file mode 100644 index 0000000..cf18dfa --- /dev/null +++ b/cups-browsed-socket-leak.patch @@ -0,0 +1,18 @@ +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index c6c257e..2cc64dd 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -2747,6 +2747,13 @@ on_printer_state_changed (CupsNotifier *object, + if (i == q->last_printer) + break; + } ++ ++ /* Close remote connection */ ++ if (http) { ++ httpClose(http); ++ http = NULL; ++ } ++ + /* Find the ID of the current job */ + request = ippNewRequest(IPP_GET_JOBS); + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, diff --git a/cups-browsed.8.patch b/cups-browsed.8.patch new file mode 100644 index 0000000..583c758 --- /dev/null +++ b/cups-browsed.8.patch @@ -0,0 +1,14 @@ +diff -up cups-filters-1.20.0/utils/cups-browsed.8.manpage cups-filters-1.20.0/utils/cups-browsed.8 +--- cups-filters-1.20.0/utils/cups-browsed.8.manpage 2018-11-12 14:14:48.436062013 +0100 ++++ cups-filters-1.20.0/utils/cups-browsed.8 2018-11-12 14:19:10.188091043 +0100 +@@ -100,8 +100,8 @@ and command line tools. + + \fBcups-browsed.conf\fP(5) + .PP +-/usr/share/doc/\fBcups-browsed\fP/README.gz ++/usr/share/doc/cups-filters/README.gz + .SH AUTHOR +-The authors of \fBcups-browsed\fP are listed in /usr/share/doc/\fBcups-browsed\fP/AUTHORS. ++The authors of \fBcups-browsed\fP are listed in /usr/share/doc/cups-filters/AUTHORS. + .PP + This manual page was written for the Debian Project, but it may be used by others. diff --git a/cups-filters-brftopagedbrf-install.patch b/cups-filters-brftopagedbrf-install.patch new file mode 100644 index 0000000..ba6aceb --- /dev/null +++ b/cups-filters-brftopagedbrf-install.patch @@ -0,0 +1,172 @@ +diff -up cups-filters-1.20.0/configure.ac.brftopagedbrf-install cups-filters-1.20.0/configure.ac +--- cups-filters-1.20.0/configure.ac.brftopagedbrf-install 2018-01-29 19:14:59.000000000 +0100 ++++ cups-filters-1.20.0/configure.ac 2018-04-27 11:19:33.987213243 +0200 +@@ -856,6 +856,7 @@ AC_CONFIG_FILES([ + filter/braille/filters/cups-braille.sh + filter/braille/filters/imagetobrf + filter/braille/filters/texttobrf ++ filter/braille/filters/brftopagedbrf + filter/braille/filters/vectortopdf + filter/braille/filters/vectortobrf + filter/braille/filters/musicxmltobrf +diff -up cups-filters-1.20.0/filter/braille/filters/brftopagedbrf.in.brftopagedbrf-install cups-filters-1.20.0/filter/braille/filters/brftopagedbrf.in +--- cups-filters-1.20.0/filter/braille/filters/brftopagedbrf.in.brftopagedbrf-install 2018-04-27 11:19:41.038152279 +0200 ++++ cups-filters-1.20.0/filter/braille/filters/brftopagedbrf.in 2018-04-27 11:21:47.344068714 +0200 +@@ -0,0 +1,146 @@ ++#!/bin/bash ++ ++# ++# Copyright (c) 2015-2017 Samuel Thibault ++# ++# Permission is hereby granted, free of charge, to any person obtaining a copy ++# of this software and associated documentation files (the "Software"), to deal ++# in the Software without restriction, including without limitation the rights ++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++# copies of the Software, and to permit persons to whom the Software is ++# furnished to do so, subject to the following conditions: ++# ++# ++# The above copyright notice and this permission notice shall be included in ++# all copies or substantial portions of the Software. ++# ++# ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++# THE SOFTWARE. ++# ++ ++# Make sure we have enough options ++if [ $# != 5 -a $# != 6 ]; then ++ echo "ERROR: $0 jobid user name nb options [filename]" >&2 ++ exit 1 ++fi ++ ++NB=$4 ++OPTIONS=$5 ++FILE=$6 ++ ++. @CUPS_DATADIR@/braille/cups-braille.sh ++ ++shopt -s extglob ++ ++# Construct list of pages from PAGERANGES ++ ++PAGES=" " # Explicit list of pages ++AFTER= # All pages including and after this ++BEFORE= # All pages before and including this ++ ++[ -n "$PAGERANGES" ] || PAGERANGES="1-" ++ ++while [ -n "${PAGERANGES}" ] ++do ++ PAGERANGE=${PAGERANGES/,*} ++ PAGERANGE=${PAGERANGE%%*( )} ++ PAGERANGE=${PAGERANGE##*( )} ++ if [ -n "${PAGERANGES/*,*}" ] ++ then ++ # last range ++ PAGERANGES="" ++ else ++ # Remove leading range ++ PAGERANGES="${PAGERANGES#*,}" ++ fi ++ ++ if [ -n "${PAGERANGE/*-*}" ] ++ then ++ # single-page ++ PAGES="$PAGES$PAGERANGE " ++ ++ elif [ -z "${PAGERANGE%%*-}" ] ++ then ++ # To the end ++ FIRST=${PAGERANGE%%-*} ++ if [ -z "$AFTER" ] || [ "$FIRST" -lt "$AFTER" ] ++ then ++ AFTER="$FIRST" ++ fi ++ ++ elif [ -z "${PAGERANGE##-*}" ] ++ then ++ # From the beginning ++ LAST=${PAGERANGE##*-} ++ if [ -z "$BEFORE" ] || [ "$LAST" -gt "$BEFORE" ] ++ then ++ BEFORE="$LAST" ++ fi ++ ++ else ++ # page range ++ FIRST=${PAGERANGE/-*} ++ LAST=${PAGERANGE/*-} ++ PAGES="$PAGES$(seq "$FIRST" "$LAST" | tr $'\012' ' ')" ++ ++ fi ++done ++ ++# Determine whether to print this page ++doprint() { ++ PAGE="$1" ++ if [ -n "$BEFORE" ] && [ "$PAGE" -le "$BEFORE" ] ++ then ++ echo 1 ++ return ++ elif [ -n "$AFTER" ] && [ "$PAGE" -ge "$AFTER" ] ++ then ++ echo 1 ++ return ++ fi ++ case "$PAGES" in ++ *\ $PAGE\ *) ++ echo 1 ++ return ++ ;; ++ esac ++ echo 0 ++} ++ ++if [ -z "$FILE" ] ++then ++ cat ++else ++ cat "$FILE" ++fi | ( ++ P=1 ++ DOPRINT=$(doprint $P) ++ while IFS=$'\n' read -r LINE ++ do ++ while [ -z "${LINE/*$'\014'*}" ] ++ do ++ # Possibly print before FF ++ HEAD=${LINE%%$'\014'*} ++ [ $DOPRINT == 0 ] || printf %s "$HEAD"$'\014' ++ ++ # Next page ++ P=$(($P + 1)) ++ DOPRINT=$(doprint $P) ++ ++ # Drop head of line ++ LINE=${LINE#*$'\014'} ++ done ++ ++ # Remainder of line ++ [ $DOPRINT == 0 ] || printf "%s\n" "$LINE" ++ done ++) ++ ++echo "INFO: Ready" >&2 ++exit 0 +diff -up cups-filters-1.20.0/Makefile.am.brftopagedbrf-install cups-filters-1.20.0/Makefile.am +--- cups-filters-1.20.0/Makefile.am.brftopagedbrf-install 2017-12-15 02:15:32.000000000 +0100 ++++ cups-filters-1.20.0/Makefile.am 2018-04-27 11:19:33.987213243 +0200 +@@ -591,6 +591,7 @@ nodist_pkgfilter_SCRIPTS = \ + filter/braille/filters/vectortopdf \ + filter/braille/filters/vectortobrf \ + filter/braille/filters/texttobrf \ ++ filter/braille/filters/brftopagedbrf \ + filter/braille/filters/musicxmltobrf + endif + diff --git a/cups-filters-cleareof.patch b/cups-filters-cleareof.patch new file mode 100644 index 0000000..8b9731f --- /dev/null +++ b/cups-filters-cleareof.patch @@ -0,0 +1,11 @@ +diff -up cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c.cleareof cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c +--- cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c.cleareof 2018-09-21 13:38:05.882666106 +0200 ++++ cups-filters-1.20.3/filter/foomatic-rip/foomaticrip.c 2018-09-21 13:38:55.330277816 +0200 +@@ -663,6 +663,7 @@ int print_file(const char *filename, int + rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, + "Couldn't dup stdout of pdf-to-ps\n"); + ++ clearerr(stdin); + ret = print_file("", 0); + + wait_for_process(renderer_pid); diff --git a/cups-filters-covscan.patch b/cups-filters-covscan.patch new file mode 100644 index 0000000..9a225c3 --- /dev/null +++ b/cups-filters-covscan.patch @@ -0,0 +1,678 @@ +diff --git a/backend/beh.c b/backend/beh.c +index 9ba6613..7514e33 100644 +--- a/backend/beh.c ++++ b/backend/beh.c +@@ -223,6 +223,8 @@ call_backend(char *uri, /* I - URI of final destination */ + */ + + strncpy(scheme, uri, sizeof(scheme)); ++ if (strlen(uri) > 1023) ++ scheme[1023] = '\0'; + if ((ptr = strchr(scheme, ':')) != NULL) + *ptr = '\0'; + +diff --git a/backend/implicitclass.c b/backend/implicitclass.c +index 3ce4d10..1593191 100644 +--- a/backend/implicitclass.c ++++ b/backend/implicitclass.c +@@ -104,6 +104,8 @@ main(int argc, /* I - Number of command-line args */ + } + ptr1 ++; + strncpy(queue_name, ptr1, sizeof(queue_name)); ++ if (strlen(ptr1) > 1023) ++ queue_name[1023] = '\0'; + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", ippPort(), "/printers/%s", queue_name); + job_id = argv[1]; +@@ -162,6 +164,8 @@ main(int argc, /* I - Number of command-line args */ + /* Read destination host name (or message) and check whether it is + complete (second double quote) */ + strncpy(dest_host, ptr1, sizeof(dest_host)); ++ if (strlen(ptr1) > 1023) ++ dest_host[1023] = '\0'; + ptr1 = dest_host; + if ((ptr2 = strchr(ptr1, '"')) != NULL) { + *ptr2 = '\0'; +diff --git a/cupsfilters/colormanager.c b/cupsfilters/colormanager.c +index 70074a3..a4a929d 100644 +--- a/cupsfilters/colormanager.c ++++ b/cupsfilters/colormanager.c +@@ -272,6 +272,9 @@ _get_colord_profile(const char *printer_name, /* Dest name */ + free(qualifier); + } + ++ if (icc_profile != NULL) ++ free(icc_profile); ++ + return is_profile_set; + + } +@@ -325,8 +328,11 @@ _get_ppd_icc_fallback (ppd_file_t *ppd, char **qualifier) + if (attr->value[0] != '/') + snprintf(full_path, sizeof(full_path), + "%s/profiles/%s", CUPSDATA, attr->value); +- else ++ else { + strncpy(full_path, attr->value, sizeof(full_path)); ++ if (strlen(attr->value) > 1023) ++ full_path[1023] = '\0'; ++ } + + /* check the file exists */ + if (access(full_path, 0)) { +diff --git a/cupsfilters/image-sgilib.c b/cupsfilters/image-sgilib.c +index 0b70c13..bf2dd80 100644 +--- a/cupsfilters/image-sgilib.c ++++ b/cupsfilters/image-sgilib.c +@@ -282,7 +282,7 @@ sgiOpenFile(FILE *file, /* I - File to open */ + sgip->mode = SGI_WRITE; + + putshort(SGI_MAGIC, sgip->file); +- putc((sgip->comp = comp) != 0, sgip->file); ++ putc(((sgip->comp = comp) != 0) ? '1': '0', sgip->file); + putc(sgip->bpp = bpp, sgip->file); + putshort(3, sgip->file); /* Dimensions */ + putshort(sgip->xsize = xsize, sgip->file); +diff --git a/cupsfilters/image-sun.c b/cupsfilters/image-sun.c +index 609b194..989d039 100644 +--- a/cupsfilters/image-sun.c ++++ b/cupsfilters/image-sun.c +@@ -114,6 +114,7 @@ _cupsImageReadSunRaster( + ras_depth == 0 || ras_depth > 32) + { + fputs("DEBUG: Raster image cannot be loaded!\n", stderr); ++ fclose(fp); + return (1); + } + +diff --git a/cupsfilters/ppdgenerator.c b/cupsfilters/ppdgenerator.c +index 052e3c5..3bc4d8a 100644 +--- a/cupsfilters/ppdgenerator.c ++++ b/cupsfilters/ppdgenerator.c +@@ -937,6 +937,10 @@ load_opt_strings_catalog(const char *location, cups_array_t *options) + } + } + cupsFileClose(fp); ++ if (choice_name != NULL) ++ free(choice_name); ++ if (opt_name != NULL) ++ free(opt_name); + if (filename == tmpfile) + unlink(filename); + } +diff --git a/cupsfilters/raster.c b/cupsfilters/raster.c +index 8203690..67d6b9b 100644 +--- a/cupsfilters/raster.c ++++ b/cupsfilters/raster.c +@@ -151,11 +151,14 @@ cupsRasterParseIPPOptions(cups_page_header2_t *h, /* I - Raster header */ + strcasestr(s, "right") || + strcasestr(s, "side") || + strcasestr(s, "main")) +- media_source = strdup(s); ++ { ++ if (media_source == NULL) ++ media_source = strdup(s); ++ } + else + media_type = strdup(s); + } +- if (size_found) ++ if (page_size == NULL && size_found) + page_size = strdup(size_found->pwg); + } + } +@@ -1079,6 +1082,13 @@ cupsRasterParseIPPOptions(cups_page_header2_t *h, /* I - Raster header */ + h->cupsRenderingIntent[0] = '\0'; + #endif /* HAVE_CUPS_1_7 */ + ++ if (media_source != NULL) ++ free(media_source); ++ if (media_type != NULL) ++ free(media_type); ++ if (page_size != NULL) ++ free(page_size); ++ + return (0); + } + +diff --git a/filter/bannertopdf.c b/filter/bannertopdf.c +index b78ea37..2b9bd76 100644 +--- a/filter/bannertopdf.c ++++ b/filter/bannertopdf.c +@@ -513,6 +513,15 @@ static int generate_banner_pdf(banner_t *banner, + pdf_duplicate_page(doc, 1, copies); + + pdf_write(doc, stdout); ++ ++ opt_t * opt_current = known_opts; ++ opt_t * opt_next = NULL; ++ while (opt_current != NULL) ++ { ++ opt_next = opt_current->next; ++ free(opt_current); ++ opt_current = opt_next; ++ } + free(buf); + pdf_free(doc); + return 0; +diff --git a/filter/foomatic-rip/foomaticrip.c b/filter/foomatic-rip/foomaticrip.c +index 2a642ed..13d2035 100644 +--- a/filter/foomatic-rip/foomaticrip.c ++++ b/filter/foomatic-rip/foomaticrip.c +@@ -666,6 +666,11 @@ int print_file(const char *filename, int convert) + ret = print_file("", 0); + + wait_for_process(renderer_pid); ++ if (in != NULL) ++ fclose(in); ++ if (out != NULL) ++ fclose(out); ++ + return ret; + } + +@@ -683,6 +688,8 @@ int print_file(const char *filename, int convert) + + case UNKNOWN_FILE: + _log("Cannot process \"%s\": Unknown filetype.\n", filename); ++ if (file != NULL) ++ fclose(file); + return 0; + } + +@@ -811,10 +818,14 @@ int main(int argc, char** argv) + + if (getenv("PPD")) { + strncpy(job->ppdfile, getenv("PPD"), 2048); ++ if (strlen(getenv("PPD")) > 2047) ++ job->ppdfile[2047] = '\0'; + spooler = SPOOLER_CUPS; +- if (getenv("CUPS_SERVERBIN")) +- strncpy(cupsfilterpath, getenv("CUPS_SERVERBIN"), +- sizeof(cupsfilterpath)); ++ if (getenv("CUPS_SERVERBIN")) { ++ strncpy(cupsfilterpath, getenv("CUPS_SERVERBIN"), sizeof(cupsfilterpath)); ++ if (strlen(getenv("CUPS_SERVERBIN")) > PATH_MAX-1) ++ cupsfilterpath[PATH_MAX-1] = '\0'; ++ } + } + + /* Check status of printer color management from the color manager */ +@@ -834,10 +845,14 @@ int main(int argc, char** argv) + allow duplicates, and use the last specified one */ + while ((str = arglist_get_value(arglist, "-p"))) { + strncpy(job->ppdfile, str, 2048); ++ if (strlen(str) > 2047) ++ job->ppdfile[2047] = '\0'; + arglist_remove(arglist, "-p"); + } + while ((str = arglist_get_value(arglist, "--ppd"))) { + strncpy(job->ppdfile, str, 2048); ++ if (strlen(str) > 2047) ++ job->ppdfile[2047] = '\0'; + arglist_remove(arglist, "--ppd"); + } + +@@ -1020,6 +1035,7 @@ int main(int argc, char** argv) + cmd[0] = '\0'; + + snprintf(gstoraster, sizeof(gstoraster), "gs -dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOINTERPOLATE -dNOMEDIAATTRS -sDEVICE=cups -dShowAcroForm %s -sOutputFile=- -", cmd); ++ free(icc_profile); + } + + /* build Ghostscript/CUPS driver command line */ +diff --git a/filter/foomatic-rip/options.c b/filter/foomatic-rip/options.c +index 325a0a6..798ddf9 100644 +--- a/filter/foomatic-rip/options.c ++++ b/filter/foomatic-rip/options.c +@@ -1031,12 +1031,10 @@ int option_set_value(option_t *opt, int optionset, const char *value) + /* TODO only set the changed option, not all of them */ + choice = option_find_choice(fromopt, + option_get_value(fromopt, optionset)); +- + composite_set_values(fromopt, optionset, choice->command); +- } +- else { ++ free(newvalue); ++ } else + val->value = newvalue; +- } + + if (option_is_composite(opt)) { + /* set dependent values */ +@@ -1914,6 +1912,8 @@ int ppd_supports_pdf() + if (startswith(cmd, "gs")) + { + strncpy(cmd_pdf, cmd, 4096); ++ if (strlen(cmd) > 4095) ++ cmd_pdf[4095] = '\0'; + return 1; + } + +diff --git a/filter/foomatic-rip/spooler.c b/filter/foomatic-rip/spooler.c +index 236551f..4f27563 100644 +--- a/filter/foomatic-rip/spooler.c ++++ b/filter/foomatic-rip/spooler.c +@@ -94,6 +94,8 @@ void init_cups(list_t *arglist, dstr_t *filelist, jobparams_t *job) + CUPS puts the print queue name into the PRINTER environment variable + when calling filters. */ + strncpy(job->printer, getenv("PRINTER"), 256); ++ if (strlen(getenv("PRINTER")) > 255) ++ job->printer[255] = '\0'; + + free(cups_options); + } +diff --git a/filter/pdftops.c b/filter/pdftops.c +index 55d2ec1..a648444 100644 +--- a/filter/pdftops.c ++++ b/filter/pdftops.c +@@ -427,6 +427,8 @@ main(int argc, /* I - Number of command-line args */ + if ((val = cupsGetOption("make-and-model", num_options, options)) != NULL) + { + strncpy(make_model, val, sizeof(make_model)); ++ if (strlen(val) > 127) ++ make_model[127] = '\0'; + for (ptr = make_model; *ptr; ptr ++) + if (*ptr == '-') *ptr = ' '; + } +diff --git a/filter/pdftoraster.cxx b/filter/pdftoraster.cxx +index 4cd656a..0c63ab8 100644 +--- a/filter/pdftoraster.cxx ++++ b/filter/pdftoraster.cxx +@@ -558,8 +558,10 @@ static void parseOpts(int argc, char **argv) + if (!cm_disabled) + cmGetPrinterIccProfile(getenv("PRINTER"), &profile, ppd); + +- if (profile != NULL) +- colorProfile = cmsOpenProfileFromFile(profile,"r"); ++ if (profile != NULL) { ++ colorProfile = cmsOpenProfileFromFile(profile,"r"); ++ free(profile); ++ } + + #ifdef HAVE_CUPS_1_7 + if ((attr = ppdFindAttr(ppd,"PWGRaster",0)) != 0 && +diff --git a/filter/rastertoescpx.c b/filter/rastertoescpx.c +index 5a3e5df..a0ec416 100644 +--- a/filter/rastertoescpx.c ++++ b/filter/rastertoescpx.c +@@ -1141,7 +1141,10 @@ EndPage(ppd_file_t *ppd, /* I - PPD file */ + } + } + else ++ { + free(DotBuffers[0]); ++ DotBuffers[0] = NULL; ++ } + + /* + * Output a page eject sequence... +@@ -1440,7 +1443,7 @@ CompressData(ppd_file_t *ppd, /* I - PPD file information */ + + printf("\033i"); + putchar(ctable[PrinterPlanes - 1][plane]); +- putchar(type != 0); ++ putchar((type != 0) ? '1': '0'); + putchar(BitPlanes); + putchar(bytes & 255); + putchar(bytes >> 8); +@@ -1470,7 +1473,7 @@ CompressData(ppd_file_t *ppd, /* I - PPD file information */ + bytes *= 8; + + printf("\033."); +- putchar(type != 0); ++ putchar((type != 0) ? '1': '0'); + putchar(ystep); + putchar(xstep); + putchar(rows); +@@ -1907,6 +1910,10 @@ main(int argc, /* I - Number of command-line arguments */ + if (fd != 0) + close(fd); + ++ for (int i = 0; i < 7; i++) ++ if (DotBuffers[i] != NULL) ++ free(DotBuffers[i]); ++ + return (page == 0); + } + +diff --git a/filter/rastertops.c b/filter/rastertops.c +index d5d955b..531eb70 100644 +--- a/filter/rastertops.c ++++ b/filter/rastertops.c +@@ -282,6 +282,8 @@ write_flate(cups_raster_t *ras, /* I - Image data */ + if (fwrite(out, 1, have, stdout) != have) + { + (void)deflateEnd(&strm); ++ if (convertedpix != NULL) ++ free(convertedpix); + return Z_ERRNO; + } + } while (strm.avail_out == 0); +diff --git a/filter/sys5ippprinter.c b/filter/sys5ippprinter.c +index ad75551..9a92c8e 100644 +--- a/filter/sys5ippprinter.c ++++ b/filter/sys5ippprinter.c +@@ -570,6 +570,8 @@ exec_filter(const char *filter, /* I - Filter to execute */ + dup2(fd, 2); + close(fd); + } ++ else ++ close(fd); + fcntl(2, F_SETFL, O_NDELAY); + } + +@@ -578,6 +580,8 @@ exec_filter(const char *filter, /* I - Filter to execute */ + dup2(fd, 3); + close(fd); + } ++ else ++ close(fd); + fcntl(3, F_SETFL, O_NDELAY); + + if ((fd = open("/dev/null", O_RDWR)) > 4) +@@ -585,6 +589,8 @@ exec_filter(const char *filter, /* I - Filter to execute */ + dup2(fd, 4); + close(fd); + } ++ else ++ close(fd); + fcntl(4, F_SETFL, O_NDELAY); + + /* +@@ -654,8 +660,11 @@ exec_filters(cups_array_t *filters, /* I - Array of filters to run */ + { + next = (char *)cupsArrayNext(filters); + +- if (filter[0] == '/') ++ if (filter[0] == '/') { + strncpy(program, filter, sizeof(program)); ++ if (strlen(filter) > 1023) ++ program[1023] = '\0'; ++ } + else + { + if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) +diff --git a/utils/cups-browsed.c b/utils/cups-browsed.c +index a2a4a08..19a2ac8 100644 +--- a/utils/cups-browsed.c ++++ b/utils/cups-browsed.c +@@ -2245,7 +2245,10 @@ is_disabled(const char *printer, const char *reason) { + pstate = (ipp_pstate_t)ippGetInteger(attr, 0); + else if (!strcmp(ippGetName(attr), "printer-state-message") && + ippGetValueTag(attr) == IPP_TAG_TEXT) { +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + p = ippGetString(attr, 0, NULL); + if (p != NULL) pstatemsg = strdup(p); + } +@@ -2262,16 +2265,22 @@ is_disabled(const char *printer, const char *reason) { + case IPP_PRINTER_IDLE: + case IPP_PRINTER_PROCESSING: + ippDelete(response); +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + case IPP_PRINTER_STOPPED: + ippDelete(response); + if (reason == NULL) + return pstatemsg; +- else if (strcasestr(pstatemsg, reason) != NULL) ++ else if (pstatemsg != NULL && (strcasestr(pstatemsg, reason) != NULL)) + return pstatemsg; + else { +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + } + } +@@ -2280,12 +2289,18 @@ is_disabled(const char *printer, const char *reason) { + debug_printf("No information regarding enabled/disabled found about the requested printer '%s'\n", + printer); + ippDelete(response); +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + } + debug_printf("ERROR: Request for printer info failed: %s\n", + cupsLastErrorString()); +- free(pstatemsg); ++ if (pstatemsg != NULL) { ++ free(pstatemsg); ++ pstatemsg = NULL; ++ } + return NULL; + } + +@@ -3040,6 +3055,8 @@ on_printer_state_changed (CupsNotifier *object, + dest_host = p->ip ? p->ip : p->host; + dest_port = p->port; + strncpy(dest_name, remote_cups_queue, sizeof(dest_name)); ++ if (strlen(remote_cups_queue) > 1023) ++ dest_name[1023] = '\0'; + dest_index = i; + debug_printf("Printer %s on host %s, port %d is idle, take this as destination and stop searching.\n", + remote_cups_queue, p->host, p->port); +@@ -3056,8 +3073,9 @@ on_printer_state_changed (CupsNotifier *object, + min_jobs = num_jobs; + dest_host = p->ip ? p->ip : p->host; + dest_port = p->port; +- strncpy(dest_name, remote_cups_queue, +- sizeof(dest_name)); ++ strncpy(dest_name, remote_cups_queue, sizeof(dest_name)); ++ if (strlen(remote_cups_queue) > 1023) ++ dest_name[1023] = '\0'; + dest_index = i; + } + debug_printf("Printer %s on host %s, port %d is printing and it has %d jobs.\n", +@@ -3566,8 +3584,9 @@ create_remote_printer_entry (const char *queue_name, + IPP_TAG_KEYWORD)) != NULL) { + debug_printf(" Attr: %s\n", ippGetName(attr)); + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] > '1') + break; +@@ -3598,8 +3617,9 @@ create_remote_printer_entry (const char *queue_name, + debug_printf(" Value: %s\n", valuebuffer); + if (valuebuffer[0] == '\0') { + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] != '\0') + break; +@@ -3629,8 +3649,9 @@ create_remote_printer_entry (const char *queue_name, + debug_printf(" Value: %s\n", valuebuffer); + if (valuebuffer[0] == '\0') { + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] != '\0') + break; +@@ -3663,8 +3684,9 @@ create_remote_printer_entry (const char *queue_name, + debug_printf(" Value: %s\n", p->queue_name, valuebuffer); + if (valuebuffer[0] == '\0') { + for (i = 0; i < ippGetCount(attr); i ++) { +- strncpy(valuebuffer, ippGetString(attr, i, NULL), +- sizeof(valuebuffer)); ++ strncpy(valuebuffer, ippGetString(attr, i, NULL), sizeof(valuebuffer)); ++ if (strlen(ippGetString(attr, i, NULL)) > 65535) ++ valuebuffer[65535] = '\0'; + debug_printf(" Keyword: %s\n", valuebuffer); + if (valuebuffer[0] != '\0') + break; +@@ -4498,6 +4520,8 @@ gboolean update_cups_queues(gpointer unused) { + } else { + /* Device URI: ipp(s)://:631/printers/ */ + strncpy(device_uri, p->uri, sizeof(device_uri)); ++ if (strlen(p->uri) > HTTP_MAX_URI-1) ++ device_uri[HTTP_MAX_URI-1] = '\0'; + debug_printf("Print queue %s is for an IPP network printer, or we do not get notifications from CUPS, using direct device URI %s\n", + p->queue_name, device_uri); + } +@@ -4606,6 +4630,8 @@ gboolean update_cups_queues(gpointer unused) { + } else if (!strncmp(line, "*Default", 8)) { + cont_line_read = 0; + strncpy(keyword, line + 8, sizeof(keyword)); ++ if ((strlen(line) + 8) > 1023) ++ keyword[1023] = '\0'; + for (keyptr = keyword; *keyptr; keyptr ++) + if (*keyptr == ':' || isspace(*keyptr & 255)) + break; +@@ -7144,7 +7170,7 @@ read_configuration (const char *filename) + in the configuration file is used. */ + while ((i < cupsArrayCount(command_line_config) && + (value = cupsArrayIndex(command_line_config, i++)) && +- strncpy(line, value, sizeof(line))) || ++ strncpy(line, value, sizeof(line)) && ((strlen(value) > HTTP_MAX_BUFFER-1)? line[HTTP_MAX_BUFFER-1] = '\0': 1)) || + cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { + if (linenum < 0) { + /* We are still reading options from the command line ("-o ..."), +@@ -7371,6 +7397,7 @@ read_configuration (const char *filename) + if (filter->cregexp) + regfree(filter->cregexp); + free(filter); ++ filter = NULL; + } + } else if ((!strcasecmp(line, "BrowseInterval") || !strcasecmp(line, "BrowseTimeout")) && value) { + int t = atoi(value); +@@ -7386,8 +7413,11 @@ read_configuration (const char *filename) + debug_printf("Invalid %s value: %d\n", + line, t); + } else if (!strcasecmp(line, "DomainSocket") && value) { +- if (value[0] != '\0') ++ if (value[0] != '\0') { ++ if (DomainSocket != NULL) ++ free(DomainSocket); + DomainSocket = strdup(value); ++ } + } else if ((!strcasecmp(line, "HttpLocalTimeout") || !strcasecmp(line, "HttpRemoteTimeout")) && value) { + int t = atoi(value); + if (t >= 0) { +@@ -7555,6 +7585,10 @@ read_configuration (const char *filename) + } + } + cupsArrayAdd (clusters, cluster); ++ if (start != NULL) { ++ free(start); ++ start = NULL; ++ } + continue; + cluster_fail: + if (cluster) { +@@ -7568,6 +7602,11 @@ read_configuration (const char *filename) + cupsArrayDelete (cluster->members); + } + free(cluster); ++ cluster = NULL; ++ } ++ if (start != NULL) { ++ free(start); ++ start = NULL; + } + } else if (!strcasecmp(line, "LoadBalancing") && value) { + if (!strncasecmp(value, "QueueOnClient", 13)) +@@ -7575,7 +7614,7 @@ read_configuration (const char *filename) + else if (!strncasecmp(value, "QueueOnServers", 14)) + LoadBalancingType = QUEUE_ON_SERVERS; + } else if (!strcasecmp(line, "DefaultOptions") && value) { +- if (strlen(value) > 0) ++ if (DefaultOptions == NULL && strlen(value) > 0) + DefaultOptions = strdup(value); + } else if (!strcasecmp(line, "AutoShutdown") && value) { + char *p, *saveptr; +@@ -7949,10 +7988,12 @@ int main(int argc, char*argv[]) { + daemon, not with remote ones. */ + if (getenv("CUPS_SERVER") != NULL) { + strncpy(local_server_str, getenv("CUPS_SERVER"), sizeof(local_server_str)); ++ if (strlen(getenv("CUPS_SERVER")) > 1023) ++ local_server_str[1023] = '\0'; + } else { + #ifdef CUPS_DEFAULT_DOMAINSOCKET + if (DomainSocket == NULL) +- DomainSocket = CUPS_DEFAULT_DOMAINSOCKET; ++ DomainSocket = strdup(CUPS_DEFAULT_DOMAINSOCKET); + #endif + if (DomainSocket != NULL) { + struct stat sockinfo; /* Domain socket information */ +@@ -8293,6 +8334,11 @@ fail: + if (debug_logfile == 1) + stop_debug_logging(); + ++ if (DefaultOptions != NULL) ++ free(DefaultOptions); ++ if (DomainSocket != NULL) ++ free(DomainSocket); ++ + return ret; + + help: +diff --git a/utils/driverless.c b/utils/driverless.c +index 7fc6dae..fe61e58 100644 +--- a/utils/driverless.c ++++ b/utils/driverless.c +@@ -227,12 +227,16 @@ list_printers (int mode) + + if (txt_usb_mfg[0] != '\0') { + strncpy(make, txt_usb_mfg, sizeof(make)); ++ if (strlen(txt_usb_mfg) > 511) ++ make[511] = '\0'; + ptr = device_id + strlen(device_id); + snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), + "MFG:%s;", txt_usb_mfg); + } + if (txt_usb_mdl[0] != '\0') { + strncpy(model, txt_usb_mdl, sizeof(model)); ++ if (strlen(txt_usb_mdl) > 255) ++ model[255] = '\0'; + ptr = device_id + strlen(device_id); + snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), + "MDL:%s;", txt_usb_mdl); +@@ -243,15 +247,22 @@ list_printers (int mode) + *ptr == ')') + *ptr = '\0'; + strncpy(model, txt_product + 1, sizeof(model)); ++ if ((strlen(txt_product) + 1) > 255) ++ model[255] = '\0'; + } else + strncpy(model, txt_product, sizeof(model)); + } else if (txt_ty[0] != '\0') { + strncpy(model, txt_ty, sizeof(model)); ++ if (strlen(txt_ty) > 255) ++ model[255] = '\0'; + if ((ptr = strchr(model, ',')) != NULL) + *ptr = '\0'; + } +- if (txt_pdl[0] != '\0') ++ if (txt_pdl[0] != '\0') { + strncpy(pdl, txt_pdl, sizeof(pdl)); ++ if (strlen(txt_pdl) > 255) ++ pdl[255] = '\0'; ++ } + + if (!device_id[0] && strcasecmp(model, "Unknown")) { + if (make[0]) diff --git a/cups-filters-createall.patch b/cups-filters-createall.patch new file mode 100644 index 0000000..8079537 --- /dev/null +++ b/cups-filters-createall.patch @@ -0,0 +1,21 @@ +diff -up cups-filters-1.16.1/utils/cups-browsed.conf.in.createall cups-filters-1.16.1/utils/cups-browsed.conf.in +--- cups-filters-1.16.1/utils/cups-browsed.conf.in.createall 2018-01-02 17:17:51.555941155 +0100 ++++ cups-filters-1.16.1/utils/cups-browsed.conf.in 2018-01-02 17:19:49.651048564 +0100 +@@ -359,7 +359,7 @@ BrowseRemoteProtocols @BROWSEREMOTEPROTO + + # LocalQueueNamingRemoteCUPS DNS-SD + # LocalQueueNamingRemoteCUPS MakeModel +-# LocalQueueNamingRemoteCUPS RemoteName ++LocalQueueNamingRemoteCUPS RemoteName + # LocalQueueNamingIPPPrinter DNS-SD + # LocalQueueNamingIPPPrinter MakeModel + +@@ -453,7 +453,7 @@ BrowseRemoteProtocols @BROWSEREMOTEPROTO + # CreateIPPPrinterQueues AppleRaster + # CreateIPPPrinterQueues Everywhere AppleRaster + # CreateIPPPrinterQueues Driverless +-# CreateIPPPrinterQueues All ++CreateIPPPrinterQueues All + + + # If cups-browsed is automatically creating print queues for native diff --git a/cups-filters.spec b/cups-filters.spec new file mode 100644 index 0000000..2bfcc00 --- /dev/null +++ b/cups-filters.spec @@ -0,0 +1,983 @@ +# we build CUPS also with relro +%global _hardened_build 1 + +Summary: OpenPrinting CUPS filters and backends +Name: cups-filters +Version: 1.20.0 +Release: 27%{?dist} + +# For a breakdown of the licensing, see COPYING file +# GPLv2: filters: commandto*, imagetoraster, pdftops, rasterto*, +# imagetopdf, pstopdf, texttopdf +# backends: parallel, serial +# GPLv2+: filters: gstopxl, textonly, texttops, imagetops, foomatic-rip +# GPLv3: filters: bannertopdf +# GPLv3+: filters: urftopdf, rastertopdf +# LGPLv2+: utils: cups-browsed +# MIT: filters: gstoraster, pdftoijs, pdftoopvp, pdftopdf, pdftoraster +License: GPLv2 and GPLv2+ and GPLv3 and GPLv3+ and LGPLv2+ and MIT and BSD with advertising + +Url: http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups-filters +Source0: http://www.openprinting.org/download/cups-filters/cups-filters-%{version}.tar.xz + +Patch01: cups-filters-createall.patch +Patch02: cups-filters-brftopagedbrf-install.patch +# covscan fixes from upstream +Patch03: cups-filters-covscan.patch +# 1626996 - cups-filters: Sticky EOF behavior in glibc breaks descriptor concatenation using dup2 +Patch04: cups-filters-cleareof.patch +# 1609264 - links in man page is wrong - it shows 'cups-browsed' in path, but we +# have 'cups-filters' in path, because it is shipped in 'cups-filters' package +# instead of 'cups-browsed' as Ubuntu does. I can repack the project later, +# so cups-browsed would have separate sub package, so the link would be correct +Patch05: cups-browsed.8.patch +# change in ghostscript broke printing for several printer models, the fix is to use +# different ghostscript option, taken from upstream +# bugzilla https://bugzilla.redhat.com/show_bug.cgi?id=1712814 +Patch06: 0001-foomatic-rip-Changed-Ghostscript-call-to-count-pages.patch +# rebuild and patch for FIPS compliance, backported from upstream (#1605101) +Patch07: pdftopdf-nocrypt.patch +# 1776270 - cups-browsed leaks sockets +Patch08: cups-browsed-socket-leak.patch +# 1677731 - error messages when using cups-browsed +Patch09: cups-browsed-error-messages.patch +# 1813229 - cups-browsed leaks memory +Patch10: cups-browsed-memory-leaks.patch +# 1891681 - [RHEL 8] foomatic-rip files up /var/spool/tmp with temporary files +Patch11: foomatic-remove-tmpfile.patch +# 1889798 - Rebuild cups-filters due to rebase of poppler +Patch12: poppler-20.11.0.patch +# 1894543 - Fix '.setfilladjust' usage after gs upgrade to 9.27 +Patch13: 0001-gstoraster-Use-.setfilladjust2-PostScript-command-fo.patch +# 1931603 - cups-browsed doesn't save "-default" options +Patch14: 0001-cups-browsed-Always-save-.-default-option-entries-fr.patch +# 1972981 - cups-browsed doesn't renew DBus subscription in time and all printing comes to a halt +Patch15: cups-browsed-renew.patch +# 1981612 - [RHEL 8] pdftopdf doesn't handle "page-range=10-2147483647" correctly +Patch16: 0001-libcupsfilters-Fix-page-range-like-10-in-pdftopdf-fi.patch + +Requires: cups-filters-libs%{?_isa} = %{version}-%{release} + +# gcc and gcc-c++ is not in buildroot by default + +# gcc for backends (implicitclass, parallel, serial, backend error handling) +# cupsfilters (colord, color manager...), filter (banners, +# commandto*, braille, foomatic-rip, imagetoraster, imagetopdf, gstoraster e.g.), +# fontembed, cups-browsed +BuildRequires: gcc +# gcc-c++ for pdftoopvp, pdftopdf +BuildRequires: gcc-c++ + +BuildRequires: cups-devel +BuildRequires: pkgconfig +# pdftopdf +BuildRequires: pkgconfig(libqpdf) +# pdftops +BuildRequires: poppler-utils +# pdftoijs, pdftoopvp, pdftoraster, gstoraster +BuildRequires: pkgconfig(poppler) +BuildRequires: poppler-cpp-devel +BuildRequires: libjpeg-devel +BuildRequires: libtiff-devel +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(zlib) +BuildRequires: pkgconfig(dbus-1) +BuildRequires: ghostscript +# libijs +BuildRequires: pkgconfig(ijs) +BuildRequires: pkgconfig(freetype2) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(lcms2) +# cups-browsed +BuildRequires: avahi-devel +BuildRequires: pkgconfig(avahi-glib) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: systemd + +# Make sure we get postscriptdriver tags. +BuildRequires: python3-cups + +# Testing font for test scripts. +BuildRequires: dejavu-sans-fonts + +# autogen.sh +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: libtool + +Requires: cups-filesystem +# poppler required for banner printing and with ghostscript needed when project +# is configured with --with-pdftops=hybrid +Requires: poppler-utils +# 1894543 - just to make sure our filter will work if there is a case when cups-filters +# is updated alone and ghostscript isn't updated. This requirement will make sure we will +# bring along a new ghostscript too. +Requires: ghostscript%{?_isa} >= 0:9.27-1 + +# texttopdf +Requires: liberation-mono-fonts + +# pstopdf +Requires: bc grep sed which + +# cups-browsed +# it needs cups.service for running +Requires: cups +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd + +# recommends avahi and cups-ipptool - it is needed for driverless support, +# but it is useless for older devices and cups servers +Recommends: avahi +Recommends: cups-ipptool + +# older installations can still have ghostscript-cups and foomatic-filters +# installed, but they are replaced by cups-filters now. We need to obsolete +# them to have them uninstalled (#1632268) +# rpm complains about unversioned Obsoletes - use NVR bigger than is in RHEL7 +# to make the upgrade to RHEL8 work even if RHEL7 obsoleted packages +# get an update +Obsoletes: ghostscript-cups < 9.26-1 +Obsoletes: foomatic-filters < 4.0.10-1 + +%package libs +Summary: OpenPrinting CUPS filters and backends - cupsfilters and fontembed libraries +# LGPLv2: libcupsfilters +# MIT: libfontembed +License: LGPLv2 and MIT + +%package devel +Summary: OpenPrinting CUPS filters and backends - development environment +License: LGPLv2 and MIT +Requires: cups-filters-libs%{?_isa} = %{version}-%{release} + +%description +Contains backends, filters, and other software that was +once part of the core CUPS distribution but is no longer maintained by +Apple Inc. In addition it contains additional filters developed +independently of Apple, especially filters for the PDF-centric printing +workflow introduced by OpenPrinting. + +%description libs +This package provides cupsfilters and fontembed libraries. + +%description devel +This is the development package for OpenPrinting CUPS filters and backends. + +%prep +%setup -q + +%patch01 -p1 -b .createall +# 1572450 - cupsd: Filter "brftopagedbrf" not found. +%patch02 -p1 -b .brftopagedbrf-install +# covscan fixes from upstream +%patch03 -p1 -b .covscan +# 1626996 - cups-filters: Sticky EOF behavior in glibc breaks descriptor concatenation using dup2 +%patch04 -p1 -b .cleareof +# 1609264 - man pages: wrong links in man cups-browsed +%patch05 -p1 -b .manpage +# 1712814 - Removed option from Ghostscript causes breakage of printing by foomatic-rip filter +%patch06 -p1 -b .foomatic-rip-crash +# 1605101 - qpdf: should not re-implement crypto +%patch07 -p1 -b .pdftopdf-nocrypt +# 1776270 - cups-browsed leaks sockets +%patch08 -p1 -b .cups-browsed-socket-leak +# 1677731 - error messages when using cups-browsed +%patch09 -p1 -b .cups-browsed-error-messages +# 1813229 - cups-browsed leaks memory +%patch10 -p1 -b .cups-browsed-memory-leak +# 1891681 - [RHEL 8] foomatic-rip files up /var/spool/tmp with temporary files +%patch11 -p1 -b .remove-tmpfile +# 1889798 - Rebuild cups-filters due to rebase of poppler +%patch12 -p1 -b .poppler2011 +# 1894543 - Fix '.setfilladjust' usage after gs upgrade to 9.27 +%patch13 -p1 -b .setfilladjust +# 1931603 - cups-browsed doesn't save "-default" options +%patch14 -p1 -b .cups-browsed-save-default-options +# 1972981 - cups-browsed doesn't renew DBus subscription in time and all printing comes to a halt +%patch15 -p1 -b .renew +# 1981612 - [RHEL 8] pdftopdf doesn't handle "page-range=10-2147483647" correctly +%patch16 -p1 -b .ranges + + +%build +# work-around Rpath +./autogen.sh + +# --with-pdftops=hybrid - use Poppler's pdftops instead of Ghostscript for +# Brother, Minolta, and Konica Minolta to work around +# bugs in the printer's PS interpreters +# --with-rcdir=no - don't install SysV init script +# --enable-auto-setup-driverless - enable automatic setup of IPP network printers +# with driverless support +# --enable-driverless - enable PPD generator for driverless printing in +# /usr/lib/cups/driver, it is for manual setup of +# driverless printers with printer setup tool +# --disable-static - do not build static libraries (becuase of Fedora Packaging +# Guidelines) +# --enable-dbus - enable DBus Connection Manager's code +# --disable-silent-rules - verbose build output +# --disable-mutool - mupdf is retired in Fedora, use qpdf + +%configure --disable-static \ + --disable-silent-rules \ + --with-pdftops=hybrid \ + --enable-dbus \ + --with-rcdir=no \ + --disable-mutool \ + --enable-driverless \ + --enable-auto-setup-driverless + +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} + +# Don't ship libtool la files. +rm -f %{buildroot}%{_libdir}/lib*.la + +# Not sure what is this good for. +rm -f %{buildroot}%{_bindir}/ttfread + +rm -f %{buildroot}%{_pkgdocdir}/INSTALL +mkdir -p %{buildroot}%{_pkgdocdir}/fontembed/ +cp -p fontembed/README %{buildroot}%{_pkgdocdir}/fontembed/ + +# systemd unit file +mkdir -p %{buildroot}%{_unitdir} +install -p -m 644 utils/cups-browsed.service %{buildroot}%{_unitdir} + +# LSB3.2 requires /usr/bin/foomatic-rip, +# create it temporarily as a relative symlink +ln -sf %{_cups_serverbin}/filter/foomatic-rip %{buildroot}%{_bindir}/foomatic-rip + +# Don't ship urftopdf for now (bug #1002947). +rm -f %{buildroot}%{_cups_serverbin}/filter/urftopdf +sed -i '/urftopdf/d' %{buildroot}%{_datadir}/cups/mime/cupsfilters.convs + +# Don't ship pdftoopvp for now (bug #1027557). +rm -f %{buildroot}%{_cups_serverbin}/filter/pdftoopvp +rm -f %{buildroot}%{_sysconfdir}/fonts/conf.d/99pdftoopvp.conf + + +%check +make check + +%post +%systemd_post cups-browsed.service + +%preun +%systemd_preun cups-browsed.service + +%postun +%systemd_postun_with_restart cups-browsed.service + +%post libs -p /sbin/ldconfig + +%postun libs -p /sbin/ldconfig + + +%files +%{_pkgdocdir}/README +%{_pkgdocdir}/AUTHORS +%{_pkgdocdir}/NEWS +%config(noreplace) %{_sysconfdir}/cups/cups-browsed.conf +%attr(0755,root,root) %{_cups_serverbin}/filter/* +%attr(0755,root,root) %{_cups_serverbin}/backend/parallel +# Serial backend needs to run as root (bug #212577#c4). +%attr(0700,root,root) %{_cups_serverbin}/backend/serial +%attr(0755,root,root) %{_cups_serverbin}/backend/implicitclass +%attr(0755,root,root) %{_cups_serverbin}/backend/beh +%attr(0755,root,root) %{_cups_serverbin}/backend/cups-brf +%{_bindir}/foomatic-rip +%{_bindir}/driverless +%{_cups_serverbin}/backend/driverless +%{_cups_serverbin}/driver/driverless +%{_datadir}/cups/banners +%{_datadir}/cups/braille +%{_datadir}/cups/charsets +%{_datadir}/cups/data/* +# this needs to be in the main package because of cupsfilters.drv +%{_datadir}/cups/ppdc/pcl.h +%{_datadir}/cups/ppdc/braille.defs +%{_datadir}/cups/ppdc/fr-braille.po +%{_datadir}/cups/ppdc/imagemagick.defs +%{_datadir}/cups/ppdc/index.defs +%{_datadir}/cups/ppdc/liblouis.defs +%{_datadir}/cups/ppdc/liblouis1.defs +%{_datadir}/cups/ppdc/liblouis2.defs +%{_datadir}/cups/ppdc/liblouis3.defs +%{_datadir}/cups/ppdc/liblouis4.defs +%{_datadir}/cups/ppdc/media-braille.defs +%{_datadir}/cups/drv/cupsfilters.drv +%{_datadir}/cups/drv/generic-brf.drv +%{_datadir}/cups/drv/generic-ubrl.drv +%{_datadir}/cups/drv/indexv3.drv +%{_datadir}/cups/drv/indexv4.drv +%{_datadir}/cups/mime/cupsfilters.types +%{_datadir}/cups/mime/cupsfilters.convs +%{_datadir}/cups/mime/cupsfilters-ghostscript.convs +%{_datadir}/cups/mime/cupsfilters-poppler.convs +%{_datadir}/cups/mime/braille.convs +%{_datadir}/cups/mime/braille.types +%{_datadir}/ppd/cupsfilters +%{_sbindir}/cups-browsed +%{_unitdir}/cups-browsed.service +%{_mandir}/man8/cups-browsed.8.gz +%{_mandir}/man5/cups-browsed.conf.5.gz +%{_mandir}/man1/foomatic-rip.1.gz +%{_mandir}/man1/driverless.1.gz + +%files libs +%dir %{_pkgdocdir}/ +%{_pkgdocdir}/COPYING +%{_pkgdocdir}/fontembed/README +%{_libdir}/libcupsfilters.so.* +%{_libdir}/libfontembed.so.* + +%files devel +%{_includedir}/cupsfilters +%{_includedir}/fontembed +%{_datadir}/cups/ppdc/escp.h +%{_libdir}/pkgconfig/libcupsfilters.pc +%{_libdir}/pkgconfig/libfontembed.pc +%{_libdir}/libcupsfilters.so +%{_libdir}/libfontembed.so + +%changelog +* Tue Jul 13 2021 Zdenek Dohnal - 1.20.0-27 +- 1981612 - [RHEL 8] pdftopdf doesn't handle "page-range=10-2147483647" correctly + +* Mon Jun 21 2021 Zdenek Dohnal - 1.20.0-26 +- 1972981 - cups-browsed doesn't renew DBus subscription in time and all printing comes to a halt + +* Thu Jun 03 2021 Richard Lescak - 1.20.0-25 +- 1931603 - cups-browsed doesn't save "*-default" options + +* Mon Dec 14 2020 Zdenek Dohnal - 1.20.0-24 +- require the explicit gs version + +* Tue Dec 08 2020 Zdenek Dohnal - 1.20.0-23 +- 1894543 - Fix '.setfilladjust' usage after gs upgrade to 9.27 + +* Wed Nov 18 2020 Zdenek Dohnal - 1.20.0-22 +- 1889798 - Rebuild cups-filters due to rebase of poppler + +* Tue Oct 27 2020 Zdenek Dohnal - 1.20.0-21 +- 1891681 - [RHEL 8] foomatic-rip files up /var/spool/tmp with temporary files + +* Wed Apr 08 2020 Zdenek Dohnal - 1.20.0-20 +- 1813229 - cups-browsed leaks memory + +* Mon Apr 06 2020 Zdenek Dohnal - 1.20.0-20 +- 1677731 - error messages when using cups-browsed +- 1776230 - missing dependency for ippfind + +* Mon Nov 25 2019 Zdenek Dohnal - 1.20.0-19 +- 1776270 - cups-browsed leaks sockets + +* Mon Sep 02 2019 Zdenek Dohnal - 1.20.0-18 +- 1605101 - qpdf: should not re-implement crypto + +* Wed Aug 07 2019 Zdenek Dohnal - 1.20.0-17 +- 1738533 - rpm -V failed for /etc/cups/cups-browsed.conf + +* Fri Jun 28 2019 Marek Kasik - 1.20.0-16 +- Rebuild due to soname bump in poppler-0.66.0-21 +- Resolves: #1715836 + +* Thu May 23 2019 Zdenek Dohnal - 1.20.0-15 +- 1712814 - Removed option from Ghostscript causes breakage of printing by foomatic-rip filter + +* Mon Nov 12 2018 Zdenek Dohnal - 1.20.0-14 +- 1609264 - man pages: wrong links in man cups-browsed + +* Fri Sep 21 2018 Zdenek Dohnal - 1.20.0-13 +- 1602470 - covscan fixes from upstream +- 1632268 - cups-filters needs to obsolete ghostscript-cups and foomatic-filters +- 1626996 - cups-filters: Sticky EOF behavior in glibc breaks descriptor concatenation using dup2 + +* Tue Jul 24 2018 Zdenek Dohnal - 1.20.0-12 +- correcting license + +* Thu Jul 12 2018 Marek Kasik - 1.20.0-11 +- Rebuild for poppler-0.66.0 + +* Tue Jun 12 2018 Zdenek Dohnal - 1.20.0-10 +- requires ghostscript and poppler-utils + +* Tue Jun 12 2018 Zdenek Dohnal - 1.20.0-9 +- cups-browsed needs cups.service to run + +* Fri Apr 27 2018 Zdenek Dohnal - 1.20.0-8 +- 1572450 - cupsd: Filter "brftopagedbrf" not found. + +* Thu Apr 05 2018 Zdenek Dohnal - 1.20.0-7 +- dependency on poppler-utils is now only recommended + +* Mon Feb 19 2018 Zdenek Dohnal - 1.20.0-6 +- gcc and gcc-c++ is no longer in buildroot by default + +* Wed Feb 14 2018 David Tardon - 1.20.0-5 +- rebuild for poppler 0.62.0 + +* Fri Feb 09 2018 Igor Gnatenko - 1.20.0-4 +- Escape macros in %%changelog + +* Thu Feb 08 2018 Zdenek Dohnal - 1.20.0-3 +- remove old stuff https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/MRWOMRZ6KPCV25EFHJ2O67BCCP3L4Y6N/ + +* Wed Feb 07 2018 Fedora Release Engineering - 1.20.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 30 2018 Zdenek Dohnal - 1.20.0-1 +- Rebase to 1.20.0 + +* Sat Jan 20 2018 Björn Esser - 1.19.0-2 +- Rebuilt for switch to libxcrypt + +* Tue Jan 16 2018 Zdenek Dohnal - 1.19.0-1 +- Rebase to 1.19.0 + +* Thu Jan 11 2018 Zdenek Dohnal - 1.17.9-5 +- adding build dependency on ghostscript because of its package changes + +* Tue Jan 02 2018 Zdenek Dohnal - 1.17.9-4 +- 1529680 - set CreateIPPPrintQueues to ALL and LocalRemoteCUPSQueueNaming to RemoteName + +* Mon Nov 20 2017 Zdenek Dohnal - 1.17.9-3 +- fixing patch for upstream issue 1413 + +* Wed Nov 08 2017 David Tardon - 1.17.9-2 +- rebuild for poppler 0.61.0 + +* Wed Oct 18 2017 Zdenek Dohnal - 1.17.9-1 +- rebase to 1.17.9 + +* Mon Oct 09 2017 Zdenek Dohnal - 1.17.8-4 +- removing Provides ghostscript-cups and foomatic-filters + +* Fri Oct 06 2017 David Tardon - 1.17.8-3 +- rebuild for poppler 0.60.1 + +* Fri Oct 06 2017 Zdenek Dohnal - 1.17.8-2 +- upstream 1413 - Propagation of location doesn't work + +* Tue Oct 03 2017 Zdenek Dohnal - 1.17.8-1 +- rebase to 1.17.8 + +* Tue Sep 19 2017 Zdenek Dohnal - 1.17.7-1 +- rebase to 1.17.7 + +* Fri Sep 08 2017 David Tardon - 1.17.2-2 +- rebuild for poppler 0.59.0 + +* Wed Sep 06 2017 Zdenek Dohnal - 1.17.2-1 +- rebase to 1.17.2 + +* Tue Aug 22 2017 Zdenek Dohnal - 1.16.3-1 +- rebase to 1.16.3 + +* Mon Aug 14 2017 Zdenek Dohnal - 1.16.1-1 +- rebase to 1.16.1 + +* Thu Aug 10 2017 Zdenek Dohnal - 1.16.0-2 +- rebuilt for qpdf-libs + +* Mon Aug 07 2017 Zdenek Dohnal - 1.16.0-1 +- rebase to 1.16.0 + +* Thu Aug 03 2017 David Tardon - 1.14.1-5 +- rebuild for poppler 0.57.0 + +* Wed Aug 02 2017 Fedora Release Engineering - 1.14.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.14.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 03 2017 Jonathan Wakely - 1.14.1-2 +- Rebuilt for Boost 1.64 + +* Fri Jun 30 2017 Zdenek Dohnal - 1.14.1-1 +- rebase to 1.14.1 + +* Thu Jun 29 2017 Zdenek Dohnal - 1.14.0-3 +- update python Requires/BuildRequires accordingly to Fedora Guidelines for Python (python-cups -> python3-cups) + +* Wed May 31 2017 Zdenek Dohnal - 1.14.0-2 +- removing BuildRequires: mupdf + +* Wed May 17 2017 Zdenek Dohnal - 1.14.0-1 +- rebase to 1.14.0 + +* Fri Apr 28 2017 Zdenek Dohnal - 1.13.5-1 +- rebase to 1.13.5 + +* Tue Mar 28 2017 David Tardon - 1.13.4-2 +- rebuild for poppler 0.53.0 + +* Fri Feb 24 2017 Zdenek Dohnal - 1.13.4-1 +- rebase to 1.13.4 +- 1426567 - Added queues are not marked as remote ones + +* Fri Feb 10 2017 Fedora Release Engineering - 1.13.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Fri Jan 27 2017 Jonathan Wakely - 1.13.3-3 +- Rebuilt for Boost 1.63 + +* Fri Jan 27 2017 Jonathan Wakely - 1.13.3-2 +- Rebuilt for Boost 1.63 + +* Thu Jan 19 2017 Zdenek Dohnal - 1.13.3-1 +- rebase to 1.13.3 + +* Mon Jan 02 2017 Zdenek Dohnal - 1.13.2-1 +- rebase to 1.13.2 + +* Mon Dec 19 2016 Zdenek Dohnal - 1.13.1-1 +- rebase to 1.13.1 + +* Fri Dec 16 2016 David Tardon - 1.13.0-2 +- rebuild for poppler 0.50.0 + +* Mon Dec 12 2016 Zdenek Dohnal - 1.13.0-1 +- rebase to 1.13.0 + +* Fri Dec 02 2016 Zdenek Dohnal - 1.12.0-2 +- adding new sources + +* Fri Dec 02 2016 Zdenek Dohnal - 1.12.0-1 +- rebase to 1.12.0 + +* Wed Nov 23 2016 David Tardon - 1.11.6-2 +- rebuild for poppler 0.49.0 + +* Fri Nov 11 2016 Zdenek Dohnal - 1.11.6-1 +- rebase to 1.11.6 + +* Mon Oct 31 2016 Zdenek Dohnal - 1.11.5-1 +- rebase to 1.11.5 + +* Fri Oct 21 2016 Marek Kasik - 1.11.4-2 +- Rebuild for poppler-0.48.0 + +* Tue Sep 27 2016 Zdenek Dohnal - 1.11.4-1 +- rebase to 1.11.4 + +* Tue Sep 20 2016 Zdenek Dohnal - 1.11.3-1 +- rebase to 1.11.3 + +* Tue Aug 30 2016 Zdenek Dohnal - 1.11.2-1 +- rebase to 1.11.2, adding cupsfilters-poppler.convs and cupsfilters-mupdf.convs into package + +* Wed Aug 03 2016 Jiri Popelka - 1.10.0-3 +- %%{_defaultdocdir}/cups-filters/ -> %%{_pkgdocdir} + +* Mon Jul 18 2016 Zdenek Dohnal - 1.10.0-2 +- adding new sources cups-filters-1.10.0 + +* Mon Jul 18 2016 Zdenek Dohnal - 1.10.0-1 +- rebase 1.10.0, include missing ppd.h + +* Mon Jul 18 2016 Marek Kasik - 1.9.0-2 +- Rebuild for poppler-0.45.0 + +* Fri Jun 10 2016 Jiri Popelka - 1.9.0-1 +- 1.9.0 + +* Tue May 3 2016 Marek Kasik - 1.8.3-2 +- Rebuild for poppler-0.43.0 + +* Thu Mar 24 2016 Zdenek Dohnal - 1.8.3-1 +- Update to 1.8.3, adding cupsfilters-ghostscript.convs to %%files + +* Fri Feb 12 2016 Jiri Popelka - 1.8.2-1 +- 1.8.2 + +* Wed Feb 03 2016 Fedora Release Engineering - 1.8.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Fri Jan 22 2016 Marek Kasik - 1.8.1-2 +- Rebuild for poppler-0.40.0 + +* Fri Jan 22 2016 Jiri Popelka - 1.8.1-1 +- 1.8.1 + +* Thu Jan 21 2016 Jiri Popelka - 1.8.0-1 +- 1.8.0 + +* Tue Jan 19 2016 Jiri Popelka - 1.7.0-1 +- 1.7.0 + +* Fri Jan 15 2016 Jonathan Wakely - 1.6.0-2 +- Rebuilt for Boost 1.60 + +* Thu Jan 14 2016 Jiri Popelka - 1.6.0-1 +- 1.6.0 + +* Fri Dec 18 2015 Jiri Popelka - 1.5.0-1 +- 1.5.0 + +* Tue Dec 15 2015 Jiri Popelka - 1.4.0-1 +- 1.4.0 + +* Wed Dec 09 2015 Jiri Popelka - 1.3.0-1 +- 1.3.0 + +* Fri Nov 27 2015 Jiri Popelka - 1.2.0-1 +- 1.2.0 + +* Wed Nov 11 2015 Peter Robinson 1.1.0-2 +- Rebuild (qpdf-6) + +* Tue Oct 27 2015 Jiri Popelka - 1.1.0-1 +- 1.1.0 (version numbering change: minor version = feature, revision = bugfix) + +* Sun Sep 13 2015 Jiri Popelka - 1.0.76-1 +- 1.0.76 + +* Tue Sep 08 2015 Jiri Popelka - 1.0.75-1 +- 1.0.75 + +* Thu Aug 27 2015 Jonathan Wakely - 1.0.74-2 +- Rebuilt for Boost 1.59 + +* Wed Aug 26 2015 Jiri Popelka - 1.0.74-1 +- 1.0.74 + +* Wed Aug 19 2015 Jiri Popelka - 1.0.73-1 +- 1.0.73 - new implicitclass backend + +* Fri Jul 24 2015 David Tardon - 1.0.71-3 +- rebuild for Boost 1.58 to fix deps + +* Thu Jul 23 2015 Orion Poplawski - 1.0.71-2 +- Add upstream patch for poppler 0.34 support + +* Wed Jul 22 2015 Marek Kasik - 1.0.71-2 +- Rebuild (poppler-0.34.0) + +* Fri Jul 03 2015 Jiri Popelka - 1.0.71-1 +- 1.0.71 + +* Mon Jun 29 2015 Jiri Popelka - 1.0.70-1 +- 1.0.70 + +* Mon Jun 22 2015 Tim Waugh - 1.0.69-3 +- Fixes for glib source handling (bug #1228555). + +* Wed Jun 17 2015 Fedora Release Engineering - 1.0.69-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Jun 11 2015 Jiri Popelka - 1.0.69-1 +- 1.0.69 + +* Fri Jun 5 2015 Marek Kasik - 1.0.68-2 +- Rebuild (poppler-0.33.0) + +* Tue Apr 14 2015 Jiri Popelka - 1.0.68-1 +- 1.0.68 + +* Wed Mar 11 2015 Jiri Popelka - 1.0.67-1 +- 1.0.67 + +* Mon Mar 02 2015 Jiri Popelka - 1.0.66-1 +- 1.0.66 + +* Mon Feb 16 2015 Jiri Popelka - 1.0.65-1 +- 1.0.65 + +* Fri Jan 23 2015 Marek Kasik - 1.0.61-3 +- Rebuild (poppler-0.30.0) + +* Thu Nov 27 2014 Marek Kasik - 1.0.61-2 +- Rebuild (poppler-0.28.1) + +* Fri Oct 10 2014 Jiri Popelka - 1.0.61-1 +- 1.0.61 + +* Tue Oct 07 2014 Jiri Popelka - 1.0.60-1 +- 1.0.60 + +* Sun Sep 28 2014 Jiri Popelka - 1.0.59-1 +- 1.0.59 + +* Thu Aug 21 2014 Jiri Popelka - 1.0.58-1 +- 1.0.58 + +* Sat Aug 16 2014 Fedora Release Engineering - 1.0.55-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Fri Aug 15 2014 Jiri Popelka - 1.0.55-2 +- Use %%_defaultdocdir instead of %%doc + +* Mon Jul 28 2014 Jiri Popelka - 1.0.55-1 +- 1.0.55 + +* Fri Jun 13 2014 Tim Waugh - 1.0.54-4 +- Really fix execmem issue (bug #1079534). + +* Wed Jun 11 2014 Jiri Popelka - 1.0.54-3 +- Remove (F21) pdf-landscape.patch + +* Wed Jun 11 2014 Tim Waugh - 1.0.54-2 +- Fix build issue (bug #1106101). +- Don't use grep's -P switch in pstopdf as it needs execmem (bug #1079534). +- Return work-around patch for bug #768811. + +* Mon Jun 09 2014 Jiri Popelka - 1.0.54-1 +- 1.0.54 + +* Sat Jun 07 2014 Fedora Release Engineering - 1.0.53-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue Jun 03 2014 Jiri Popelka - 1.0.53-3 +- Remove BuildRequires pkgconfig(lcms). pkgconfig(lcms2) is enough. + +* Tue May 13 2014 Marek Kasik - 1.0.53-2 +- Rebuild (poppler-0.26.0) + +* Mon Apr 28 2014 Jiri Popelka - 1.0.53-1 +- 1.0.53 + +* Wed Apr 23 2014 Jiri Popelka - 1.0.52-2 +- Remove pdftoopvp and urftopdf in %%install instead of not building them. + +* Tue Apr 08 2014 Jiri Popelka - 1.0.52-1 +- 1.0.52 + +* Wed Apr 02 2014 Jiri Popelka - 1.0.51-1 +- 1.0.51 (#1083327) + +* Thu Mar 27 2014 Jiri Popelka - 1.0.50-1 +- 1.0.50 + +* Mon Mar 24 2014 Jiri Popelka - 1.0.49-1 +- 1.0.49 + +* Wed Mar 12 2014 Jiri Popelka - 1.0.48-1 +- 1.0.48 + +* Tue Mar 11 2014 Jiri Popelka - 1.0.47-2 +- Don't ship pdftoopvp (#1027557) and urftopdf (#1002947). + +* Tue Mar 11 2014 Jiri Popelka - 1.0.47-1 +- 1.0.47: CVE-2013-6473 CVE-2013-6476 CVE-2013-6474 CVE-2013-6475 (#1074840) + +* Mon Mar 10 2014 Jiri Popelka - 1.0.46-3 +- BuildRequires: pkgconfig(foo) instead of foo-devel + +* Tue Mar 4 2014 Tim Waugh - 1.0.46-2 +- The texttopdf filter requires a TrueType monospaced font + (bug #1070729). + +* Thu Feb 20 2014 Jiri Popelka - 1.0.46-1 +- 1.0.46 + +* Fri Feb 14 2014 Jiri Popelka - 1.0.45-1 +- 1.0.45 + +* Mon Jan 20 2014 Jiri Popelka - 1.0.44-1 +- 1.0.44 + +* Tue Jan 14 2014 Jiri Popelka - 1.0.43-2 +- add /usr/bin/foomatic-rip symlink, due to LSB3.2 (#1052452) + +* Fri Dec 20 2013 Jiri Popelka - 1.0.43-1 +- 1.0.43: upstream fix for bug #768811 (pdf-landscape) + +* Sat Nov 30 2013 Jiri Popelka - 1.0.42-1 +- 1.0.42: includes foomatic-rip (obsoletes foomatic-filters package) + +* Tue Nov 19 2013 Tim Waugh - 1.0.41-4 +- Adjust filter costs so application/vnd.adobe-read-postscript input + doesn't go via pstotiff (bug #1008166). + +* Thu Nov 14 2013 Jaromír Končický - 1.0.41-3 +- Fix memory leaks in cups-browsed (bug #1027317). + +* Wed Nov 6 2013 Tim Waugh - 1.0.41-2 +- Include dbus so that colord support works (bug #1026928). + +* Wed Oct 30 2013 Jiri Popelka - 1.0.41-1 +- 1.0.41 - PPD-less printing support + +* Mon Oct 21 2013 Tim Waugh - 1.0.40-4 +- Fix socket leaks in the BrowsePoll code (bug #1021512). + +* Wed Oct 16 2013 Tim Waugh - 1.0.40-3 +- Ship the gstoraster MIME conversion rule now we provide that filter + (bug #1019261). + +* Fri Oct 11 2013 Tim Waugh - 1.0.40-2 +- Fix PDF landscape printing (bug #768811). + +* Fri Oct 11 2013 Jiri Popelka - 1.0.40-1 +- 1.0.40 +- Use new "hybrid" pdftops renderer. + +* Thu Oct 03 2013 Jaromír Končický - 1.0.39-1 +- 1.0.39 +- Removed obsolete patches "pdf-landscape" and "browsepoll-notifications" + +* Tue Oct 1 2013 Tim Waugh - 1.0.38-4 +- Use IPP notifications for BrowsePoll when possible (bug #975241). + +* Tue Oct 1 2013 Tim Waugh - 1.0.38-3 +- Fixes for some printf-type format mismatches (bug #1014093). + +* Tue Sep 17 2013 Tim Waugh - 1.0.38-2 +- Fix landscape printing for PDFs (bug #768811). + +* Wed Sep 04 2013 Jiri Popelka - 1.0.38-1 +- 1.0.38 + +* Thu Aug 29 2013 Jaromír Končický - 1.0.37-1 +- 1.0.37. + +* Tue Aug 27 2013 Jaromír Končický - 1.0.36-5 +- Added build dependency - font required for running tests + +* Tue Aug 27 2013 Jaromír Končický - 1.0.36-4 +- Added checking phase (make check) + +* Wed Aug 21 2013 Tim Waugh - 1.0.36-3 +- Upstream patch to re-work filter costs (bug #998977). No longer need + text filter costs patch as paps gets used by default now if + installed. + +* Mon Aug 19 2013 Marek Kasik - 1.0.36-2 +- Rebuild (poppler-0.24.0) + +* Tue Aug 13 2013 Tim Waugh - 1.0.36-1 +- 1.0.36. + +* Tue Aug 13 2013 Tim Waugh - 1.0.35-7 +- Upstream patch to move in filters from ghostscript. + +* Tue Jul 30 2013 Tim Waugh - 1.0.35-6 +- Set cost for text filters to 200 so that the paps filter gets + preference for the time being (bug #988909). + +* Wed Jul 24 2013 Tim Waugh - 1.0.35-5 +- Handle page-label when printing n-up as well. + +* Tue Jul 23 2013 Tim Waugh - 1.0.35-4 +- Added support for page-label (bug #987515). + +* Thu Jul 11 2013 Jiri Popelka - 1.0.35-3 +- Rebuild (qpdf-5.0.0) + +* Mon Jul 01 2013 Jiri Popelka - 1.0.35-2 +- add cups-browsed(8) and cups-browsed.conf(5) +- don't reverse lookup IP address in URI (#975822) + +* Wed Jun 26 2013 Jiri Popelka - 1.0.35-1 +- 1.0.35 + +* Mon Jun 24 2013 Marek Kasik - 1.0.34-9 +- Rebuild (poppler-0.22.5) + +* Wed Jun 19 2013 Jiri Popelka - 1.0.34-8 +- fix the note we add in cups-browsed.conf + +* Wed Jun 12 2013 Jiri Popelka - 1.0.34-7 +- Obsolete cups-php (#971741) + +* Wed Jun 05 2013 Jiri Popelka - 1.0.34-6 +- one more cups-browsed leak fixed (#959682) + +* Wed Jun 05 2013 Jiri Popelka - 1.0.34-5 +- perl is actually not required by pstopdf, because the calling is in dead code + +* Mon Jun 03 2013 Jiri Popelka - 1.0.34-4 +- fix resource leaks and other problems found by Coverity & Valgrind (#959682) + +* Wed May 15 2013 Jiri Popelka - 1.0.34-3 +- ship ppdc/pcl.h because of cupsfilters.drv + +* Tue May 07 2013 Jiri Popelka - 1.0.34-2 +- pstopdf requires bc (#960315) + +* Thu Apr 11 2013 Jiri Popelka - 1.0.34-1 +- 1.0.34 + +* Fri Apr 05 2013 Fridolin Pokorny - 1.0.33-1 +- 1.0.33 +- removed cups-filters-1.0.32-null-info.patch, accepted by upstream + +* Thu Apr 04 2013 Fridolin Pokorny - 1.0.32-2 +- fixed segfault when info is NULL + +* Thu Apr 04 2013 Fridolin Pokorny - 1.0.32-1 +- 1.0.32 + +* Fri Mar 29 2013 Jiri Popelka - 1.0.31-3 +- add note to cups-browsed.conf + +* Thu Mar 28 2013 Jiri Popelka - 1.0.31-2 +- check cupsd.conf existence prior to grepping it (#928816) + +* Fri Mar 22 2013 Jiri Popelka - 1.0.31-1 +- 1.0.31 + +* Tue Mar 19 2013 Jiri Popelka - 1.0.30-4 +- revert previous change + +* Wed Mar 13 2013 Jiri Popelka - 1.0.30-3 +- don't ship banners for now (#919489) + +* Tue Mar 12 2013 Jiri Popelka - 1.0.30-2 +- move BrowsePoll from cupsd.conf to cups-browsed.conf in %%post + +* Fri Mar 08 2013 Jiri Popelka - 1.0.30-1 +- 1.0.30: CUPS browsing and broadcasting in cups-browsed + +* Wed Feb 13 2013 Fedora Release Engineering - 1.0.29-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Sat Jan 19 2013 Rex Dieter 1.0.29-3 +- backport upstream buildfix for poppler-0.22.x + +* Fri Jan 18 2013 Adam Tkac - 1.0.29-2 +- rebuild due to "jpeg8-ABI" feature drop + +* Thu Jan 03 2013 Jiri Popelka 1.0.29-1 +- 1.0.29 + +* Wed Jan 02 2013 Jiri Popelka 1.0.28-1 +- 1.0.28: cups-browsed daemon and service + +* Thu Nov 29 2012 Jiri Popelka 1.0.25-1 +- 1.0.25 + +* Fri Sep 07 2012 Jiri Popelka 1.0.24-1 +- 1.0.24 + +* Wed Aug 22 2012 Jiri Popelka 1.0.23-1 +- 1.0.23: old pdftopdf removed + +* Tue Aug 21 2012 Jiri Popelka 1.0.22-1 +- 1.0.22: new pdftopdf (uses qpdf instead of poppler) + +* Wed Aug 08 2012 Jiri Popelka 1.0.20-4 +- rebuild + +* Thu Aug 02 2012 Jiri Popelka 1.0.20-3 +- commented multiple licensing breakdown (#832130) +- verbose build output + +* Thu Aug 02 2012 Jiri Popelka 1.0.20-2 +- BuildRequires: poppler-cpp-devel (to build against poppler-0.20) + +* Mon Jul 23 2012 Jiri Popelka 1.0.20-1 +- 1.0.20 + +* Tue Jul 17 2012 Jiri Popelka 1.0.19-1 +- 1.0.19 + +* Wed May 30 2012 Jiri Popelka 1.0.18-1 +- initial spec file diff --git a/foomatic-remove-tmpfile.patch b/foomatic-remove-tmpfile.patch new file mode 100644 index 0000000..bbe7a68 --- /dev/null +++ b/foomatic-remove-tmpfile.patch @@ -0,0 +1,17 @@ +diff --git a/filter/foomatic-rip/foomaticrip.c b/filter/foomatic-rip/foomaticrip.c +index 7dc2426..146125f 100644 +--- a/filter/foomatic-rip/foomaticrip.c ++++ b/filter/foomatic-rip/foomaticrip.c +@@ -672,6 +672,12 @@ int print_file(const char *filename, int convert) + if (out != NULL) + fclose(out); + ++ // Delete temp file if we created one ++ if ( *tmpfilename ) { ++ _log("Removing temporary file %s\n", tmpfilename); ++ unlink(tmpfilename); ++ } ++ + return ret; + } + diff --git a/pdftopdf-nocrypt.patch b/pdftopdf-nocrypt.patch new file mode 100644 index 0000000..24caf5c --- /dev/null +++ b/pdftopdf-nocrypt.patch @@ -0,0 +1,20 @@ +diff --git a/filter/pdftopdf/qpdf_pdftopdf_processor.cc b/filter/pdftopdf/qpdf_pdftopdf_processor.cc +index 73e4f06..0752a99 100644 +--- a/filter/pdftopdf/qpdf_pdftopdf_processor.cc ++++ b/filter/pdftopdf/qpdf_pdftopdf_processor.cc +@@ -623,6 +623,7 @@ void QPDF_PDFTOPDF_Processor::emitFile(FILE *f,ArgOwnership take) // {{{ + if (!extraheader.empty()) { + out.setExtraHeaderText(extraheader); + } ++ out.setPreserveEncryption(false); + out.write(); + } + // }}} +@@ -642,6 +643,7 @@ void QPDF_PDFTOPDF_Processor::emitFilename(const char *name) // {{{ + if (!extraheader.empty()) { + out.setExtraHeaderText(extraheader); + } ++ out.setPreserveEncryption(false); + out.write(); + } + // }}} diff --git a/poppler-20.11.0.patch b/poppler-20.11.0.patch new file mode 100644 index 0000000..cb0be6b --- /dev/null +++ b/poppler-20.11.0.patch @@ -0,0 +1,459 @@ +--- cups-filters-1.20.0/filter/pdf.cxx ++++ cups-filters-1.20.0/filter/pdf.cxx +@@ -87,7 +87,11 @@ static EMB_PARAMS *Font; + extern "C" pdf_t * pdf_load_template(const char *filename) + { + /* Init poppler */ ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 83 ++ globalParams.reset(new GlobalParams()); ++#else + globalParams = new GlobalParams(); ++#endif + + PDFDoc *doc = new PDFDoc(new GooString(filename)); + +@@ -136,7 +140,7 @@ extern "C" void pdf_prepend_stream(pdf_t + #endif + if (!pageobj.isDict() || + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- (contents = pageobj.dictLookupNF("Contents")).isNull() ++ (contents = pageobj.dictLookupNF("Contents").copy()).isNull() + #else + !pageobj.dictLookupNF("Contents", &contents) + #endif +@@ -166,11 +170,15 @@ extern "C" void pdf_prepend_stream(pdf_t + #endif + + r = xref->addIndirectObject(&stream); ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ streamrefobj = Object(r); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + streamrefobj = Object(r.num, r.gen); + #else + streamrefobj.initRef(r.num, r.gen); + #endif ++#endif + + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + array = Object(new Array(xref)); +@@ -182,7 +190,7 @@ extern "C" void pdf_prepend_stream(pdf_t + + if (contents.isStream()) { + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- contents = pageobj.dictLookupNF("Contents"); // streams must be indirect, i.e. not fetch()-ed ++ contents = pageobj.dictLookupNF("Contents").copy(); // streams must be indirect, i.e. not fetch()-ed + array.arrayAdd(std::move(contents)); + #else + pageobj.dictLookupNF("Contents", &contents); // streams must be indirect, i.e. not fetch()-ed +@@ -194,7 +202,7 @@ extern "C" void pdf_prepend_stream(pdf_t + Object obj; + for (i = 0; i < len; i++) { + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- obj = contents.arrayGetNF(i); ++ obj = contents.arrayGetNF(i).copy(); + array.arrayAdd(std::move(obj)); + #else + contents.arrayGetNF(i, &obj); +@@ -258,7 +266,7 @@ static Object * get_resource_dict(XRef * + + /* TODO resource dict can also be inherited */ + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- res = pagedict->lookupNF("Resources"); ++ res = pagedict->lookupNF("Resources").copy(); + if (res.isNull()) + #else + if (!pagedict->lookupNF("Resources", &res)) +@@ -331,7 +339,7 @@ extern "C" void pdf_add_type1_font(pdf_t + xref->addIndirectObject(&font); + + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- fonts = resdict.dictLookupNF("Font"); ++ fonts = resdict.dictLookupNF("Font").copy(); + #else + resdict.dictLookupNF("Font", &fonts); + #endif +@@ -540,7 +548,7 @@ extern "C" void pdf_duplicate_page (pdf_ + } + + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- parentref = page.dictLookupNF("Parent"); ++ parentref = page.dictLookupNF("Parent").copy(); + parent = parentref.fetch(xref); + #else + page.dictLookupNF("Parent", &parentref); +@@ -568,6 +576,9 @@ extern "C" void pdf_duplicate_page (pdf_ + // the pages tree (not supported by major pdf implementations). + for (i = 1; i < count; i++) { + Ref r = xref->addIndirectObject(&page); ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ kids.arrayAdd(Object(r)); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + kids.arrayAdd(Object(r.num, r.gen)); + #else +@@ -575,6 +586,7 @@ extern "C" void pdf_duplicate_page (pdf_ + kids.arrayAdd(&ref); + ref.free(); + #endif ++#endif + } + + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +@@ -734,7 +746,7 @@ extern "C" int pdf_fill_form(pdf_t *doc, + } + + FormField *ff = fm_text->getField(); +- GooString *field_name; ++ const GooString *field_name; + field_name = ff->getFullyQualifiedName(); + if ( ! field_name ) + field_name = ff->getPartialName(); +@@ -743,7 +755,11 @@ extern "C" int pdf_fill_form(pdf_t *doc, + continue; + } + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 72 ++ const char *name = field_name->c_str(); ++#else + const char *name = field_name->getCString(); ++#endif + const char *fill_with = lookup_opt(opt, name); + if ( ! fill_with ) { + fprintf(stderr, "Lack information for widget: %s.\n", name); +@@ -831,6 +847,9 @@ extern "C" int pdf_fill_form(pdf_t *doc, + appearance_stream_dic.dictSet("Type", name_object("XObject")); + appearance_stream_dic.dictSet("Subtype", name_object("Form")); + appearance_stream_dic.dictSet("FormType", int_object(1)); ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ appearance_stream_dic.dictSet("Resources", Object(resref)); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + appearance_stream_dic.dictSet("Resources", Object(resref.num, resref.gen)); + #else +@@ -838,6 +857,7 @@ extern "C" int pdf_fill_form(pdf_t *doc, + obj_ref_x.initRef(resref.num, resref.gen); + appearance_stream_dic.dictSet("Resources", &obj_ref_x); + #endif ++#endif + + /* BBox array: TODO. currently out of the head. */ + Object array; +@@ -851,8 +871,13 @@ extern "C" int pdf_fill_form(pdf_t *doc, + appearance_stream_dic.dictSet("BBox", std::move(array)); + appearance_stream_dic.dictSet("Length", Object(appearance_stream->getLength())); + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 72 ++ MemStream *mem_stream = new MemStream(appearance_stream->c_str(), ++ 0, appearance_stream->getLength(), std::move(appearance_stream_dic)); ++#else + MemStream *mem_stream = new MemStream(appearance_stream->getCString(), + 0, appearance_stream->getLength(), std::move(appearance_stream_dic)); ++#endif + + /* Make obj stream */ + Object stream = Object(static_cast(mem_stream)); +@@ -860,8 +885,11 @@ extern "C" int pdf_fill_form(pdf_t *doc, + Ref r = xref->addIndirectObject(&stream); + + /* Update Xref table */ ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ Object obj_ref = Object(r); ++#else + Object obj_ref = Object(r.num, r.gen); +- ++#endif + /* + * Fill Annotation's appearance streams dic /AP + * See: 8.4.4 Appearance Streams +@@ -884,8 +912,13 @@ extern "C" int pdf_fill_form(pdf_t *doc, + appearance_stream_dic.dictSet("BBox", &array); + appearance_stream_dic.dictSet("Length", int_object(appearance_stream->getLength())); + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 72 ++ MemStream *mem_stream = new MemStream(appearance_stream->c_str(), ++ 0, appearance_stream->getLength(), &appearance_stream_dic); ++#else + MemStream *mem_stream = new MemStream(appearance_stream->getCString(), + 0, appearance_stream->getLength(), &appearance_stream_dic); ++#endif + + /* Make obj stream */ + Object stream; +@@ -925,10 +958,10 @@ extern "C" int pdf_fill_form(pdf_t *doc, + */ + Object *obj_form = catalog->getAcroForm(); + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- obj_form->dictSet("NeedAppearances", Object(gFalse)); ++ obj_form->dictSet("NeedAppearances", Object(false)); + #else + Object obj1; +- obj1.initBool(gFalse); ++ obj1.initBool(false); + obj_form->dictSet("NeedAppearances", &obj1); + #endif + +@@ -948,7 +981,11 @@ extern "C" int pdf_fill_form(pdf_t *doc, + catRef.gen = xref->getRootGen(); + catRef.num = xref->getRootNum(); + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ catObj.dictSet("AcroForm", Object(ref_form)); ++#else + catObj.dictSet("AcroForm", Object(ref_form.num, ref_form.gen)); ++#endif + xref->setModifiedObject(&catObj, catRef); + #else + Object obj2; +@@ -1020,12 +1057,22 @@ static int pdf_embed_font(pdf_t *doc, + + /* Create memory stream font. Add it to font dic. */ + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 72 ++ MemStream *mem_stream = new MemStream(font_stream->c_str(), ++ 0, outlen, std::move(f_dic)); ++#else + MemStream *mem_stream = new MemStream(font_stream->getCString(), + 0, outlen, std::move(f_dic)); ++#endif + Object stream = Object(static_cast(mem_stream)); + #else ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 72 ++ MemStream *mem_stream = new MemStream(font_stream->c_str(), ++ 0, outlen, &f_dic); ++#else + MemStream *mem_stream = new MemStream(font_stream->getCString(), + 0, outlen, &f_dic); ++#endif + + /* Make obj stream */ + Object stream; +@@ -1066,7 +1113,7 @@ static int pdf_embed_font(pdf_t *doc, + Object fonts; + + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +- fonts = resdict.dictLookupNF("Font"); ++ fonts = resdict.dictLookupNF("Font").copy(); + #else + resdict.dictLookupNF("Font", &fonts); + #endif +@@ -1074,7 +1121,7 @@ static int pdf_embed_font(pdf_t *doc, + /* Create new one, if doesn't exists */ + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + resdict.dictSet("Font", Object(new Dict(xref))); +- fonts = resdict.dictLookupNF("Font"); ++ fonts = resdict.dictLookupNF("Font").copy(); + #else + fonts.initDict(xref); + resdict.dictSet("Font", &fonts); +@@ -1108,11 +1155,15 @@ static int pdf_embed_font(pdf_t *doc, + + /* r - cid resource dic */ + Object font_res_obj_ref; ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ font_res_obj_ref = Object(r); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + font_res_obj_ref = Object(r.num, r.gen); + #else + font_res_obj_ref.initRef(r.num, r.gen); + #endif ++#endif + + Object *fonts_dic; + Object dereferenced_obj; +@@ -1440,6 +1491,9 @@ static Object *make_fontdescriptor_dic( + #endif + } + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ dic->dictSet(emb_pdf_get_fontfile_key(emb), Object(fontfile_obj_ref)); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + dic->dictSet(emb_pdf_get_fontfile_key(emb), Object(fontfile_obj_ref.num, fontfile_obj_ref.gen)); + #else +@@ -1447,6 +1501,7 @@ static Object *make_fontdescriptor_dic( + ref_obj.initRef(fontfile_obj_ref.num, fontfile_obj_ref.gen); + dic->dictSet(emb_pdf_get_fontfile_key(emb), &ref_obj); + #endif ++#endif + + return dic; + } +@@ -1480,6 +1535,9 @@ static Object *make_font_dic( + "BaseFont", + name_object(copyString(emb_pdf_escape_name(fdes->fontname,-1)))); + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ dic->dictSet("FontDescriptor", Object(fontdescriptor_obj_ref)); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + dic->dictSet("FontDescriptor", Object(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen)); + #else +@@ -1487,6 +1545,7 @@ static Object *make_font_dic( + ref_obj.initRef(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen); + dic->dictSet("FontDescriptor", &ref_obj); + #endif ++#endif + + if ( emb->plan & EMB_A_MULTIBYTE ) { + assert(fwid->warray); +@@ -1573,17 +1632,26 @@ static Object *make_cidfont_dic( + basefont->append(addenc); + basefont->append((addenc[0])?encoding:""); + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 72 ++ dic->dictSet("BaseFont", ++ name_object(copyString(basefont->c_str()))); ++#else + dic->dictSet("BaseFont", + name_object(copyString(basefont->getCString()))); ++#endif + + dic->dictSet("Encoding", name_object(copyString(encoding))); + + Object obj; ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 75 ++ obj = Object(fontdescriptor_obj_ref); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 + obj = Object(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen); + #else + obj.initRef(fontdescriptor_obj_ref.num, fontdescriptor_obj_ref.gen); + #endif ++#endif + + Object array; + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 58 +--- cups-filters-1.20.0/filter/pdftoraster.cxx ++++ cups-filters-1.20.0/filter/pdftoraster.cxx +@@ -282,8 +282,13 @@ cmsHPROFILE sgray_profile() + + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 19 + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 23 ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 85 ++void CDECL myErrorFun(ErrorCategory category, ++ Goffset pos, const char *msg) ++#else + void CDECL myErrorFun(void *data, ErrorCategory category, + Goffset pos, char *msg) ++#endif + #else + void CDECL myErrorFun(void *data, ErrorCategory category, + int pos, char *msg) +@@ -412,9 +417,9 @@ static GBool getColorProfilePath(ppd_fil + path->append("/profiles/"); + } + path->append(attr->value); +- return gTrue; ++ return true; + } +- return gFalse; ++ return false; + } + #endif + +@@ -1686,7 +1691,7 @@ static void outPage(PDFDoc *doc, Catalog + { + SplashBitmap *bitmap; + Page *page = catalog->getPage(pageNo); +- PDFRectangle *mediaBox = page->getMediaBox(); ++ const PDFRectangle *mediaBox = page->getMediaBox(); + int rotate = page->getRotate(); + double paperdimensions[2], /* Physical size of the paper */ + margins[4]; /* Physical margins of print */ +@@ -1814,7 +1819,7 @@ static void outPage(PDFDoc *doc, Catalog + + doc->displayPage(out,pageNo,header.HWResolution[0], + header.HWResolution[1],(landscape == 0 ? 0 : 90), +- gTrue,gTrue,gTrue); ++ true,true,true); + bitmap = out->getBitmap(); + bitmapoffset[0] = margins[0] / 72.0 * header.HWResolution[0]; + bitmapoffset[1] = margins[3] / 72.0 * header.HWResolution[1]; +@@ -1867,7 +1872,7 @@ static void outPage(PDFDoc *doc, Catalog + writePageImage(raster,bitmap,pageNo); + } + +-static void setPopplerColorProfile() ++static void setPopplerColorProfile(SplashOutputDev *out) + { + if (header.cupsBitsPerColor != 8 && header.cupsBitsPerColor != 16) { + /* color Profile is not supported */ +@@ -1951,7 +1956,13 @@ static void setPopplerColorProfile() + break; + } + if (popplerColorProfile != NULL) { ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 90 ++#ifdef USE_CMS ++ out->setDisplayProfile(make_GfxLCMSProfilePtr(popplerColorProfile)); ++#endif ++#else + GfxColorSpace::setDisplayProfile(popplerColorProfile); ++#endif + } + } + +@@ -1966,13 +1977,21 @@ int main(int argc, char *argv[]) { + int rowpad; + Catalog *catalog; + ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 85 ++ setErrorCallback(::myErrorFun); ++#else + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 19 + setErrorCallback(::myErrorFun,NULL); + #else + setErrorFunction(::myErrorFun); + #endif ++#endif + cmsSetLogErrorHandler(lcmsErrorHandler); +- globalParams = new GlobalParams(); ++#if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 83 ++ globalParams.reset(new GlobalParams()); ++#else ++ globalParams = new GlobalParams(); ++#endif + parseOpts(argc, argv); + + if (argc == 6) { +@@ -2119,14 +2138,10 @@ int main(int argc, char *argv[]) { + break; + } + +- if (!cm_disabled) { +- setPopplerColorProfile(); +- } +- + out = new SplashOutputDev(cmode,rowpad/* row padding */, +- gFalse,paperColor,gTrue ++ false,paperColor,true + #if POPPLER_VERSION_MAJOR == 0 && POPPLER_VERSION_MINOR <= 30 +- ,gFalse ++ ,false + #endif + ); + #if POPPLER_VERSION_MAJOR > 0 || POPPLER_VERSION_MINOR >= 19 +@@ -2135,6 +2150,10 @@ int main(int argc, char *argv[]) { + out->startDoc(doc->getXRef()); + #endif + ++ if (!cm_disabled) { ++ setPopplerColorProfile(out); ++ } ++ + if ((raster = cupsRasterOpen(1, pwgraster ? CUPS_RASTER_WRITE_PWG : + CUPS_RASTER_WRITE)) == 0) { + pdfError(-1,const_cast("Can't open raster stream")); +@@ -2162,9 +2181,11 @@ err1: + cmsDeleteTransform(colorTransform); + } + ++#if POPPLER_VERSION_MAJOR == 0 && POPPLER_VERSION_MINOR <= 68 + // Check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); ++#endif + + return exitCode; + } diff --git a/sources b/sources new file mode 100644 index 0000000..838778a --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (cups-filters-1.20.0.tar.xz) = b71722cc14f81cf8cbed5b8e980c9689adc2daf6cfa72e4174b6842bd89574090831f0e986b5e32a0e9fc4e29836f04e74e72c48918d7f3a8f65faa3a6c077af