From 51fa9cbae6e6b2121a8351bb7698ee7b677c2397 Mon Sep 17 00:00:00 2001 From: Michael J Gruber Date: Fri, 14 Jul 2023 10:44:28 +0200 Subject: [PATCH] rebase to bugfix release 10.01.2 (rhbz#2182090) --- .gitignore | 1 + ...aster-output-device-Do-not-match-cus.patch | 694 ------------------ ...rent-VM-modes-during-CIDFont-loading.patch | 88 --- ...color-info-juggling-with-x11-devices.patch | 78 -- ghostscript-10.01.0-CVE-2023-28879.patch | 44 -- ghostscript.spec | 9 +- sources | 2 +- 7 files changed, 8 insertions(+), 908 deletions(-) delete mode 100644 ghostscript-10.0.0-CUPS-PWG-Apple-Raster-output-device-Do-not-match-cus.patch delete mode 100644 ghostscript-10.0.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch delete mode 100644 ghostscript-10.0.0-Fix-color-info-juggling-with-x11-devices.patch delete mode 100644 ghostscript-10.01.0-CVE-2023-28879.patch diff --git a/.gitignore b/.gitignore index 8801de1..80b5e18 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ ghostscript-8.71.tar.xz /ghostscript-9.56.1.tar.xz /ghostscript-10.0.0.tar.xz /ghostscript-10.01.0.tar.xz +/ghostscript-10.01.2.tar.xz diff --git a/ghostscript-10.0.0-CUPS-PWG-Apple-Raster-output-device-Do-not-match-cus.patch b/ghostscript-10.0.0-CUPS-PWG-Apple-Raster-output-device-Do-not-match-cus.patch deleted file mode 100644 index b189091..0000000 --- a/ghostscript-10.0.0-CUPS-PWG-Apple-Raster-output-device-Do-not-match-cus.patch +++ /dev/null @@ -1,694 +0,0 @@ -From 387f09416ca7364d09415d47df01864b04cbdbc0 Mon Sep 17 00:00:00 2001 -From: Till Kamppeter -Date: Sun, 25 Sep 2022 10:02:28 +0200 -Subject: [PATCH] CUPS/PWG/Apple Raster output device: Do not match custom size - against PPD - -If for a job a custom page size is selected, indicated by something -like "-scupsPageSizeName=Custom.4x8in" or "-scupsPageSizeName=Custom", -do not try to match the requested page size, given by standard -Ghostscript parameters like -"-dDEVICEWIDTHPOINTS=... -dDEVICEHEIGHTPOINTS=...", with the supported -page sizes defined in the PPD file. - -This avoids unwished rotations as reported in - - https://github.com/OpenPrinting/cups-filters/issues/484 - -and also unwished size mismatches if the custom size is very close to -a size defined in the PPD file. ---- - cups/gdevcups.c | 538 ++++++++++++++++++++++++------------------------ - 1 file changed, 273 insertions(+), 265 deletions(-) - -diff --git a/cups/gdevcups.c b/cups/gdevcups.c -index 6405122ec..cf2ba5e4b 100644 ---- a/cups/gdevcups.c -+++ b/cups/gdevcups.c -@@ -3509,28 +3509,6 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - yflip = 0; - } - --#ifdef CUPS_RASTER_SYNCv1 -- /* -- * Chack whether cupsPageSizeName has a valid value -- */ -- -- if (strlen(cups->header.cupsPageSizeName) != 0) { -- found = 0; -- for (i = cups->PPD->num_sizes, size = cups->PPD->sizes; -- i > 0; -- i --, size ++) -- if (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0) { -- found = 1; -- break; -- } -- if (found == 0) cups->header.cupsPageSizeName[0] = '\0'; -- } --#ifdef CUPS_DEBUG -- dmprintf1(pdev->memory, "DEBUG2: cups->header.cupsPageSizeName = %s\n", -- cups->header.cupsPageSizeName); --#endif /* CUPS_DEBUG */ --#endif /* CUPS_RASTER_SYNCv1 */ -- - /* - * Find the matching page size... - */ -@@ -3542,189 +3520,38 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - - best_score = -1; - best_size = NULL; -- for (i = cups->PPD->num_sizes, size = cups->PPD->sizes; -- i > 0; -- i --, size ++) -- { -- if (size->length == 0 || size->width == 0) continue; -- -- score = 0; -- size_matched = 0; -- margins_matched = 0; -- imageable_area_matched = 0; --#ifdef CUPS_DEBUG -- name_requested_matched = 0; --#endif -- -- long_edge_mismatch = -- fabs(cups->MediaSize[1] - size->length)/size->length + -- LONG_EDGE_LENGTH_MATCH_LIMIT / 100; -- short_edge_mismatch = -- fabs(cups->MediaSize[0] - size->width)/size->width + -- SHORT_EDGE_LENGTH_MATCH_LIMIT / 100; -- if (size->length < size->width) -- { -- swap = long_edge_mismatch; -- long_edge_mismatch = short_edge_mismatch; -- short_edge_mismatch = swap; -- } -- -- if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT && -- short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT) -- { -- size_matched = 1; -- /* If two sizes match within the limits, take the one with less -- mismatch */ -- score = (long)(9999.0 - -- long_edge_mismatch * short_edge_mismatch * 9999.0 / -- LONG_EDGE_LENGTH_MATCH_LIMIT / -- SHORT_EDGE_LENGTH_MATCH_LIMIT); -- if (score < 0) score = 0; -- /* We check whether all 4 margins match with the margin info -- of the page size in the PPD. Here we check also for swapped -- left/right and top/bottom margins as the cups->HWMargins -- info can be from the previous page and there the margins -- can be swapped due to duplex printing requirements */ -- if (!margins_set || -- (((fabs(cups->HWMargins[0] - size->left) < 1.0 && -- fabs(cups->HWMargins[2] - size->width + size->right) < 1.0) || -- (fabs(cups->HWMargins[0] - size->width + size->right) < 1.0 && -- fabs(cups->HWMargins[2] - size->left) < 1.0)) && -- ((fabs(cups->HWMargins[1] - size->bottom) < 1.0 && -- fabs(cups->HWMargins[3] - size->length + size->top) < 1.0) || -- (fabs(cups->HWMargins[1] - size->length + size->top) < 1.0 && -- fabs(cups->HWMargins[3] - size->bottom) < 1.0)))) -- margins_matched = 1; -- } else { -- /* Compare the dimensions of the imageable area against the -- the input page size */ -- long_edge_mismatch = -- fabs(cups->MediaSize[1] - size->top + size->bottom)/size->length + -- LONG_EDGE_LENGTH_MATCH_LIMIT / 100; -- short_edge_mismatch = -- fabs(cups->MediaSize[0] - size->right + size->left)/size->width + -- SHORT_EDGE_LENGTH_MATCH_LIMIT / 100; -- if (size->length < size->width) -- { -- swap = long_edge_mismatch; -- long_edge_mismatch = short_edge_mismatch; -- short_edge_mismatch = swap; -- } -- -- if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT && -- short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT) -- { -- imageable_area_matched = 1; -- /* If two sizes match within the limits, take the one with less -- mismatch */ -- score = (long)(4999.0 - -- long_edge_mismatch * short_edge_mismatch * 4999.0 / -- LONG_EDGE_LENGTH_MATCH_LIMIT / -- SHORT_EDGE_LENGTH_MATCH_LIMIT); -- if (score < 0) score = 0; -- } -- } -- -- if (margins_matched) -- score += PAGESIZE_SCORE_SIZE_MARGINS * 10000; -- else if (size_matched) -- score += PAGESIZE_SCORE_SIZE * 10000; -- -- if (size_matched || imageable_area_matched) { -- if (!strcasecmp(cups->pageSizeRequested, size->name)) -- { --#ifdef CUPS_DEBUG -- name_requested_matched = 1; --#endif -- } -- else -- score -= 1000; -- } -- -- if (score > best_score) -- { -- best_score = score; -- if (score > 0) -- best_size = size; -- } --#ifdef CUPS_DEBUG -- dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (portrait): %s\n", -- size->name); -- dmprintf2(pdev->memory, "DEBUG2: Width: %.2f; Height: %.2f\n", -- size->width, size->length); -- dmprintf4(pdev->memory, "DEBUG2: Margins: Left: %.2f; Right: %.2f; Top: %.2f; Bottom: %.2f\n", -- size->left, size->right, size->top, size->bottom); -- dmprintf4(pdev->memory, "DEBUG2: Size mismatch: Long Edge (%.3f): %.5f; Short Edge (%.3f): %.5f\n", -- LONG_EDGE_LENGTH_MATCH_LIMIT, long_edge_mismatch, -- SHORT_EDGE_LENGTH_MATCH_LIMIT, short_edge_mismatch); -- dmprintf4(pdev->memory, "DEBUG2: Match: Size: %d; Margins: %d; Imageable Area: %d; Name requested: %d\n", -- size_matched, margins_matched, imageable_area_matched, -- name_requested_matched); -- dmprintf2(pdev->memory, "DEBUG2: Score: %ld; Best Score: %ld\n", -- score, best_score); --#endif /* CUPS_DEBUG */ -- } -- -- if (best_size) -+ /* Match against the PPD's page size only if the page size name does -+ not suggest that we use a custom page size */ -+ if (strncasecmp(cups->header.cupsPageSizeName, "Custom", 6) != 0 || -+ (cups->header.cupsPageSizeName[6] != '\0' && -+ cups->header.cupsPageSizeName[6] != '.')) - { -+#ifdef CUPS_RASTER_SYNCv1 - /* -- * Standard size... -+ * Chack whether cupsPageSizeName has a valid value - */ - -+ if (strlen(cups->header.cupsPageSizeName) != 0) { -+ found = 0; -+ for (i = cups->PPD->num_sizes, size = cups->PPD->sizes; -+ i > 0; -+ i --, size ++) -+ if (strcasecmp(cups->header.cupsPageSizeName, size->name) == 0) { -+ found = 1; -+ break; -+ } -+ if (found == 0) cups->header.cupsPageSizeName[0] = '\0'; -+ } - #ifdef CUPS_DEBUG -- dmprintf1(pdev->memory, "DEBUG: size = %s\n", best_size->name); -+ dmprintf1(pdev->memory, "DEBUG2: cups->header.cupsPageSizeName = %s\n", -+ cups->header.cupsPageSizeName); - #endif /* CUPS_DEBUG */ -+#endif /* CUPS_RASTER_SYNCv1 */ - -- mediasize[0] = best_size->width; -- mediasize[1] = best_size->length; -- -- cups->landscape = 0; -- --#ifdef CUPS_RASTER_SYNCv1 -- strncpy(cups->header.cupsPageSizeName, best_size->name, -- sizeof(cups->header.cupsPageSizeName)); -- cups->header.cupsPageSizeName[sizeof(cups->header.cupsPageSizeName) - 1] = -- '\0'; -- -- if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0) -- { --#endif -- margins[0] = best_size->left / 72.0; -- margins[1] = best_size->bottom / 72.0; -- margins[2] = (best_size->width - best_size->right) / 72.0; -- margins[3] = (best_size->length - best_size->top) / 72.0; -- if (xflip == 1) -- { -- swap = margins[0]; margins[0] = margins[2]; margins[2] = swap; -- } -- if (yflip == 1) -- { -- swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; -- } --#ifdef CUPS_RASTER_SYNCv1 -- } -- else -- { -- margins[0] = 0.0; -- margins[1] = 0.0; -- margins[2] = 0.0; -- margins[3] = 0.0; -- } --#endif -- } -- else -- { -- /* -- * No matching portrait size; look for a matching size in -- * landscape orientation... -- */ -- -- best_score = -1; -- best_size = NULL; - for (i = cups->PPD->num_sizes, size = cups->PPD->sizes; - i > 0; - i --, size ++) -- { -+ { - if (size->length == 0 || size->width == 0) continue; - - score = 0; -@@ -3736,10 +3563,10 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - #endif - - long_edge_mismatch = -- fabs(cups->MediaSize[0] - size->length)/size->length + -+ fabs(cups->MediaSize[1] - size->length)/size->length + - LONG_EDGE_LENGTH_MATCH_LIMIT / 100; - short_edge_mismatch = -- fabs(cups->MediaSize[1] - size->width)/size->width + -+ fabs(cups->MediaSize[0] - size->width)/size->width + - SHORT_EDGE_LENGTH_MATCH_LIMIT / 100; - if (size->length < size->width) - { -@@ -3765,23 +3592,23 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - info can be from the previous page and there the margins - can be swapped due to duplex printing requirements */ - if (!margins_set || -- (((fabs(cups->HWMargins[1] - size->left) < 1.0 && -- fabs(cups->HWMargins[3] - size->width + size->right) < 1.0)|| -- (fabs(cups->HWMargins[1] - size->width + size->right) < 1.0 && -- fabs(cups->HWMargins[3] - size->left) < 1.0)) && -- ((fabs(cups->HWMargins[0] - size->bottom) < 1.0 && -- fabs(cups->HWMargins[2] - size->length + size->top) < 1.0) || -- (fabs(cups->HWMargins[0] - size->length + size->top) < 1.0 && -- fabs(cups->HWMargins[2] - size->bottom) < 1.0)))) -+ (((fabs(cups->HWMargins[0] - size->left) < 1.0 && -+ fabs(cups->HWMargins[2] - size->width + size->right) < 1.0) || -+ (fabs(cups->HWMargins[0] - size->width + size->right) < 1.0 && -+ fabs(cups->HWMargins[2] - size->left) < 1.0)) && -+ ((fabs(cups->HWMargins[1] - size->bottom) < 1.0 && -+ fabs(cups->HWMargins[3] - size->length + size->top) < 1.0) || -+ (fabs(cups->HWMargins[1] - size->length + size->top) < 1.0 && -+ fabs(cups->HWMargins[3] - size->bottom) < 1.0)))) - margins_matched = 1; - } else { - /* Compare the dimensions of the imageable area against the - the input page size */ - long_edge_mismatch = -- fabs(cups->MediaSize[0] - size->top + size->bottom)/size->length + -+ fabs(cups->MediaSize[1] - size->top + size->bottom)/size->length + - LONG_EDGE_LENGTH_MATCH_LIMIT / 100; - short_edge_mismatch = -- fabs(cups->MediaSize[1] - size->right + size->left)/size->width + -+ fabs(cups->MediaSize[0] - size->right + size->left)/size->width + - SHORT_EDGE_LENGTH_MATCH_LIMIT / 100; - if (size->length < size->width) - { -@@ -3811,11 +3638,11 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - - if (size_matched || imageable_area_matched) { - if (!strcasecmp(cups->pageSizeRequested, size->name)) -- { -+ { - #ifdef CUPS_DEBUG - name_requested_matched = 1; - #endif -- } -+ } - else - score -= 1000; - } -@@ -3827,7 +3654,7 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - best_size = size; - } - #ifdef CUPS_DEBUG -- dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (landscape): %s\n", -+ dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (portrait): %s\n", - size->name); - dmprintf2(pdev->memory, "DEBUG2: Width: %.2f; Height: %.2f\n", - size->width, size->length); -@@ -3847,17 +3674,17 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - if (best_size) - { - /* -- * Standard size in landscape orientation... -+ * Standard size... - */ - - #ifdef CUPS_DEBUG -- dmprintf1(pdev->memory, "DEBUG: landscape size = %s\n", best_size->name); -+ dmprintf1(pdev->memory, "DEBUG: size = %s\n", best_size->name); - #endif /* CUPS_DEBUG */ - -- mediasize[0] = best_size->length; -- mediasize[1] = best_size->width; -+ mediasize[0] = best_size->width; -+ mediasize[1] = best_size->length; - -- cups->landscape = 1; -+ cups->landscape = 0; - - #ifdef CUPS_RASTER_SYNCv1 - strncpy(cups->header.cupsPageSizeName, best_size->name, -@@ -3868,17 +3695,17 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0) - { - #endif -- margins[0] = (best_size->length - best_size->top) / 72.0; -- margins[1] = best_size->left / 72.0; -- margins[2] = best_size->bottom / 72.0; -- margins[3] = (best_size->width - best_size->right) / 72.0; -+ margins[0] = best_size->left / 72.0; -+ margins[1] = best_size->bottom / 72.0; -+ margins[2] = (best_size->width - best_size->right) / 72.0; -+ margins[3] = (best_size->length - best_size->top) / 72.0; - if (xflip == 1) - { -- swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; -+ swap = margins[0]; margins[0] = margins[2]; margins[2] = swap; - } - if (yflip == 1) - { -- swap = margins[0]; margins[0] = margins[2]; margins[2] = swap; -+ swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; - } - #ifdef CUPS_RASTER_SYNCv1 - } -@@ -3894,40 +3721,163 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - else - { - /* -- * Custom size... -+ * No matching portrait size; look for a matching size in -+ * landscape orientation... - */ - -+ best_score = -1; -+ best_size = NULL; -+ for (i = cups->PPD->num_sizes, size = cups->PPD->sizes; -+ i > 0; -+ i --, size ++) -+ { -+ if (size->length == 0 || size->width == 0) continue; -+ -+ score = 0; -+ size_matched = 0; -+ margins_matched = 0; -+ imageable_area_matched = 0; - #ifdef CUPS_DEBUG -- dmprintf(pdev->memory, "DEBUG: size = Custom\n"); --#endif /* CUPS_DEBUG */ -+ name_requested_matched = 0; -+#endif - --#ifdef CUPS_RASTER_SYNCv1 -- snprintf(cups->header.cupsPageSizeName, -- sizeof(cups->header.cupsPageSizeName), -- "Custom.%.2fx%.2f", -- cups->MediaSize[0], cups->MediaSize[1]); -+ long_edge_mismatch = -+ fabs(cups->MediaSize[0] - size->length)/size->length + -+ LONG_EDGE_LENGTH_MATCH_LIMIT / 100; -+ short_edge_mismatch = -+ fabs(cups->MediaSize[1] - size->width)/size->width + -+ SHORT_EDGE_LENGTH_MATCH_LIMIT / 100; -+ if (size->length < size->width) -+ { -+ swap = long_edge_mismatch; -+ long_edge_mismatch = short_edge_mismatch; -+ short_edge_mismatch = swap; -+ } -+ -+ if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT && -+ short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT) -+ { -+ size_matched = 1; -+ /* If two sizes match within the limits, take the one with less -+ mismatch */ -+ score = (long)(9999.0 - -+ long_edge_mismatch * short_edge_mismatch * 9999.0 / -+ LONG_EDGE_LENGTH_MATCH_LIMIT / -+ SHORT_EDGE_LENGTH_MATCH_LIMIT); -+ if (score < 0) score = 0; -+ /* We check whether all 4 margins match with the margin info -+ of the page size in the PPD. Here we check also for swapped -+ left/right and top/bottom margins as the cups->HWMargins -+ info can be from the previous page and there the margins -+ can be swapped due to duplex printing requirements */ -+ if (!margins_set || -+ (((fabs(cups->HWMargins[1] - size->left) < 1.0 && -+ fabs(cups->HWMargins[3] - size->width + size->right) < 1.0)|| -+ (fabs(cups->HWMargins[1] - size->width + size->right) < 1.0 && -+ fabs(cups->HWMargins[3] - size->left) < 1.0)) && -+ ((fabs(cups->HWMargins[0] - size->bottom) < 1.0 && -+ fabs(cups->HWMargins[2] - size->length + size->top) < 1.0) || -+ (fabs(cups->HWMargins[0] - size->length + size->top) < 1.0 && -+ fabs(cups->HWMargins[2] - size->bottom) < 1.0)))) -+ margins_matched = 1; -+ } else { -+ /* Compare the dimensions of the imageable area against the -+ the input page size */ -+ long_edge_mismatch = -+ fabs(cups->MediaSize[0] - size->top + size->bottom)/size->length + -+ LONG_EDGE_LENGTH_MATCH_LIMIT / 100; -+ short_edge_mismatch = -+ fabs(cups->MediaSize[1] - size->right + size->left)/size->width + -+ SHORT_EDGE_LENGTH_MATCH_LIMIT / 100; -+ if (size->length < size->width) -+ { -+ swap = long_edge_mismatch; -+ long_edge_mismatch = short_edge_mismatch; -+ short_edge_mismatch = swap; -+ } -+ -+ if (long_edge_mismatch < LONG_EDGE_LENGTH_MATCH_LIMIT && -+ short_edge_mismatch < SHORT_EDGE_LENGTH_MATCH_LIMIT) -+ { -+ imageable_area_matched = 1; -+ /* If two sizes match within the limits, take the one with less -+ mismatch */ -+ score = (long)(4999.0 - -+ long_edge_mismatch * short_edge_mismatch * 4999.0 / -+ LONG_EDGE_LENGTH_MATCH_LIMIT / -+ SHORT_EDGE_LENGTH_MATCH_LIMIT); -+ if (score < 0) score = 0; -+ } -+ } -+ -+ if (margins_matched) -+ score += PAGESIZE_SCORE_SIZE_MARGINS * 10000; -+ else if (size_matched) -+ score += PAGESIZE_SCORE_SIZE * 10000; -+ -+ if (size_matched || imageable_area_matched) { -+ if (!strcasecmp(cups->pageSizeRequested, size->name)) -+ { -+#ifdef CUPS_DEBUG -+ name_requested_matched = 1; - #endif -+ } -+ else -+ score -= 1000; -+ } -+ -+ if (score > best_score) -+ { -+ best_score = score; -+ if (score > 0) -+ best_size = size; -+ } -+#ifdef CUPS_DEBUG -+ dmprintf1(pdev->memory, "DEBUG2: Checking against PPD page size (landscape): %s\n", -+ size->name); -+ dmprintf2(pdev->memory, "DEBUG2: Width: %.2f; Height: %.2f\n", -+ size->width, size->length); -+ dmprintf4(pdev->memory, "DEBUG2: Margins: Left: %.2f; Right: %.2f; Top: %.2f; Bottom: %.2f\n", -+ size->left, size->right, size->top, size->bottom); -+ dmprintf4(pdev->memory, "DEBUG2: Size mismatch: Long Edge (%.3f): %.5f; Short Edge (%.3f): %.5f\n", -+ LONG_EDGE_LENGTH_MATCH_LIMIT, long_edge_mismatch, -+ SHORT_EDGE_LENGTH_MATCH_LIMIT, short_edge_mismatch); -+ dmprintf4(pdev->memory, "DEBUG2: Match: Size: %d; Margins: %d; Imageable Area: %d; Name requested: %d\n", -+ size_matched, margins_matched, imageable_area_matched, -+ name_requested_matched); -+ dmprintf2(pdev->memory, "DEBUG2: Score: %ld; Best Score: %ld\n", -+ score, best_score); -+#endif /* CUPS_DEBUG */ -+ } -+ -+ if (best_size) -+ { -+ /* -+ * Standard size in landscape orientation... -+ */ -+ -+#ifdef CUPS_DEBUG -+ dmprintf1(pdev->memory, "DEBUG: landscape size = %s\n", best_size->name); -+#endif /* CUPS_DEBUG */ - -- /* Rotate page if it only fits into the printer's dimensions -- when rotated */ -- if (((cups->MediaSize[0] > cups->PPD->custom_max[0]) || -- (cups->MediaSize[1] > cups->PPD->custom_max[1])) && -- ((cups->MediaSize[0] <= cups->PPD->custom_max[1]) && -- (cups->MediaSize[1] <= cups->PPD->custom_max[0]))) { -- /* Rotate */ -- mediasize[0] = cups->MediaSize[1]; -- mediasize[1] = cups->MediaSize[0]; -+ mediasize[0] = best_size->length; -+ mediasize[1] = best_size->width; - - cups->landscape = 1; - - #ifdef CUPS_RASTER_SYNCv1 -+ strncpy(cups->header.cupsPageSizeName, best_size->name, -+ sizeof(cups->header.cupsPageSizeName)); -+ cups->header.cupsPageSizeName[sizeof(cups->header.cupsPageSizeName) - 1] = -+ '\0'; -+ - if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0) - { - #endif -- margins[0] = cups->PPD->custom_margins[3] / 72.0; -- margins[1] = cups->PPD->custom_margins[0] / 72.0; -- margins[2] = cups->PPD->custom_margins[1] / 72.0; -- margins[3] = cups->PPD->custom_margins[2] / 72.0; -+ margins[0] = (best_size->length - best_size->top) / 72.0; -+ margins[1] = best_size->left / 72.0; -+ margins[2] = best_size->bottom / 72.0; -+ margins[3] = (best_size->width - best_size->right) / 72.0; - if (xflip == 1) - { - swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; -@@ -3947,39 +3897,97 @@ cups_put_params(gx_device *pdev, /* I - Device info */ - } - #endif - } -- else -- { -- /* Do not rotate */ -- mediasize[0] = cups->MediaSize[0]; -- mediasize[1] = cups->MediaSize[1]; -+ } -+ } - -- cups->landscape = 0; -+ if (!best_size) -+ { -+ /* -+ * Custom size... -+ */ -+ -+#ifdef CUPS_DEBUG -+ dmprintf(pdev->memory, "DEBUG: size = Custom\n"); -+#endif /* CUPS_DEBUG */ - - #ifdef CUPS_RASTER_SYNCv1 -- if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0) -- { -+ snprintf(cups->header.cupsPageSizeName, -+ sizeof(cups->header.cupsPageSizeName), -+ "Custom.%.2fx%.2f", -+ cups->MediaSize[0], cups->MediaSize[1]); - #endif -- for (i = 0; i < 4; i ++) -- margins[i] = cups->PPD->custom_margins[i] / 72.0; -- if (xflip == 1) -- { -- swap = margins[0]; margins[0] = margins[2]; margins[2] = swap; -- } -- if (yflip == 1) -- { -- swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; -- } -+ -+ /* Rotate page if it only fits into the printer's dimensions -+ when rotated */ -+ if (((cups->MediaSize[0] > cups->PPD->custom_max[0]) || -+ (cups->MediaSize[1] > cups->PPD->custom_max[1])) && -+ ((cups->MediaSize[0] <= cups->PPD->custom_max[1]) && -+ (cups->MediaSize[1] <= cups->PPD->custom_max[0]))) { -+ /* Rotate */ -+ mediasize[0] = cups->MediaSize[1]; -+ mediasize[1] = cups->MediaSize[0]; -+ -+ cups->landscape = 1; -+ - #ifdef CUPS_RASTER_SYNCv1 -+ if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0) -+ { -+#endif -+ margins[0] = cups->PPD->custom_margins[3] / 72.0; -+ margins[1] = cups->PPD->custom_margins[0] / 72.0; -+ margins[2] = cups->PPD->custom_margins[1] / 72.0; -+ margins[3] = cups->PPD->custom_margins[2] / 72.0; -+ if (xflip == 1) -+ { -+ swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; - } -- else -+ if (yflip == 1) - { -- margins[0] = 0.0; -- margins[1] = 0.0; -- margins[2] = 0.0; -- margins[3] = 0.0; -+ swap = margins[0]; margins[0] = margins[2]; margins[2] = swap; - } -+#ifdef CUPS_RASTER_SYNCv1 -+ } -+ else -+ { -+ margins[0] = 0.0; -+ margins[1] = 0.0; -+ margins[2] = 0.0; -+ margins[3] = 0.0; -+ } -+#endif -+ } -+ else -+ { -+ /* Do not rotate */ -+ mediasize[0] = cups->MediaSize[0]; -+ mediasize[1] = cups->MediaSize[1]; -+ -+ cups->landscape = 0; -+ -+#ifdef CUPS_RASTER_SYNCv1 -+ if (strcasecmp(cups->header.MediaClass, "PwgRaster") != 0) -+ { - #endif -+ for (i = 0; i < 4; i ++) -+ margins[i] = cups->PPD->custom_margins[i] / 72.0; -+ if (xflip == 1) -+ { -+ swap = margins[0]; margins[0] = margins[2]; margins[2] = swap; -+ } -+ if (yflip == 1) -+ { -+ swap = margins[1]; margins[1] = margins[3]; margins[3] = swap; -+ } -+#ifdef CUPS_RASTER_SYNCv1 - } -+ else -+ { -+ margins[0] = 0.0; -+ margins[1] = 0.0; -+ margins[2] = 0.0; -+ margins[3] = 0.0; -+ } -+#endif - } - } - --- -2.37.3 - diff --git a/ghostscript-10.0.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch b/ghostscript-10.0.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch deleted file mode 100644 index 180193a..0000000 --- a/ghostscript-10.0.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 0b74b65ecc0f36d40b8d04a7fa1fa8b5f9d2b3ff Mon Sep 17 00:00:00 2001 -From: Chris Liddell -Date: Thu, 13 Oct 2022 14:55:28 +0100 -Subject: [PATCH] Deal with different VM modes during CIDFont loading - -To help differentiate between a substituted CIDFont and an embedded one, a -change was made to store the file path in the CIDFont dictionary. That change -failed to account for the possibility that the file object and the CIDFont -dictionary may not be in compatible VM modes. - -This adds code to ensure that the string holding the path is in a suitable VM -mode to be stored into the dictionary. - -Reported by Richard Lescak ---- - Resource/Init/gs_cidfn.ps | 23 +++++++++++++++++++---- - 1 file changed, 19 insertions(+), 4 deletions(-) - -diff --git a/Resource/Init/gs_cidfn.ps b/Resource/Init/gs_cidfn.ps -index 870a2e11c..fa050ed7a 100644 ---- a/Resource/Init/gs_cidfn.ps -+++ b/Resource/Init/gs_cidfn.ps -@@ -1,4 +1,4 @@ --% Copyright (C) 2001-2021 Artifex Software, Inc. -+% Copyright (C) 2001-2022 Artifex Software, Inc. - % All Rights Reserved. - % - % This software is provided AS-IS with no warranty, either express or -@@ -36,6 +36,17 @@ - - 30 dict begin - -+/.gcompatstringcopy % .gcompatstringcopy -+{ -+ dup 2 index gcheck eq -+ { pop } -+ { -+ currentglobal 3 1 roll setglobal -+ dup length string copy -+ exch setglobal -+ } ifelse -+} bind def -+ - % The key in .cidfonttypes is the CIDFontType value; - % the value is a procedure that takes a font name and the CIDFont dictionary - % and replaces the latter with a real font. -@@ -58,7 +69,7 @@ dup 0 { - end - } if - 1 index exch .buildfont9 -- .currentresourcefile dup type /filetype eq { //.filename {1 index exch /ResourcePath exch put} if }{ pop} ifelse -+ .currentresourcefile dup type /filetype eq { //.filename {1 index gcheck //.gcompatstringcopy exec 1 index exch /ResourcePath exch put} if }{ pop} ifelse - exch pop - } put % Don't bind it here, because gs_fapi.ps redefines .buildfont9 - -@@ -138,10 +149,11 @@ dup 0 { - - % ------ CIDFontType 1 (FontType 10) ------ % - -+ - dup 1 { - 10 //.checkfonttype exec pop - 1 index exch .buildfont10 -- .currentresourcefile dup type /filetype eq { //.filename {1 index exch /ResourcePath exch put} if }{ pop} ifelse -+ .currentresourcefile dup type /filetype eq { //.filename {1 index gcheck //.gcompatstringcopy exec 1 index exch /ResourcePath exch put} if }{ pop} ifelse - exch pop - } put % Don't bind it here because gs_fapi.ps redefines .buildfont10 - -@@ -150,12 +162,15 @@ dup 1 { - dup 2 { - 11 //.checkfonttype exec pop - 1 index exch .buildfont11 -- .currentresourcefile dup type /filetype eq { //.filename {1 index exch /ResourcePath exch put} if }{ pop} ifelse -+ .currentresourcefile dup type /filetype eq { //.filename {1 index gcheck //.gcompatstringcopy exec 1 index exch /ResourcePath exch put} if }{ pop} ifelse - exch pop - } put % Don't bind it here because gs_fapi.ps redefines .buildfont11 - -+currentdict /.gcompatstringcopy .undef -+ - pop % .cidfonttypes - -+ - % ---------------- Reading CIDFontType 0 files ---------------- % - - /StartData { % <(Binary)|(Hex)> StartData - --- -2.37.3 - diff --git a/ghostscript-10.0.0-Fix-color-info-juggling-with-x11-devices.patch b/ghostscript-10.0.0-Fix-color-info-juggling-with-x11-devices.patch deleted file mode 100644 index 1d70726..0000000 --- a/ghostscript-10.0.0-Fix-color-info-juggling-with-x11-devices.patch +++ /dev/null @@ -1,78 +0,0 @@ -From a3768a91418925a5eb5cf268222f1e90e1abc396 Mon Sep 17 00:00:00 2001 -Message-Id: -From: Chris Liddell -Date: Mon, 3 Oct 2022 16:17:56 +0100 -Subject: [PATCH] Bug 705863: Fix color info juggling with x11 devices - -For the "wrapped" X11 devices (x11cmyk, x11gray2, x11gray4 etc) we have to -juggle the color info between the wrapping device and the wrapped device so that -the put/get_params continue to work properly, and not cause bad rendering and -segfaults. - -The "wrapped" x11 device initialises with 24bit RGB color setup, and doesn't get -updated to match the actual display until the device is opened. - -The problem was, if it was not talking to a 24bit RGB X display, the stashed -color_info did not match the actual color_info of the actual device, and -resulted in segfaults when using wrapped devices on those non 24bit RGB -displays. - -This just ensures the stashed color_info gets updated after those devices config -changes take place. - -Also reverts "Bug 703013: Fix color_info for buffered/wrapped X11 devices" -commit: 270438bfda605c258f5841e7917a16fdc2cf7968. - -Signed-off-by: Michael J Gruber ---- - devices/gdevxcmp.c | 4 ++-- - devices/gdevxini.c | 6 +++--- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/devices/gdevxcmp.c b/devices/gdevxcmp.c -index c43426d76..55051763b 100644 ---- a/devices/gdevxcmp.c -+++ b/devices/gdevxcmp.c -@@ -1,4 +1,4 @@ --/* Copyright (C) 2001-2021 Artifex Software, Inc. -+/* Copyright (C) 2001-2022 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or -@@ -477,7 +477,7 @@ monochrome: - } - } - #endif -- -+ xdev->orig_color_info = xdev->color_info; - return 0; - } - -diff --git a/devices/gdevxini.c b/devices/gdevxini.c -index fafcd42a8..914e88e78 100644 ---- a/devices/gdevxini.c -+++ b/devices/gdevxini.c -@@ -589,9 +589,9 @@ x_set_buffer(gx_device_X * xdev) - * *But* if we run buffered, we have to use the real specs of the real x11 device. - * Hence, the real color_info is saved into orig_color_info, and we use that here. - */ -- if (mdev == 0 || mdev->color_info.depth != xdev->color_info.depth) { -+ if (mdev == 0 || mdev->color_info.depth != xdev->orig_color_info.depth) { - const gx_device_memory *mdproto = -- gdev_mem_device_for_bits(xdev->color_info.depth); -+ gdev_mem_device_for_bits(xdev->orig_color_info.depth); - - if (!mdproto) { - buffered = false; -@@ -643,7 +643,7 @@ x_set_buffer(gx_device_X * xdev) - rc_decrement(mdev->icc_struct, "x_set_buffer"); - mdev->icc_struct = xdev->icc_struct; - rc_increment(xdev->icc_struct); -- mdev->color_info = xdev->color_info; -+ mdev->color_info = xdev->orig_color_info; - mdev->base = xdev->buffer; - gdev_mem_open_scan_lines(mdev, xdev->height); - } --- -2.38.0.420.gc7a4235b32 - diff --git a/ghostscript-10.01.0-CVE-2023-28879.patch b/ghostscript-10.01.0-CVE-2023-28879.patch deleted file mode 100644 index 0629e99..0000000 --- a/ghostscript-10.01.0-CVE-2023-28879.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 37ed5022cecd584de868933b5b60da2e995b3179 Mon Sep 17 00:00:00 2001 -From: Ken Sharp -Date: Fri, 24 Mar 2023 13:19:57 +0000 -Subject: [PATCH] Graphics library - prevent buffer overrun in (T)BCP encoding - -Bug #706494 "Buffer Overflow in s_xBCPE_process" - -As described in detail in the bug report, if the write buffer is filled -to one byte less than full, and we then try to write an escaped -character, we overrun the buffer because we don't check before -writing two bytes to it. - -This just checks if we have two bytes before starting to write an -escaped character and exits if we don't (replacing the consumed byte -of the input). - -Up for further discussion; why do we even permit a BCP encoding filter -anyway ? I think we should remove this, at least when SAFER is true. ---- - base/sbcp.c | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/base/sbcp.c b/base/sbcp.c -index 979ae0992..47fc233ec 100644 ---- a/base/sbcp.c -+++ b/base/sbcp.c -@@ -50,6 +50,14 @@ s_xBCPE_process(stream_state * st, stream_cursor_read * pr, - byte ch = *++p; - - if (ch <= 31 && escaped[ch]) { -+ /* Make sure we have space to store two characters in the write buffer, -+ * if we don't then exit without consuming the input character, we'll process -+ * that on the next time round. -+ */ -+ if (pw->limit - q < 2) { -+ p--; -+ break; -+ } - if (p == rlimit) { - p--; - break; --- -2.39.2 - diff --git a/ghostscript.spec b/ghostscript.spec index f691e6e..840f9f7 100644 --- a/ghostscript.spec +++ b/ghostscript.spec @@ -44,8 +44,8 @@ Name: ghostscript Summary: Interpreter for PostScript language & PDF -Version: 10.01.0 -Release: 3%{?dist} +Version: 10.01.2 +Release: 1%{?dist} License: AGPL-3.0-or-later @@ -108,7 +108,6 @@ BuildRequires: make Patch001: ghostscript-10.01.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch Patch002: ghostscript-10.01.0-convert-defaultpage-to-lowercase.patch -Patch003: ghostscript-10.01.0-CVE-2023-28879.patch # Downstream patches -- these should be always included when doing rebase: @@ -423,6 +422,10 @@ done # ============================================================================= %changelog +* Fri Jul 14 2023 Michael J Gruber - 10.01.2-1 +- rebase to bugfix release 10.01.2 (rhbz#2182090) +- fix for CVE-2023-36664 (rhbz#2217806) + * Thu Apr 06 2023 Richard Lescak - 10.01.0-3 - fix for CVE-2023-28879 (#2184586) - add patch for converting default page name to lowercase (#2183166) diff --git a/sources b/sources index 8ef3f14..90e23ef 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (ghostscript-10.01.0.tar.xz) = b679b35bcdcf211d6aa41a571225a50449e7e36def75cf37fee8f06889df3a5a9726a7aef2fd5ae819c2071cb6fcf8712741cd2c131c9341b60936e684bd8d98 +SHA512 (ghostscript-10.01.2.tar.xz) = ee20f0e12f553a3d04578e71a0d45defebc71117ce4dc2c14043985bfe7348ad7f8b2fe98fc9b4f5b935ecb32e50dc340be67d6ef58190542ec6d0f9da1de380