[gs-commits] ghostpdl branch, master, updated. jbig2dec-0.14-1662-g68c7275

[email protected] (Robin Watts)
Newsgroups gmane.comp.printing.ghostscript.cvs
Message-ID <[email protected]>
The ghostpdl branch, master has been updated
       via  68c7275d4a580dca6c0ed3798f3717eea3513403 (commit)
      from  13a560a4d13d51e4dd9f7dd48b27a6ebe681f877 (commit)

----------------------------------------------------------------------
commit 68c7275d4a580dca6c0ed3798f3717eea3513403
Author: Robin Watts <[email protected]>
Date:   Thu Sep 12 09:35:01 2019 +0100

    Bug 701568: Fix gdevpx.c RLE stream handling.
    
    The current code in pclxl_write_image_data_RLE passes
    lines of data to the RLE compression routine. It tells
    each invocation of that routine that this is the "last"
    block of data, when clearly it is not.
    
    Accordingly, the compression routine inserts the "EOD" byte
    into the stream, and returns EOFC.
    
    Independently of the return value used, having multiple EOD
    bytes in the data is clearly wrong. Update the caller to only
    pass "last" in for the last block.
    
    The code still returns EOFC at the end of the data, so update
    this final call to accept (indeed, expect) that return value
    there.

diff --git a/devices/vector/gdevpx.c b/devices/vector/gdevpx.c
index 825e6b4..5d2d0ed 100644
--- a/devices/vector/gdevpx.c
+++ b/devices/vector/gdevpx.c
@@ -714,6 +714,7 @@ pclxl_write_image_data_RLE(gx_device_pclxl * xdev, const byte * base,
     uint num_bytes = ROUND_UP(width_bytes, 4) * height;
     bool compress = num_bytes >= 8;
     int i;
+    int code;
 
     /* cannot handle data_bit not multiple of 8, but we don't invoke this routine that way */
     int offset = data_bit >> 3;
@@ -752,19 +753,20 @@ pclxl_write_image_data_RLE(gx_device_pclxl * xdev, const byte * base,
             r.ptr = data + i * raster - 1;
             r.limit = r.ptr + width_bytes;
             if ((*s_RLE_template.process)
-                ((stream_state *) & rlstate, &r, &w, true) != 0 ||
+                ((stream_state *) & rlstate, &r, &w, false) != 0 ||
                 r.ptr != r.limit)
                 goto ncfree;
             r.ptr = (const byte *)"\000\000\000\000\000";
             r.limit = r.ptr + (-(int)width_bytes & 3);
             if ((*s_RLE_template.process)
-                ((stream_state *) & rlstate, &r, &w, true) != 0 ||
+                ((stream_state *) & rlstate, &r, &w, false) != 0 ||
                 r.ptr != r.limit)
                 goto ncfree;
         }
         r.ptr = r.limit;
-        if ((*s_RLE_template.process)
-            ((stream_state *) & rlstate, &r, &w, true) != 0)
+        code = (*s_RLE_template.process)
+            ((stream_state *) & rlstate, &r, &w, true);
+        if (code != EOFC && code != 0)
             goto ncfree;
         {
             uint count = w.ptr + 1 - buf;


Summary of changes:
 devices/vector/gdevpx.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.