From 7ac80cebf396caf9589a514f758b85455f9a96ec Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 18 Aug 2022 06:00:46 +0200 Subject: [PATCH] zlib/deflate decompression, bugfix (#5723) zlib, bugfix --- src/zlib/zcl_abapgit_zlib.clas.abap | 8 +++++--- src/zlib/zcl_abapgit_zlib_stream.clas.abap | 20 ++++++++++++------- ..._abapgit_zlib_stream.clas.testclasses.abap | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/zlib/zcl_abapgit_zlib.clas.abap b/src/zlib/zcl_abapgit_zlib.clas.abap index d90167582..6c9808258 100644 --- a/src/zlib/zcl_abapgit_zlib.clas.abap +++ b/src/zlib/zcl_abapgit_zlib.clas.abap @@ -153,7 +153,6 @@ CLASS ZCL_ABAPGIT_ZLIB IMPLEMENTATION. CASE lv_btype. WHEN '00'. not_compressed( ). - EXIT. WHEN '01'. fixed( ). decode_loop( ). @@ -446,13 +445,16 @@ CLASS ZCL_ABAPGIT_ZLIB IMPLEMENTATION. DATA: lv_len TYPE i, lv_nlen TYPE i ##NEEDED. + DATA lv_bytes TYPE xstring. - go_stream->take_bits( 5 ). +* skip any remaining bits in current partially processed byte + go_stream->clear_bits( ). lv_len = go_stream->take_int( 16 ). lv_nlen = go_stream->take_int( 16 ). - gv_out = go_stream->take_bytes( lv_len ). + lv_bytes = go_stream->take_bytes( lv_len ). + CONCATENATE gv_out lv_bytes INTO gv_out IN BYTE MODE. ENDMETHOD. diff --git a/src/zlib/zcl_abapgit_zlib_stream.clas.abap b/src/zlib/zcl_abapgit_zlib_stream.clas.abap index b65d7b8e7..8f9d73c87 100644 --- a/src/zlib/zcl_abapgit_zlib_stream.clas.abap +++ b/src/zlib/zcl_abapgit_zlib_stream.clas.abap @@ -23,23 +23,29 @@ CLASS zcl_abapgit_zlib_stream DEFINITION "! Take bytes, there's an implicit realignment to start at the beginning of a byte "! i.e. if next bit of current byte is not the first bit, then this byte is skipped "! and the bytes are taken from the next one. - "! @parameter iv_length |

Number of BYTES to read (not bits)

- "! @parameter rv_bytes |

Bytes taken

+ "! @parameter iv_length |

+ "! @parameter rv_bytes |

METHODS take_bytes IMPORTING - iv_length TYPE i + !iv_length TYPE i RETURNING - VALUE(rv_bytes) TYPE xstring. + VALUE(rv_bytes) TYPE xstring . + METHODS clear_bits . PROTECTED SECTION. PRIVATE SECTION. - DATA: mv_compressed TYPE xstring, - mv_bits TYPE string. + DATA mv_bits TYPE string . + DATA mv_compressed TYPE xstring . ENDCLASS. -CLASS zcl_abapgit_zlib_stream IMPLEMENTATION. +CLASS ZCL_ABAPGIT_ZLIB_STREAM IMPLEMENTATION. + + + METHOD clear_bits. + CLEAR mv_bits. + ENDMETHOD. METHOD constructor. diff --git a/src/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap b/src/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap index a4babe7e8..288723d4a 100644 --- a/src/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap +++ b/src/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap @@ -4,7 +4,7 @@ CLASS ltcl_test DEFINITION FOR TESTING RISK LEVEL HARMLESS FINAL. PRIVATE SECTION. - METHODS: test FOR TESTING. + METHODS test FOR TESTING. ENDCLASS.