From: Timo Sirainen Date: Sun, 6 Mar 2011 21:55:01 +0000 (+0200) Subject: mdbox: Avoid leaking fds when saving many messages larger than mdbox_rotate_size. X-Git-Tag: 2.0.11~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47448611bcaebe1ba2f24850cb7d2545c2e7a72c;p=thirdparty%2Fdovecot%2Fcore.git mdbox: Avoid leaking fds when saving many messages larger than mdbox_rotate_size. --- diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.c b/src/lib-storage/index/dbox-multi/mdbox-map.c index ab8ecfd732..c97017cda6 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.c +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c @@ -1095,6 +1095,23 @@ int mdbox_map_append_next(struct mdbox_map_append_context *ctx, return 0; } +static void +mdbox_map_append_close_if_unneeded(struct mdbox_map *map, + struct dbox_file_append_context *append_ctx) +{ + struct mdbox_file *mfile = + (struct mdbox_file *)append_ctx->file; + uoff_t end_offset = append_ctx->output->offset; + + /* if this file is now large enough not to fit any other + mails and we created it, close its fd since it's not + needed anymore. */ + if (end_offset > map->set->mdbox_rotate_size && + mfile->file_id == 0 && + dbox_file_append_flush(append_ctx) == 0) + dbox_file_close(append_ctx->file); +} + void mdbox_map_append_finish(struct mdbox_map_append_context *ctx) { struct mdbox_map_append *appends, *last; @@ -1110,6 +1127,8 @@ void mdbox_map_append_finish(struct mdbox_map_append_context *ctx) i_assert(cur_offset >= last->offset); last->size = cur_offset - last->offset; dbox_file_append_checkpoint(last->file_append); + + mdbox_map_append_close_if_unneeded(ctx->map, last->file_append); } void mdbox_map_append_abort(struct mdbox_map_append_context *ctx)