import cups-filters-1.20.0-34.el8

i8c-beta changed/i8c-beta/cups-filters-1.20.0-34.el8
MSVSphere Packaging Team 9 months ago
commit 3fb7ce3923

@ -0,0 +1,2 @@
f574678c1436d91216858edc9d2baea03579e998 SOURCES/cups-filters-1.20.0.tar.xz
ded8efb5069586c51079608354159d6c3805e877 SOURCES/testprint

2
.gitignore vendored

@ -0,0 +1,2 @@
SOURCES/cups-filters-1.20.0.tar.xz
SOURCES/testprint

@ -0,0 +1,28 @@
From 144322be6e06ff12f101fc35e472d62978861e28 Mon Sep 17 00:00:00 2001
From: Till Kamppeter <till.kamppeter@gmail.com>
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

@ -0,0 +1,22 @@
From 297cc2decc53e0b08eb03049fce375db33df2131 Mon Sep 17 00:00:00 2001
From: Till Kamppeter <till.kamppeter@gmail.com>
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");

@ -0,0 +1,46 @@
diff --git a/filter/gstoraster.c b/filter/gstoraster.c
index 0c9f37d..820acc8 100644
--- a/filter/gstoraster.c
+++ b/filter/gstoraster.c
@@ -73,29 +73,23 @@ static GsDocType
parse_doc_type(FILE *fp)
{
char buf[5];
- GsDocType doc_type;
- char *rc;
+ GsDocType type = GS_DOC_TYPE_UNKNOWN;
/* get the first few bytes of the file */
- doc_type = GS_DOC_TYPE_UNKNOWN;
rewind(fp);
- rc = fgets(buf,sizeof(buf),fp);
- if (rc == NULL)
- goto out;
-
- /* is PDF */
- if (strncmp(buf,"%PDF",4) == 0) {
- doc_type = GS_DOC_TYPE_PDF;
- goto out;
+/* skip until PDF/PS start header */
+ while (fgets(buf, sizeof(buf), fp) != 0) {
+ if (strncmp(buf, "%PDF", 4) == 0)
+ type = GS_DOC_TYPE_PDF;
+ if (strncmp(buf, "%!", 2) == 0)
+ type = GS_DOC_TYPE_PS;
+ if (type != GS_DOC_TYPE_UNKNOWN)
+ break;
}
- /* is PS */
- if (strncmp(buf,"%!",2) == 0) {
- doc_type = GS_DOC_TYPE_PS;
- goto out;
- }
-out:
- return doc_type;
+ rewind(fp);
+
+ return (type);
}
static void

@ -0,0 +1,27 @@
From e7103a7aaa43ab613701cbf094e0aa91e6526112 Mon Sep 17 00:00:00 2001
From: Till Kamppeter <till.kamppeter@gmail.com>
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

@ -0,0 +1,26 @@
From 022c34fedb66f706b2ab82d7506d5b5b1fa18e1f Mon Sep 17 00:00:00 2001
From: Bryan Mason <bmason@redhat.com>
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

@ -0,0 +1,49 @@
From a07a43f885a4a7186310639b214c499e09e453c5 Mon Sep 17 00:00:00 2001
From: Till Kamppeter <till.kamppeter@gmail.com>
Date: Tue, 13 Nov 2018 13:04:59 +0100
Subject: [PATCH] pdftopdf: Fixed printing multiple copies on driverless IPP
printers.
---
NEWS | 4 ++++
filter/pdftopdf/pdftopdf.cc | 24 +++++++++++++++++++-----
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/filter/pdftopdf/pdftopdf.cc b/filter/pdftopdf/pdftopdf.cc
index f474f08c6..880b664fd 100644
--- a/filter/pdftopdf/pdftopdf.cc
+++ b/filter/pdftopdf/pdftopdf.cc
@@ -783,11 +783,25 @@ void calculate(ppd_file_t *ppd,ProcessingParameters &param) // {{{
} else if ((ppd)&&(!ppd->manual_copies)) { // hw copy generation available
param.deviceCopies=param.numCopies;
if (param.collate) { // collate requested by user
- // check collate device, with current/final(!) ppd settings
- param.deviceCollate=printerWillCollate(ppd);
- if (!param.deviceCollate) {
- // printer can't hw collate -> we must copy collated in sw
- param.deviceCopies=1;
+ // Check output format (FINAL_CONTENT_TYPE env variable) whether it is
+ // of a driverless IPP printer (PDF, Apple Raster, PWG Raster, PCLm).
+ // These printers do always hardware collate if they do hardware copies.
+ // https://github.com/apple/cups/issues/5433
+ char *final_content_type = getenv("FINAL_CONTENT_TYPE");
+ if (final_content_type &&
+ (strcasestr(final_content_type, "/pdf") ||
+ strcasestr(final_content_type, "/vnd.cups-pdf") ||
+ strcasestr(final_content_type, "/pwg-raster") ||
+ strcasestr(final_content_type, "/urf") ||
+ strcasestr(final_content_type, "/PCLm"))) {
+ param.deviceCollate = true;
+ } else {
+ // check collate device, with current/final(!) ppd settings
+ param.deviceCollate=printerWillCollate(ppd);
+ if (!param.deviceCollate) {
+ // printer can't hw collate -> we must copy collated in sw
+ param.deviceCopies=1;
+ }
}
} // else: printer copies w/o collate and takes care of duplex/evenDuplex
} else { // sw copies
--
2.43.0

@ -0,0 +1,107 @@
diff --git a/backend/beh.c b/backend/beh.c
index 225fd27..5e9cee0 100644
--- a/backend/beh.c
+++ b/backend/beh.c
@@ -22,6 +22,7 @@
#include "backend-private.h"
#include <cups/array.h>
#include <ctype.h>
+#include <sys/wait.h>
/*
* Local globals...
@@ -213,10 +214,14 @@ call_backend(char *uri, /* I - URI of final destination */
char **argv, /* I - Command-line arguments */
char *filename) { /* I - File name of input data */
const char *cups_serverbin; /* Location of programs */
+ char *backend_argv[8]; // Arguments for called CUPS backend
char scheme[1024], /* Scheme from URI */
*ptr, /* Pointer into scheme */
- cmdline[65536]; /* Backend command line */
- int retval;
+ backend_path[2048]; // Backend path
+ int pid,
+ wait_pid,
+ wait_status,
+ retval = 0;
/*
* Build the backend command line...
@@ -235,16 +240,19 @@ call_backend(char *uri, /* I - URI of final destination */
fprintf(stderr,
"ERROR: beh: Direct output into a file not supported.\n");
exit (CUPS_BACKEND_FAILED);
- } else
- snprintf(cmdline, sizeof(cmdline),
- "%s/backend/%s '%s' '%s' '%s' '%s' '%s' %s",
- cups_serverbin, scheme, argv[1], argv[2], argv[3],
- /* Apply number of copies only if beh was called with a
- file name and not with the print data in stdin, as
- backends should handle copies only if they are called
- with a file name */
- (argc == 6 ? "1" : argv[4]),
- argv[5], filename);
+ }
+
+ backend_argv[0] = uri;
+ backend_argv[1] = argv[1];
+ backend_argv[2] = argv[2];
+ backend_argv[3] = argv[3];
+ backend_argv[4] = (argc == 6 ? "1" : argv[4]);
+ backend_argv[5] = argv[5];
+ backend_argv[6] = filename;
+ backend_argv[7] = NULL;
+
+ snprintf(backend_path, sizeof(backend_path),
+ "%s/backend/%s", cups_serverbin, scheme);
/*
* Overwrite the device URI and run the actual backend...
@@ -253,17 +261,41 @@ call_backend(char *uri, /* I - URI of final destination */
setenv("DEVICE_URI", uri, 1);
fprintf(stderr,
- "DEBUG: beh: Executing backend command line \"%s\"...\n",
- cmdline);
+ "DEBUG: beh: Executing backend command line \"%s '%s' '%s' '%s' '%s' '%s'%s%s\"...\n",
+ backend_path, backend_argv[1], backend_argv[2], backend_argv[3],
+ backend_argv[4], backend_argv[5],
+ (backend_argv[6] && backend_argv[6][0] ? " " : ""),
+ (backend_argv[6] && backend_argv[6][0] ? backend_argv[6] : ""));
fprintf(stderr,
"DEBUG: beh: Using device URI: %s\n",
uri);
- retval = system(cmdline) >> 8;
+ if ((pid = fork()) == 0)
+ {
+ retval = execv(backend_path, backend_argv);
+
+ if (retval == -1)
+ fprintf(stderr, "ERROR: Unable to execute backend: %s\n",
+ strerror(errno));
+ exit (CUPS_BACKEND_FAILED);
+ }
+ else if (pid < 0)
+ {
+ fprintf(stderr, "ERROR: Unable to fork for backend\n");
+ return (CUPS_BACKEND_FAILED);
+ }
+
+ while ((wait_pid = wait(&wait_status)) < 0 && errno == EINTR);
- if (retval == -1)
- fprintf(stderr, "ERROR: Unable to execute backend command line: %s\n",
- strerror(errno));
+ if (wait_pid >= 0 && wait_status)
+ {
+ if (WIFEXITED(wait_status))
+ retval = WEXITSTATUS(wait_status);
+ else if (WTERMSIG(wait_status) != SIGTERM)
+ retval = WTERMSIG(wait_status);
+ else
+ retval = 0;
+ }
return (retval);
}

@ -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",

@ -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, &current_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);

@ -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,

@ -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,

@ -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.

@ -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 <samuel.thibault@ens-lyon.org>
+#
+# 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

@ -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("<STDIN>", 0);
wait_for_process(renderer_pid);

@ -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("<STDIN>", 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)://<remote host>:631/printers/<remote queue> */
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])

@ -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

@ -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;
}

@ -0,0 +1,13 @@
diff --git a/filter/gstoraster.c b/filter/gstoraster.c
index 7fd9ccf..0c9f37d 100644
--- a/filter/gstoraster.c
+++ b/filter/gstoraster.c
@@ -906,7 +906,7 @@ main (int argc, char **argv, char *envp[])
cupsArrayAdd(gs_args, strdup("-c"));
/* Set margins if we have a bounding box defined */
- if (h.cupsImagingBBox[3] > 0.0) {
+ if (h.cupsImagingBBox[3] > 0.0 && outformat != OUTPUT_FORMAT_PDF) {
snprintf(tmpstr, sizeof(tmpstr),
"<</.HWMargins[%f %f %f %f] /Margins[0 0]>>setpagedevice",
h.cupsImagingBBox[0], h.cupsImagingBBox[1],

@ -0,0 +1,124 @@
#!/bin/bash
## Copyright (C) 2003-2006 Red Hat, Inc.
## Copyright (C) 2003-2006 Tim Waugh <twaugh@redhat.com>
## Changed on 2007/05/17, Opher Shachar, LADPC Ltd.
## Added support for page-ranges option.
## Added page accounting.
## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License
## as published by the Free Software Foundation; either version 2
## of the License, or (at your option) any later version.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
if [ $# == 0 ]; then
echo >&2 "ERROR: $0 job-id user title copies options [file]"
exit 1
fi
# Extract the papersize
SENDFF=`grep '^\*DefaultSendFF' "$PPD" | cut -d\ -f2`
COPIES=1
if [ $# -ge 4 ]; then
COPIES="$4"
fi
if [ $# -lt 6 ]; then
unset TMPFILE
trap -- 'rm -f "$TMPFILE"' EXIT
TMPFILE=$(mktemp ${TMPDIR:-/tmp}/lftocrlf.XXXXXX)
cat > "$TMPFILE"
else
TMPFILE="$6"
fi
PR=${5#*page-ranges=}
# Do options specify page-ranges?
if [[ "$PR" != "$5" ]]; then
PR=${PR%% *}
else
#unset PR
PR=1-999999
fi
if [[ "$PR" ]]; then
TMPFILE2=$(mktemp ${TMPDIR:-/tmp}/lftocrlf2.XXXXXX)
pagenum=0
EOF=
{
while [[ "$PR" ]]; do
pl=${PR%%,*} ;# take first subrange
PR=${PR#$pl};PR=${PR#,} ;# remove from range list
pu=${pl#*-} ;# extract upper and lower
pl=${pl%-*} ;# pages of subrange
# Allows interpreting 0-5,3-10 as 1-5,6-10 rejects 5-1 or 1-
(( pagenum >= pl )) && pl=$(( pagenum + 1 ))
(( pl > pu )) && continue
# Loop reading pages until at or over lower page of subrange.
while read -d `echo -ne '\f'` -r; do
(( pagenum++ ))
(( pagenum == pl )) && break
done
# Did we reach lower page of subrange or EOF?
if (( pagenum < pl )); then
[[ ! "$REPLY" ]] && break ;# empty last page - we're done.
(( pagenum++ ))
EOF=y
fi
# Output page and report to page log
if (( pagenum == pl )); then
echo -n "${REPLY}" >>"$TMPFILE2"
# If EOF then page has no final FF
[[ ! "$EOF" ]] && echo -ne '\f' >>"$TMPFILE2"
echo "PAGE: $pagenum $COPIES" >&2
fi
[[ "$EOF" ]] && break
# Is the current subrange a single page?
(( pagenum == pu )) && continue
while read -d `echo -ne '\f'` -r; do
(( pagenum++ ))
echo -ne "${REPLY}\f" >>"$TMPFILE2"
echo "PAGE: $pagenum $COPIES" >&2
(( pagenum == pu )) && break
done
# Could be that we reached EOF before page boundry
if (( pagenum < pu )); then
if [[ "$REPLY" ]]; then
(( pagenum++ ))
echo -n "${REPLY}" >>"$TMPFILE2"
echo "PAGE: $pagenum $COPIES" >&2
fi
break
fi
done
} <"$TMPFILE"
else
TMPFILE2="$TMPFILE"
pc=$(grep -co `echo -ne '\f'` "$TMPFILE2")
pc=$(( pc * $COPIES ))
echo "PAGE: $pc" >&2
fi
while [ "$COPIES" -gt 0 ]; do
# Just translate LF->CRLF at the moment, until the PPD has options added.
sed -e 's/$/'`echo -ne '\r'`'/g' "$TMPFILE2"
if [ "$SENDFF" == "True" ]
then
echo -ne \\014
fi
COPIES=$(($COPIES - 1))
done
# Cleanup
[[ "$TMPFILE" != "$TMPFILE2" ]] && rm -f "$TMPFILE2"
exit 0

@ -0,0 +1,47 @@
*PPD-Adobe: "4.3"
*%
*% Text-only printer definition
*%
*FormatVersion: "4.3"
*FileVersion: "1.1"
*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*PCFileName: "LFTOCRLF.PPD"
*Manufacturer: "Generic"
*Product: "(Generic)"
*cupsVersion: 1.0
*cupsManualCopies: True
*cupsModelNumber: 2
*cupsFilter: "text/plain 0 lftocrlf"
*ModelName: "Generic LF-to-CRLF printer"
*ShortNickName: "Generic LF-to-CRLF printer"
*NickName: "Generic LF-to-CRLF printer"
*PSVersion: "(2017.000) 0"
*LanguageLevel: "2"
*ColorDevice: False
*DefaultColorSpace: Gray
*FileSystem: False
*Throughput: "8"
*LandscapeOrientation: Plus90
*VariablePaperSize: False
*TTRasterizer: Type42
*DefaultImageableArea: Letter
*ImageableArea Letter/US Letter: "18 36 594 756"
*DefaultPaperDimension: Letter
*PaperDimension Letter/Letter: "612 792"
*OpenUI *PageSize/Media Size: PickOne
*OrderDependency: 10 AnySetup *PageSize
*DefaultPageSize: Letter
*PageSize Letter/Letter: "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
*CloseUI: *PageSize
*OpenUI *PageRegion: PickOne
*OrderDependency: 10 AnySetup *PageRegion
*DefaultPageRegion: Letter
*PageRegion Letter/Letter: "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
*CloseUI: *PageRegion
*OpenUI *SendFF: Boolean
*DefaultSendFF: False
*SendFF True/True: ""
*SendFF False/False: ""
*CloseUI: *SendFF

@ -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();
}
// }}}

@ -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<Stream *>(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<Stream *>(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<char *>("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;
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save