]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fs-sis: Memory leak fix.
authorTimo Sirainen <tss@iki.fi>
Thu, 19 Dec 2013 19:25:43 +0000 (21:25 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 19 Dec 2013 19:25:43 +0000 (21:25 +0200)
src/lib-fs/fs-sis.c

index aa95cdcff8d907d61c51705efa757704ca635ea9..4ba9e70158754c50e45f8019a1f02ce1ad6ee83d 100644 (file)
@@ -359,9 +359,10 @@ static void fs_sis_write_stream(struct fs_file *_file)
                                                fs_file_last_error(_file));
        } else {
                file->fs_output = fs_write_stream(file->super);
-               if (file->hash_input == NULL)
+               if (file->hash_input == NULL) {
                        _file->output = file->fs_output;
-               else {
+                       o_stream_ref(_file->output);
+               } else {
                        /* compare if files are equal */
                        _file->output = o_stream_create_cmp(file->fs_output,
                                                            file->hash_input);
@@ -374,22 +375,27 @@ static int fs_sis_write_stream_finish(struct fs_file *_file, bool success)
 {
        struct sis_fs_file *file = (struct sis_fs_file *)_file;
 
+       if (o_stream_nfinish(_file->output) < 0)
+               success = FALSE;
        if (!success) {
                if (file->super != NULL) {
                        fs_write_stream_abort(file->super, &file->fs_output);
                        fs_sis_file_copy_error(file);
                }
+               o_stream_unref(&_file->output);
                return -1;
        }
 
        if (file->hash_input != NULL &&
            o_stream_cmp_equals(_file->output) &&
            i_stream_is_eof(file->hash_input)) {
+               o_stream_unref(&_file->output);
                if (fs_sis_try_link(file)) {
                        fs_write_stream_abort(file->super, &file->fs_output);
                        return 1;
                }
        }
+       o_stream_unref(&_file->output);
 
        if (fs_write_stream_finish(file->super, &file->fs_output) < 0) {
                fs_sis_file_copy_error(file);