]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mail-filter: ostream-ext-filter - Require o_stream_finish() to be called
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 27 Oct 2017 23:45:58 +0000 (02:45 +0300)
committerTimo Sirainen <tss@dovecot.fi>
Mon, 30 Oct 2017 11:04:53 +0000 (13:04 +0200)
Similar to ostream-zlib.

src/plugins/mail-filter/ostream-ext-filter.c

index 9d3c91dc9c1e2de6c79e2ddcd0316b7a6da9eb37..8d20b7bf2878e875c664913df3122ffb2eb16fee 100644 (file)
@@ -17,7 +17,7 @@ struct mail_filter_ostream {
        int fd;
        struct istream *ext_in;
        struct ostream *ext_out;
-       bool flushed;
+       bool finished;
 };
 
 static void
@@ -61,7 +61,7 @@ o_stream_mail_filter_sendv(struct ostream_private *stream,
        return ret;
 }
 
-static int o_stream_mail_filter_flush(struct ostream_private *stream)
+static int o_stream_mail_filter_finish(struct ostream_private *stream)
 {
        struct mail_filter_ostream *mstream =
                (struct mail_filter_ostream *)stream;
@@ -73,7 +73,7 @@ static int o_stream_mail_filter_flush(struct ostream_private *stream)
                /* connect failed */
                return -1;
        }
-       if (mstream->flushed)
+       if (mstream->finished)
                return 0;
 
        if (shutdown(mstream->fd, SHUT_WR) < 0)
@@ -106,11 +106,20 @@ static int o_stream_mail_filter_flush(struct ostream_private *stream)
                return -1;
        }
 
-       ret = o_stream_flush(stream->parent);
-       if (ret < 0)
+       mstream->finished = TRUE;
+       return ret;
+}
+
+static int o_stream_mail_filter_flush(struct ostream_private *stream)
+{
+       int ret;
+
+       if (stream->finished) {
+               if ((ret = o_stream_mail_filter_finish(stream)) <= 0)
+                       return ret;
+       }
+       if ((ret = o_stream_flush(stream->parent)) < 0)
                o_stream_copy_error_from_parent(stream);
-       else
-               mstream->flushed = TRUE;
        return ret;
 }