From: Stephan Bosch Date: Fri, 24 Sep 2021 08:39:43 +0000 (+0200) Subject: lib-storage: mail-duplicate - Restructure mail_duplicate_read_db_file() to make sure... X-Git-Tag: 2.3.17~46 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=801405d49fd7af1d671b8803f3a285a2529af89c;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail-duplicate - Restructure mail_duplicate_read_db_file() to make sure fd is closed. Found by Coverity. --- diff --git a/src/lib-storage/mail-duplicate.c b/src/lib-storage/mail-duplicate.c index c54371d8f5..ff4fa5630b 100644 --- a/src/lib-storage/mail-duplicate.c +++ b/src/lib-storage/mail-duplicate.c @@ -331,27 +331,16 @@ mail_duplicate_read_records(struct mail_duplicate_transaction *trans, return 0; } -static int mail_duplicate_read_db_file(struct mail_duplicate_transaction *trans) +static int +mail_duplicate_read_db_from_fd(struct mail_duplicate_transaction *trans, int fd) { struct istream *input; struct mail_duplicate_file_header hdr; const unsigned char *data; size_t size; - int fd; struct stat st; unsigned int record_size = 0; - e_debug(trans->event, "Reading %s", trans->path); - - fd = open(trans->path, O_RDONLY); - if (fd == -1) { - if (errno == ENOENT) - return 0; - e_error(trans->event, - "open(%s) failed: %m", trans->path); - return -1; - } - if (fstat(fd, &st) < 0) { e_error(trans->event, "stat(%s) failed: %m", trans->path); @@ -380,11 +369,31 @@ static int mail_duplicate_read_db_file(struct mail_duplicate_transaction *trans) } T_END; i_stream_unref(&input); + return 0; +} + +static int mail_duplicate_read_db_file(struct mail_duplicate_transaction *trans) +{ + int fd, ret; + + e_debug(trans->event, "Reading %s", trans->path); + + fd = open(trans->path, O_RDONLY); + if (fd == -1) { + if (errno == ENOENT) + return 0; + e_error(trans->event, + "open(%s) failed: %m", trans->path); + return -1; + } + + ret = mail_duplicate_read_db_from_fd(trans, fd); + if (close(fd) < 0) { e_error(trans->event, "close(%s) failed: %m", trans->path); } - return 0; + return ret; } static void mail_duplicate_read(struct mail_duplicate_transaction *trans)