commit
bfc0d79cf6
@ -0,0 +1,2 @@
|
||||
f574678c1436d91216858edc9d2baea03579e998 SOURCES/cups-filters-1.20.0.tar.xz
|
||||
ded8efb5069586c51079608354159d6c3805e877 SOURCES/testprint
|
@ -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 ¶m) // {{{
|
||||
} 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, ¤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);
|
@ -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…
Reference in new issue