Blame SOURCES/ghostscript-cve-2020-16291.patch

8d372f
diff --git a/contrib/gdevdj9.c b/contrib/gdevdj9.c
8d372f
index eec1c77..a4e8e9c 100644
8d372f
--- a/contrib/gdevdj9.c
8d372f
+++ b/contrib/gdevdj9.c
8d372f
@@ -575,26 +575,55 @@ static int cdj_set_bpp(gx_device *, int, int);
8d372f
 static int
8d372f
 hp_colour_open(gx_device * pdev)
8d372f
 {
8d372f
-    int retCode;
8d372f
+    int retCode = 0;
8d372f
+
8d372f
+    /* Change the margins if necessary. */
8d372f
+    static const float dj_a4[4] = {
8d372f
+        DESKJET_MARGINS_A4
8d372f
+    };
8d372f
+
8d372f
+    static const float dj_letter[4] = {
8d372f
+        DESKJET_MARGINS_LETTER
8d372f
+    };
8d372f
+    const float *m = (float *)0;
8d372f
 
8d372f
     cdj970->PageCtr = 0;
8d372f
 
8d372f
+    /* quality setup */
8d372f
+    if (cdj970->quality == DRAFT) {
8d372f
+        gx_device_set_resolution((gx_device *) pdev, 300.0, 300.0);
8d372f
+        cdj970->xscal = 0;
8d372f
+        cdj970->yscal = 0;
8d372f
+        cdj970->intensities = 2;
8d372f
+    } else if (cdj970->quality == NORMAL) {
8d372f
+        gx_device_set_resolution((gx_device *) pdev, 600.0, 600.0);
8d372f
+        cdj970->xscal = 1;
8d372f
+        cdj970->yscal = 1;
8d372f
+        /* intensities = 4 from initialization */
8d372f
+    } else {                    /* quality == PRESENTATION */
8d372f
+        gx_device_set_resolution((gx_device *) pdev, 600.0, 600.0);
8d372f
+        cdj970->xscal = 0;
8d372f
+        cdj970->yscal = 0;
8d372f
+        /* intensities = 4 from initialization */
8d372f
+    }
8d372f
+
8d372f
+    m = (gdev_pcl_paper_size((gx_device *) pdev) ==
8d372f
+         PAPER_SIZE_A4 ? dj_a4 : dj_letter);
8d372f
+
8d372f
+    gx_device_set_margins((gx_device *) pdev, m, true);
8d372f
+
8d372f
     /* Set up colour params if put_params has not already done so */
8d372f
     if (pdev->color_info.num_components == 0) {
8d372f
-        int code = cdj_set_bpp(pdev, pdev->color_info.depth,
8d372f
+        retCode = cdj_set_bpp(pdev, pdev->color_info.depth,
8d372f
                                pdev->color_info.num_components);
8d372f
 
8d372f
-        if (code < 0)
8d372f
-            return code;
8d372f
+        if (retCode < 0)
8d372f
+            return retCode;
8d372f
     }
8d372f
 
8d372f
     retCode = gdev_prn_open(pdev);
8d372f
-    if (retCode < 0)
8d372f
-        return (retCode);
8d372f
-    else {
8d372f
+    if (retCode >= 0) {
8d372f
         retCode = gdev_prn_open_printer(pdev, true);
8d372f
-        if (retCode < 0)
8d372f
-            return (retCode);
8d372f
     }
8d372f
 
8d372f
     return 0;
8d372f
@@ -648,26 +677,25 @@ cdj970_put_params(gx_device * pdev, gs_param_list * plist)
8d372f
     int bpp = 0;
8d372f
     int code = 0;
8d372f
 
8d372f
-    code = cdj_put_param_int(plist, "BitsPerPixel", &bpp, 1, 32, code);
8d372f
-    code = cdj_put_param_int(plist, "Quality", &quality, 0, 2, code);
8d372f
-    code = cdj_put_param_int(plist, "Papertype", &papertype, 0, 4, code);
8d372f
-    code = cdj_put_param_int(plist, "Duplex", &duplex, 0, 2, code);
8d372f
-    code =
8d372f
-        cdj_put_param_float(plist, "MasterGamma", &mastergamma, 0.1, 9.0,
8d372f
-                            code);
8d372f
-    code =
8d372f
-        cdj_put_param_float(plist, "GammaValC", &gammavalc, 0.0, 9.0, code);
8d372f
-    code =
8d372f
-        cdj_put_param_float(plist, "GammaValM", &gammavalm, 0.0, 9.0, code);
8d372f
-    code =
8d372f
-        cdj_put_param_float(plist, "GammaValY", &gammavaly, 0.0, 9.0, code);
8d372f
-    code =
8d372f
-        cdj_put_param_float(plist, "GammaValK", &gammavalk, 0.0, 9.0, code);
8d372f
-    code =
8d372f
-        cdj_put_param_float(plist, "BlackCorrect", &blackcorrect, 0.0, 9.0,
8d372f
-                            code);
8d372f
-
8d372f
-    if (code < 0)
8d372f
+    if ((code = cdj_put_param_int(plist, "BitsPerPixel", &bpp, 1, 32, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_int(plist, "Quality", &quality, 0, 2, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_int(plist, "Papertype", &papertype, 0, 4, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_int(plist, "Duplex", &duplex, 0, 2, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_float(plist, "MasterGamma", &mastergamma, 0.1, 9.0, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_float(plist, "GammaValC", &gammavalc, 0.0, 9.0, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_float(plist, "GammaValM", &gammavalm, 0.0, 9.0, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_float(plist, "GammaValY", &gammavaly, 0.0, 9.0, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_float(plist, "GammaValK", &gammavalk, 0.0, 9.0, code)) < 0)
8d372f
+        return code;
8d372f
+    if ((code = cdj_put_param_float(plist, "BlackCorrect", &blackcorrect, 0.0, 9.0, code)) < 0)
8d372f
         return code;
8d372f
 
8d372f
     code = cdj_put_param_bpp(pdev, plist, bpp, bpp, 0);
8d372f
@@ -676,6 +704,12 @@ cdj970_put_params(gx_device * pdev, gs_param_list * plist)
8d372f
         return code;
8d372f
 
8d372f
     cdj970->quality = quality;
8d372f
+    if (cdj970->quality != quality) {
8d372f
+        if (pdev->is_open)
8d372f
+            gs_closedevice(pdev);      /* quality can change resolution, force re-open */
8d372f
+        cdj970->quality = quality;
8d372f
+    }
8d372f
+
8d372f
     cdj970->papertype = papertype;
8d372f
     cdj970->duplex = duplex;
8d372f
     cdj970->mastergamma = mastergamma;
8d372f
@@ -685,7 +719,7 @@ cdj970_put_params(gx_device * pdev, gs_param_list * plist)
8d372f
     cdj970->gammavalk = gammavalk;
8d372f
     cdj970->blackcorrect = blackcorrect;
8d372f
 
8d372f
-    return 0;
8d372f
+    return code;
8d372f
 }
8d372f
 
8d372f
 /**********************************************************************************/
8d372f
@@ -784,47 +818,6 @@ cdj970_terminate_page(gx_device_printer * pdev, FILE * prn_stream)
8d372f
     fputs("\033*rC\f\033&l-2H", prn_stream);    /* End Graphics, Reset */
8d372f
 }
8d372f
 
8d372f
-/* cdj970_one_time_initialisation:
8d372f
-----------------------------------------------------------------------------------*/
8d372f
-static void
8d372f
-cdj970_one_time_initialisation(gx_device_printer * pdev)
8d372f
-{
8d372f
-    /* Change the margins if necessary. */
8d372f
-    static const float dj_a4[4] = {
8d372f
-        DESKJET_MARGINS_A4
8d372f
-    };
8d372f
-
8d372f
-    static const float dj_letter[4] = {
8d372f
-        DESKJET_MARGINS_LETTER
8d372f
-    };
8d372f
-    const float *m = (float *)0;
8d372f
-
8d372f
-    /* quality setup */
8d372f
-    if (cdj970->quality == DRAFT) {
8d372f
-        gx_device_set_resolution((gx_device *) pdev, 300.0, 300.0);
8d372f
-        cdj970->xscal = 0;
8d372f
-        cdj970->yscal = 0;
8d372f
-        cdj970->intensities = 2;
8d372f
-    } else if (cdj970->quality == NORMAL) {
8d372f
-        gx_device_set_resolution((gx_device *) pdev, 600.0, 600.0);
8d372f
-        cdj970->xscal = 1;
8d372f
-        cdj970->yscal = 1;
8d372f
-        /* intensities = 4 from initialization */
8d372f
-    } else {                    /* quality == PRESENTATION */
8d372f
-        gx_device_set_resolution((gx_device *) pdev, 600.0, 600.0);
8d372f
-        cdj970->xscal = 0;
8d372f
-        cdj970->yscal = 0;
8d372f
-        /* intensities = 4 from initialization */
8d372f
-    }
8d372f
-
8d372f
-    m = (gdev_pcl_paper_size((gx_device *) pdev) ==
8d372f
-         PAPER_SIZE_A4 ? dj_a4 : dj_letter);
8d372f
-
8d372f
-    gx_device_set_margins((gx_device *) pdev, m, true);
8d372f
-
8d372f
-    cdj970_write_header((gx_device *) pdev, pdev->file);
8d372f
-}
8d372f
-
8d372f
 /* cdj970_print_page: Here comes the hp970 output routine
8d372f
 ----------------------------------------------------------------------------------*/
8d372f
 static int
8d372f
@@ -837,7 +830,7 @@ cdj970_print_page(gx_device_printer * pdev, FILE * prn_stream)
8d372f
     Gamma gamma;
8d372f
 
8d372f
     if (cdj970->PageCtr == 0 && cdj970->ptype == DJ970C) {
8d372f
-        cdj970_one_time_initialisation(pdev);
8d372f
+        cdj970_write_header((gx_device *)pdev, prn_stream);
8d372f
     }
8d372f
 
8d372f
     /* make a local writable copy of the Gamma tables */
8d372f
@@ -2280,6 +2273,11 @@ cdj_set_bpp(gx_device * pdev, int bpp, int ccomps)
8d372f
         ci->dither_colors = (bpp >= 8 ? 5 : bpp > 1 ? 2 : 0);
8d372f
     }
8d372f
 
8d372f
+    if (ci->depth != ((bpp > 1) && (bpp < 8) ? 8 : bpp)) {
8d372f
+        if (pdev->is_open)
8d372f
+            gs_closedevice(pdev);  /* depth changed, make sure we re-open */
8d372f
+    }
8d372f
+
8d372f
     ci->depth = ((bpp > 1) && (bpp < 8) ? 8 : bpp);
8d372f
 
8d372f
     return (0);
8d372f
@@ -2598,16 +2596,15 @@ cdj_put_param_bpp(gx_device * pdev,
8d372f
                   gs_param_list * plist,
8d372f
                   int new_bpp, int real_bpp, int ccomps)
8d372f
 {
8d372f
-    if (new_bpp == 0 && ccomps == 0)
8d372f
-        return gdev_prn_put_params(pdev, plist);
8d372f
-    else {
8d372f
-        gx_device_color_info save_info;
8d372f
-        int save_bpp;
8d372f
-        int code;
8d372f
-
8d372f
-        save_info = pdev->color_info;
8d372f
-        save_bpp = save_info.depth;
8d372f
+    int code = 0;
8d372f
+    int save_bpp;
8d372f
+    gx_device_color_info save_info;
8d372f
+    save_info = pdev->color_info;
8d372f
+    save_bpp = save_info.depth;
8d372f
 
8d372f
+    if (new_bpp == 0 && ccomps == 0) {
8d372f
+       code = gdev_prn_put_params(pdev, plist);
8d372f
+    } else {
8d372f
         if (save_bpp == 8 && save_ccomps == 3 && !cprn_device->cmyk)
8d372f
             save_bpp = 3;
8d372f
 
8d372f
@@ -2631,12 +2628,22 @@ cdj_put_param_bpp(gx_device * pdev,
8d372f
         if ((cdj970->color_info.depth != save_bpp
8d372f
              || (ccomps != 0 && ccomps != save_ccomps))
8d372f
             && pdev->is_open)
8d372f
-            return (gs_closedevice(pdev));
8d372f
+            gs_closedevice(pdev);
8d372f
+    }
8d372f
+
8d372f
+    /* check for valid resolutions */
8d372f
+    if (pdev->HWResolution[0] != pdev->HWResolution[1] ||
8d372f
+        (pdev->HWResolution[0] != 300.0 && pdev->HWResolution[0] != 600.0) ) {
8d372f
+        param_signal_error(plist, "HWResolution", gs_error_rangecheck);
8d372f
+        emprintf1(pdev->memory, "\ncdj970: Invalid resolution: '%f'. Only 300 or 600 supported.\n\n",
8d372f
+                  pdev->HWResolution[0]);
8d372f
+        cdj_set_bpp(pdev, save_bpp, save_ccomps);
8d372f
+        return gs_error_rangecheck;
8d372f
+    }
8d372f
+    return code;
8d372f
 
8d372f
-        return (0);
8d372f
 
8d372f
 #undef save_ccomps
8d372f
-    }
8d372f
 }
8d372f
 
8d372f
 /* cdj970_write_header: