]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fs-metawrap, fs-compress, fs-crypt: fs_read_stream() - return parent stream error...
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 9 Apr 2024 11:49:59 +0000 (14:49 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Tue, 9 Apr 2024 14:53:20 +0000 (14:53 +0000)
Earlier behavior was to delay until i_stream_read() was called, which caused
problems with some error handling.

src/lib-fs/fs-metawrap.c
src/plugins/fs-compress/fs-compress.c
src/plugins/mail-crypt/fs-crypt-common.c

index 04241c969f4ad42d7f0d839a5550cfbd603e5041..1df736a0888875781d5c7072be1df695ed657940 100644 (file)
@@ -259,6 +259,11 @@ fs_metawrap_read_stream(struct fs_file *_file, size_t max_buffer_size)
        }
 
        input = fs_read_stream(file->super_read, max_buffer_size);
+       if (input->stream_errno != 0) {
+               file->input = input;
+               i_stream_ref(file->input);
+               return file->input;
+       }
        file->input = i_stream_create_metawrap(input, fs_metawrap_callback, file);
        i_stream_unref(&input);
        i_stream_ref(file->input);
index 83afc87e516659d63bc288a09055c71ca139538f..f8a46a9653c8b134c3340ae65f4cafe4bbce33c1 100644 (file)
@@ -177,6 +177,11 @@ fs_compress_read_stream(struct fs_file *_file, size_t max_buffer_size)
 
        input = fs_read_stream(file->super_read,
                I_MAX(FS_COMPRESS_ISTREAM_MIN_BUFFER_SIZE, max_buffer_size));
+       if (input->stream_errno != 0) {
+               file->input = input;
+               i_stream_ref(file->input);
+               return file->input;
+       }
        if (file->fs->try_plain)
                flags |= ISTREAM_DECOMPRESS_FLAG_TRY;
        file->input = i_stream_create_decompress(input, flags);
index efff44921fb65b8f22815c008e2bde9b2d8aa2c2..3246b15ff7816ae59fc74b4403295b395178fb02 100644 (file)
@@ -281,6 +281,11 @@ fs_crypt_read_stream(struct fs_file *_file, size_t max_buffer_size)
 
        input = fs_read_stream(file->super_read,
                I_MAX(FS_CRYPT_ISTREAM_MIN_BUFFER_SIZE, max_buffer_size));
+       if (input->stream_errno != 0) {
+               file->input = input;
+               i_stream_ref(file->input);
+               return file->input;
+       }
 
        if (file->fs->allow_missing_keys) {
                struct istream *decrypted_input =