]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-compression: istream-decompress - Fix handling of partial header reception
authorStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 13 Nov 2023 15:34:23 +0000 (16:34 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 24 Feb 2026 08:36:15 +0000 (08:36 +0000)
src/lib-compression/istream-decompress.c

index 2021a014f5fdd256f60b127d4a6913451757d051..93d09665dafd903520d9b4c1a47ccafeb9fec625 100644 (file)
@@ -76,7 +76,7 @@ i_stream_decompress_not_compressed(struct decompress_istream *zstream)
        }
 }
 
-static int i_stream_decompress_detect(struct decompress_istream *zstream)
+static int i_stream_decompress_detect_more(struct decompress_istream *zstream)
 {
        const struct compression_handler *handler;
        ssize_t ret;
@@ -98,10 +98,9 @@ static int i_stream_decompress_detect(struct decompress_istream *zstream)
                case 0:
                        return 0;
                default:
-                       if (!zstream->istream.istream.blocking)
-                               return 0;
-                       return i_stream_decompress_detect(zstream);
+                       break;
                }
+               return 1;
        }
        if (handler->create_istream == NULL) {
                zstream->istream.istream.stream_errno = EINVAL;
@@ -115,6 +114,19 @@ static int i_stream_decompress_detect(struct decompress_istream *zstream)
        return 1;
 }
 
+static int i_stream_decompress_detect(struct decompress_istream *zstream)
+{
+       int ret;
+
+       do {
+               ret = i_stream_decompress_detect_more(zstream);
+               if (ret <= 0)
+                       return ret;
+       } while (zstream->decompressed_input == NULL);
+
+       return 1;
+}
+
 static ssize_t i_stream_decompress_read(struct istream_private *stream)
 {
        struct decompress_istream *zstream =