Do not clear `s->prev_valid` if kite_deflate_tally() doesn't fit.

Reproducible input (base64-encoded gzipped blob):

H4sICJKM22gCA3R4AJyUR67cMAyG9zlFLqBRelunJ3cQVGibeLJkiNS00wd2ejwPILOb8n9i
/zFaaK3Uw/TQdmoWS8w9gfU0mxEKtJ8CEzzBYXrwl4o4RbM0SDAcpje7/7Dufj2/euFePDMZ
Sz+bsXQbkMlmDNFM4BM0Q+wb77gBPPcGdO8fhnGGF8+EAU+1JcIrCOXr2zI5XcjGBANJK69l
NKn2kAWPbwG4B1JIzR89yRjsGONe/fjpn2NLMGgR30ZpKy8LkEaLV7l+WwHN49a5YankWAnN
gdgzrJw62Itnauz9p6/vVIgaIG49sj5QrPUOwWF1Qy+RsRZ5MzeHcBlnoX7I1XNRiU2s81yL
JqFbRpYxSI3FIw/Zj6TQr6vUSeQt+vOxMdd451jPYFJS6/npEWiqhSlssNzYAigJvXTQoBcX
IGnfw4WBTn4Ryvtaj8EEhZEvsjUgyBBlbduJRXaAIwGrfWqHKaxnXYWjz/+L0gJRyC48NfBJ
dUobYWjyDZLZkcJgxrc4CTnPdcboTpjAxdoLQxORv5oyd4azDmmn9e53jM+5Ri9+anVLEwjW
YnXQ5tk3/LdhGVV7seabQb2+e+zPFL57+uFgYy0DbglBqwO5f78nCH0U2jnOsFNCa6UKU7+t
3UTSdzzN90i/DbkTgFBBuJsAUgYAYaNhPVkMAAA=

Test command line: ./kite-deflate foo 512 9

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 lib/kite_deflate.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/lib/kite_deflate.c b/lib/kite_deflate.c
index 1b273a4..f9eb3fb 100644
--- a/lib/kite_deflate.c
+++ b/lib/kite_deflate.c
@@ -1111,7 +1111,7 @@ nomatch:
 static bool kite_deflate_slow(struct kite_deflate *s)
 {
        struct kite_matchfinder *mf = s->mf;
-       bool flush = false;
+       bool flush = false, eos = false;
 
        kite_deflate_startblock(s);
        while (1) {
@@ -1163,20 +1163,20 @@ static bool kite_deflate_slow(struct kite_deflate *s)
                        s->prev_longest = matches;
                }
 
-               s->lastblock |= (s->pos_in >= s->inlen);
-               if (s->pos_in >= s->inlen) {
+               eos = (s->pos_in >= s->inlen);
+               if (eos || s->symbols >= s->max_symbols) {
+                       s->lastblock |= eos;
                        flush = true;
                        break;
                }
-               if (s->symbols >= s->max_symbols) {
-                       kite_deflate_endblock(s);
-                       break;
-               }
        }
 
-       if (flush && s->prev_valid) {
-               (void)kite_deflate_tally(s, mf->matches + s->prev_longest);
-               s->prev_valid = false;
+       if (flush) {
+               if (eos && s->prev_valid) {
+                       if (!kite_deflate_tally(s, mf->matches + 
s->prev_longest))
+                               s->prev_valid = false;
+               }
+               kite_deflate_endblock(s);
        }
        return kite_deflate_commitblock(s);
 }
-- 
2.43.5


Reply via email to