From 82826d262c915b4926269b773a30192836c193f6 Mon Sep 17 00:00:00 2001 From: Zdenek Dohnal Date: Wed, 15 Mar 2023 16:59:53 +0100 Subject: [PATCH] fix printing images to Postscript printers --- 0001-Coverity-fixes.patch | 154 ------------------ ...erate-media-col-if-media-col-default.patch | 38 +++++ libppd.spec | 7 +- 3 files changed, 44 insertions(+), 155 deletions(-) delete mode 100644 0001-Coverity-fixes.patch create mode 100644 0001-ppd-filter.c-Generate-media-col-if-media-col-default.patch diff --git a/0001-Coverity-fixes.patch b/0001-Coverity-fixes.patch deleted file mode 100644 index 86b6f31..0000000 --- a/0001-Coverity-fixes.patch +++ /dev/null @@ -1,154 +0,0 @@ -From 0d469d4fd01432462a7cf03bbb30568edb822695 Mon Sep 17 00:00:00 2001 -From: Zdenek Dohnal -Date: Tue, 14 Feb 2023 17:12:40 +0100 -Subject: [PATCH] Coverity fixes - ---- - ppd/imagetops-pstops.c | 9 +++++++-- - ppd/pdftops.c | 2 ++ - ppd/ppd-collection.cxx | 5 ++++- - ppd/ppd-filter.c | 18 +++++++++++++----- - ppd/raster-interpret.c | 3 ++- - 5 files changed, 28 insertions(+), 9 deletions(-) - -diff --git a/ppd/imagetops-pstops.c b/ppd/imagetops-pstops.c -index 7c5023d3..948ca0df 100644 ---- a/ppd/imagetops-pstops.c -+++ b/ppd/imagetops-pstops.c -@@ -280,7 +280,6 @@ ppdFilterPSToPS(int inputfd, // I - File descriptor input stream - log, ld, iscanceled, icd) == 1) - { - close(inputfd); -- close(outputfd); - - return (1); - } -@@ -401,6 +400,10 @@ ppdFilterPSToPS(int inputfd, // I - File descriptor input stream - "ppdFilterPSToPS: The print file is empty."); - // Do not treat this an error, if a previous filter eliminated all - // pages the job should get dequeued without anything printed. -+ -+ fclose(outputfp); -+ cupsFileClose(inputfp); -+ - return (0); - } - -@@ -564,7 +567,6 @@ ppdFilterPSToPS(int inputfd, // I - File descriptor input stream - close(inputfd); - - fclose(outputfp); -- close(outputfd); - - return (status); - } -@@ -704,6 +706,9 @@ ppdFilterImageToPS(int inputfd, // I - File descriptor input - if (log) log(ld, CF_LOGLEVEL_ERROR, - "ppdFilterImageToPS: Unable to copy input: %s", - strerror(errno)); -+ -+ fclose(inputfp); -+ - return (1); - } - -diff --git a/ppd/pdftops.c b/ppd/pdftops.c -index a00b2260..c88d9ad9 100644 ---- a/ppd/pdftops.c -+++ b/ppd/pdftops.c -@@ -373,6 +373,8 @@ ppdFilterPDFToPS(int inputfd, // I - File descriptor input stream - { - if (log) log(ld, CF_LOGLEVEL_ERROR, - "ppdFilterPDFToPS: Unable to copy PDF file: %s", strerror(errno)); -+ -+ fclose(inputfp); - return (1); - } - -diff --git a/ppd/ppd-collection.cxx b/ppd/ppd-collection.cxx -index 68ea4db1..27a0b011 100644 ---- a/ppd/ppd-collection.cxx -+++ b/ppd/ppd-collection.cxx -@@ -1573,8 +1573,11 @@ load_drv(const char *filename, // I - Actual filename - mtime, (size_t)size, d->model_number, type, "drv", - ppdlist, log, ld); - else if (products_found < PPD_MAX_PROD) -+ { - strncpy(ppd->record.products[products_found], product->value->value, -- sizeof(ppd->record.products[0])); -+ sizeof(ppd->record.products[0]) - 1); -+ ppd->record.products[products_found][sizeof(ppd->record.products[0]) - 1] = '\0'; -+ } - else - break; - -diff --git a/ppd/ppd-filter.c b/ppd/ppd-filter.c -index 4e2d2931..308336ad 100644 ---- a/ppd/ppd-filter.c -+++ b/ppd/ppd-filter.c -@@ -46,6 +46,7 @@ ppdFilterCUPSWrapper( - cups_option_t *options = NULL; // Print options - cf_filter_data_t filter_data; - const char *val; -+ char *ppdfile = NULL; - char buf[256]; - int retval = 0; - -@@ -161,20 +162,26 @@ ppdFilterCUPSWrapper( - // to the filter_data structure - // - -- if (getenv("PPD")) -- retval = ppdFilterLoadPPDFile(&filter_data, getenv("PPD")); -+ ppdfile = getenv("PPD"); -+ -+ if (ppdfile && (retval = ppdFilterLoadPPDFile(&filter_data, getenv("PPD"))) != 0) -+ { -+ fprintf(stderr, "ERROR: ppdFilterCUPSWrapper: Cannot open the PPD file %s\n", ppdfile); -+ close(inputfd); -+ goto out; -+ } - - // - // Fire up the filter function (output to stdout, file descriptor 1) - // - -- if (!retval) -- retval = filter(inputfd, 1, inputseekable, &filter_data, parameters); -+ retval = filter(inputfd, 1, inputseekable, &filter_data, parameters); - - // - // Clean up - // - -+out: - cupsFreeOptions(filter_data.num_options, filter_data.options); - ppdFilterFreePPDFile(&filter_data); - -@@ -1570,7 +1577,8 @@ ppdFilterUniversal(int inputfd, // I - File descriptor input stream - if (log) log(ld, CF_LOGLEVEL_DEBUG, - "ppdFilterUniversal: --> Selecting this line"); - // Take the input format of the line as output format for us -- strncpy(output, in, sizeof(output)); -+ strncpy(output, in, sizeof(output) - 1); -+ output[sizeof(output) - 1] = '\0'; - // Update the minimum cost found - lowest_cost = cost; - // We cannot find a "better" solution ... -diff --git a/ppd/raster-interpret.c b/ppd/raster-interpret.c -index efa99d7e..cff216e7 100644 ---- a/ppd/raster-interpret.c -+++ b/ppd/raster-interpret.c -@@ -526,7 +526,8 @@ ppdRasterMatchPPDSize( - return (-1); - } - -- strncpy(pageSizeRequested, header->cupsPageSizeName, 64); -+ strncpy(pageSizeRequested, header->cupsPageSizeName, 63); -+ pageSizeRequested[63] = "\0"; - // Prefer user-selected page size. - memset(dimensions, 0, sizeof(double)*2); - memset(margins, 0, sizeof(double)*4); --- -2.39.1 - diff --git a/0001-ppd-filter.c-Generate-media-col-if-media-col-default.patch b/0001-ppd-filter.c-Generate-media-col-if-media-col-default.patch new file mode 100644 index 0000000..9795a7e --- /dev/null +++ b/0001-ppd-filter.c-Generate-media-col-if-media-col-default.patch @@ -0,0 +1,38 @@ +From b815415c74a8e5112ca9bd8adc7c04f626ec4702 Mon Sep 17 00:00:00 2001 +From: Zdenek Dohnal +Date: Wed, 15 Mar 2023 16:37:06 +0100 +Subject: [PATCH] ppd-filter.c: Generate media-col if media-col-default exists + +We would generate `media-col` attribute only if we had `media-col-default` +attribute and `PageSize` or `media` options, which doesn't seem to be always +the case for `PageSize` and `media`. These options usually are not +default options and if the application doesn't send them, they are not +sent to filters. + +The current implementation breaks image printing for (at least) printers +installed with Postscript driver - the printer outputs an empty sheet of +paper. It happens because `cfFilterImageToPDF()` doesn't get page size +by other means. +--- + ppd/ppd-filter.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/ppd/ppd-filter.c b/ppd/ppd-filter.c +index 308336ad..fbf2e4f8 100644 +--- a/ppd/ppd-filter.c ++++ b/ppd/ppd-filter.c +@@ -739,9 +739,8 @@ ppdFilterLoadPPD(cf_filter_data_t *data) // I/O - Job and printer data + + page_size = cupsGetOption("PageSize", data->num_options, data->options); + media = cupsGetOption("media", data->num_options, data->options); +- if ((page_size || media) && +- (attr = ippFindAttribute(data->printer_attrs, "media-col-default", +- IPP_TAG_ZERO)) != NULL) ++ if ((attr = ippFindAttribute(data->printer_attrs, "media-col-default", ++ IPP_TAG_ZERO)) != NULL) + { + // We have already applied the settings of these options to the + // PPD file and converted the PPD option settings into the printer +-- +2.40.0 + diff --git a/libppd.spec b/libppd.spec index 979aec9..6c3a93a 100644 --- a/libppd.spec +++ b/libppd.spec @@ -8,7 +8,7 @@ Name: libppd Epoch: 1 Version: 2.0~b4 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Library for retro-fitting legacy printer drivers # the CUPS exception text is the same as LLVM exception, so using that name with @@ -20,6 +20,8 @@ Source0: %{URL}/releases/download/%{upstream_version}/%{name}-%{upstream_ # Patches +# https://github.com/OpenPrinting/libppd/pull/15 +Patch0001: 0001-ppd-filter.c-Generate-media-col-if-media-col-default.patch # for autogen.sh @@ -189,6 +191,9 @@ rm -rf %{buildroot}%{_datadir}/ppdc %endif %changelog +* Wed Mar 15 2023 Zdenek Dohnal - 1:2.0~b4-2 +- fix printing images to Postscript printers + * Wed Mar 01 2023 Zdenek Dohnal - 1:2.0~b4-1 - 2.0b4 - introduce Epoch because I didn't read FPG carefully...