From: Timo Sirainen Date: Thu, 19 Dec 2013 19:25:43 +0000 (+0200) Subject: fs-sis: Memory leak fix. X-Git-Tag: 2.2.10~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b866325bc5a7b922884cf10bb0316954c12ee75d;p=thirdparty%2Fdovecot%2Fcore.git fs-sis: Memory leak fix. --- diff --git a/src/lib-fs/fs-sis.c b/src/lib-fs/fs-sis.c index aa95cdcff8..4ba9e70158 100644 --- a/src/lib-fs/fs-sis.c +++ b/src/lib-fs/fs-sis.c @@ -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);