dovecot-2.1: Changes to make static analyzer happier.

dovecot at dovecot.org dovecot at dovecot.org
Mon Mar 26 20:39:21 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/ba1fc76e3a2c
changeset: 14355:ba1fc76e3a2c
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Mar 26 20:39:09 2012 +0300
description:
Changes to make static analyzer happier.

diffstat:

 src/config/config-filter.c                      |   7 +++-
 src/doveadm/doveadm-stats.c                     |   2 +-
 src/doveadm/dsync/doveadm-dsync.c               |   4 +-
 src/doveadm/dsync/test-dsync-proxy-server-cmd.c |   2 +
 src/imap/imap-sync.c                            |   7 +++-
 src/lib-dict/dict-sql.c                         |   6 ++-
 src/lib-mail/message-parser.c                   |  29 ++++++++++++++------
 src/lib-master/master-login.c                   |   6 ++-
 src/lib-storage/index/cydir/cydir-mail.c        |   6 ++-
 src/lib-storage/index/maildir/maildir-mail.c    |  14 +++++----
 src/lib-storage/index/maildir/maildir-sync.c    |   6 +++-
 src/lib-storage/list/subscription-file.c        |  34 +++++++++++-------------
 src/lib/file-cache.c                            |  10 ++++++-
 src/lib/ostream.c                               |   3 +-
 src/lib/process-title.c                         |   2 +
 src/lib/strfuncs.c                              |   4 ++
 src/lib/test-str-find.c                         |   3 +-
 src/plugins/expire/doveadm-expire.c             |   2 +
 src/plugins/fts-squat/squat-trie.c              |   1 +
 src/plugins/fts-squat/squat-uidlist.c           |   3 ++
 20 files changed, 101 insertions(+), 50 deletions(-)

diffs (truncated from 488 to 300 lines):

diff -r e05be9afaed0 -r ba1fc76e3a2c src/config/config-filter.c
--- a/src/config/config-filter.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/config/config-filter.c	Mon Mar 26 20:39:09 2012 +0300
@@ -287,14 +287,17 @@
 				   const struct config_filter_parser *src,
 				   pool_t pool, const char **error_r)
 {
+	const char *conflict_key;
 	unsigned int i;
 
 	for (i = 0; dest[i].root != NULL; i++) {
 		if (settings_parser_apply_changes(dest[i].parser,
 						  src->parsers[i].parser, pool,
-						  error_r) < 0) {
+						  error_r == NULL ? NULL :
+						  &conflict_key) < 0) {
+			i_assert(error_r != NULL);
 			*error_r = t_strdup_printf("Conflict in setting %s "
-				"found from filter at %s", *error_r,
+				"found from filter at %s", conflict_key,
 				src->file_and_line);
 			return -1;
 		}
diff -r e05be9afaed0 -r ba1fc76e3a2c src/doveadm/doveadm-stats.c
--- a/src/doveadm/doveadm-stats.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/doveadm/doveadm-stats.c	Mon Mar 26 20:39:09 2012 +0300
@@ -102,7 +102,7 @@
 		do {
 			T_BEGIN {
 				args = read_next_line(input);
-				if (args[0] == NULL)
+				if (args != NULL && args[0] == NULL)
 					args = NULL;
 				if (args != NULL) {
 					for (i = 0; args[i] != NULL; i++)
diff -r e05be9afaed0 -r ba1fc76e3a2c src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/doveadm/dsync/doveadm-dsync.c	Mon Mar 26 20:39:09 2012 +0300
@@ -655,7 +655,7 @@
 	/* @UNSAFE: this is called when the "doveadm" binary is called as
 	   "dsync" (for backwards compatibility) */
 	max_argc = argc + 7;
-	new_argv = calloc(sizeof(char *), max_argc);
+	new_argv = t_new(char *, max_argc);
 	new_argv[0] = argv[0];
 	dest = 1;
 	getopt_str = master_service_getopt_string();
@@ -666,7 +666,7 @@
 			break;
 
 		flag_m = FALSE; flag_C = FALSE; has_arg = FALSE; flag_u = FALSE;
-		dup = strdup(argv[src]);
+		dup = t_strdup_noconst(argv[src]);
 		for (i = j = 1; argv[src][i] != '\0'; i++) {
 			switch (argv[src][i]) {
 			case 'C':
diff -r e05be9afaed0 -r ba1fc76e3a2c src/doveadm/dsync/test-dsync-proxy-server-cmd.c
--- a/src/doveadm/dsync/test-dsync-proxy-server-cmd.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/doveadm/dsync/test-dsync-proxy-server-cmd.c	Mon Mar 26 20:39:09 2012 +0300
@@ -30,6 +30,8 @@
 {
 	int ret;
 
+	i_assert(cur_cmd != NULL);
+
 	ret = cur_cmd->func(server, cur_cmd_args);
 	if (ret == 0)
 		return 0;
diff -r e05be9afaed0 -r ba1fc76e3a2c src/imap/imap-sync.c
--- a/src/imap/imap-sync.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/imap/imap-sync.c	Mon Mar 26 20:39:09 2012 +0300
@@ -669,8 +669,11 @@
 	for (; cmd != NULL; cmd = prev) {
 		prev = cmd->next;
 
-		if (cmd->state == CLIENT_COMMAND_STATE_WAIT_SYNC &&
-		    (cmd->sync->flags & MAILBOX_SYNC_FLAG_FAST) != 0) {
+		if (cmd->state != CLIENT_COMMAND_STATE_WAIT_SYNC)
+			continue;
+
+		i_assert(cmd->sync != NULL);
+		if ((cmd->sync->flags & MAILBOX_SYNC_FLAG_FAST) != 0) {
 			if (cmd_finish_sync(cmd)) {
 				client_command_free(&cmd);
 				ret = TRUE;
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-dict/dict-sql.c
--- a/src/lib-dict/dict-sql.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-dict/dict-sql.c	Mon Mar 26 20:39:09 2012 +0300
@@ -164,14 +164,16 @@
 			return FALSE;
 		}
 	}
+
+	*path_len_r = path - path_start;
+	*pat_len_r = pat - map->pattern;
+
 	if (*pat == '\0')
 		return *path == '\0';
 	else if (!partial_ok)
 		return FALSE;
 	else {
 		/* partial matches must end with '/' */
-		*path_len_r = path - path_start;
-		*pat_len_r = pat - map->pattern;
 		return pat == map->pattern || pat[-1] == '/';
 	}
 }
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-mail/message-parser.c
--- a/src/lib-mail/message-parser.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-mail/message-parser.c	Mon Mar 26 20:39:09 2012 +0300
@@ -702,10 +702,10 @@
 	return preparsed_parse_next_header(ctx, block_r);
 }
 
-struct message_parser_ctx *
-message_parser_init(pool_t part_pool, struct istream *input,
-		    enum message_header_parser_flags hdr_flags,
-		    enum message_parser_flags flags)
+static struct message_parser_ctx *
+message_parser_init_int(struct istream *input,
+			enum message_header_parser_flags hdr_flags,
+			enum message_parser_flags flags)
 {
 	struct message_parser_ctx *ctx;
 	pool_t pool;
@@ -713,14 +713,24 @@
 	pool = pool_alloconly_create("Message Parser", 1024);
 	ctx = p_new(pool, struct message_parser_ctx, 1);
 	ctx->parser_pool = pool;
-	ctx->part_pool = part_pool;
 	ctx->hdr_flags = hdr_flags;
 	ctx->flags = flags;
 	ctx->input = input;
-	ctx->parts = ctx->part = part_pool == NULL ? NULL :
-		p_new(part_pool, struct message_part, 1);
+	i_stream_ref(input);
+	return ctx;
+}
+
+struct message_parser_ctx *
+message_parser_init(pool_t part_pool, struct istream *input,
+		    enum message_header_parser_flags hdr_flags,
+		    enum message_parser_flags flags)
+{
+	struct message_parser_ctx *ctx;
+
+	ctx = message_parser_init_int(input, hdr_flags, flags);
+	ctx->part_pool = part_pool;
+	ctx->parts = ctx->part = p_new(part_pool, struct message_part, 1);
 	ctx->parse_next_block = parse_next_header_init;
-	i_stream_ref(input);
 	return ctx;
 }
 
@@ -732,7 +742,7 @@
 {
 	struct message_parser_ctx *ctx;
 
-	ctx = message_parser_init(NULL, input, hdr_flags, flags);
+	ctx = message_parser_init_int(input, hdr_flags, flags);
 	ctx->parts = ctx->part = parts;
 	ctx->parse_next_block = preparsed_parse_next_header_init;
 	return ctx;
@@ -806,6 +816,7 @@
 			break;
 	}
 	i_assert(ret != 0);
+	i_assert(ctx->part != NULL);
 
 	if (ret < 0) {
 		/* well, can't return error so fake end of headers */
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-master/master-login.c
--- a/src/lib-master/master-login.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-master/master-login.c	Mon Mar 26 20:39:09 2012 +0300
@@ -187,8 +187,10 @@
 
 	/* FIXME: currently we create a separate connection for each request,
 	   so close the connection after we're done with this client */
-	if (!master_login_conn_is_closed(client->conn))
-		master_login_conn_unref(&client->conn);
+	if (!master_login_conn_is_closed(client->conn)) {
+		i_assert(client->conn->refcount > 1);
+		client->conn->refcount--;
+	}
 	master_login_conn_unref(&client->conn);
 	i_free(client);
 }
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-storage/index/cydir/cydir-mail.c
--- a/src/lib-storage/index/cydir/cydir-mail.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-storage/index/cydir/cydir-mail.c	Mon Mar 26 20:39:09 2012 +0300
@@ -22,8 +22,10 @@
 {
 	const char *path;
 
-	if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE)
-		return mail_set_aborted(mail);
+	if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) {
+		mail_set_aborted(mail);
+		return -1;
+	}
 
 	mail->transaction->stats.stat_lookup_count++;
 	path = cydir_mail_get_path(mail);
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-storage/index/maildir/maildir-mail.c
--- a/src/lib-storage/index/maildir/maildir-mail.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-mail.c	Mon Mar 26 20:39:09 2012 +0300
@@ -102,7 +102,7 @@
 	return input;
 }
 
-static int maildir_mail_stat(struct mail *mail, struct stat *st)
+static int maildir_mail_stat(struct mail *mail, struct stat *st_r)
 {
 	struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->box;
 	struct index_mail *imail = (struct index_mail *)mail;
@@ -110,8 +110,10 @@
 	const char *path;
 	int ret;
 
-	if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE)
-		return mail_set_aborted(mail);
+	if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) {
+		mail_set_aborted(mail);
+		return -1;
+	}
 
 	if (imail->data.access_part != 0 &&
 	    imail->data.stream == NULL) {
@@ -126,10 +128,10 @@
 		stp = i_stream_stat(imail->data.stream, FALSE);
 		if (stp == NULL)
 			return -1;
-		*st = *stp;
+		*st_r = *stp;
 	} else if (!mail->saving) {
 		mail->transaction->stats.stat_lookup_count++;
-		ret = maildir_file_do(mbox, mail->uid, do_stat, st);
+		ret = maildir_file_do(mbox, mail->uid, do_stat, st_r);
 		if (ret <= 0) {
 			if (ret == 0)
 				mail_set_expunged(mail);
@@ -138,7 +140,7 @@
 	} else {
 		mail->transaction->stats.stat_lookup_count++;
 		path = maildir_save_file_get_path(mail->transaction, mail->seq);
-		if (stat(path, st) < 0) {
+		if (stat(path, st_r) < 0) {
 			mail_storage_set_critical(mail->box->storage,
 						  "stat(%s) failed: %m", path);
 			return -1;
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-storage/index/maildir/maildir-sync.c
--- a/src/lib-storage/index/maildir/maildir-sync.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Mon Mar 26 20:39:09 2012 +0300
@@ -595,6 +595,8 @@
 	struct stat new_st, cur_st;
 	bool refreshed = FALSE, check_new = FALSE, check_cur = FALSE;
 
+	*why_r = 0;
+
 	if (mbox->maildir_hdr.new_mtime == 0) {
 		maildir_sync_get_header(mbox);
 		if (mbox->maildir_hdr.new_mtime == 0) {
@@ -710,6 +712,8 @@
 	enum mail_index_sync_flags flags = 0;
 	bool undirty = (ctx->flags & MAILBOX_SYNC_FLAG_FULL_READ) != 0;
 
+	*why_r = 0;
+
 	if (maildir_sync_quick_check(mbox, undirty, ctx->new_dir, ctx->cur_dir,
 				     new_changed_r, cur_changed_r, why_r) < 0)
 		return -1;
@@ -752,7 +756,7 @@
 	enum maildir_uidlist_rec_flag flags;
 	bool new_changed, cur_changed, lock_failure;
 	const char *fname;
-	enum maildir_scan_why why = 0;
+	enum maildir_scan_why why;
 	int ret;
 
 	*lost_files_r = FALSE;
diff -r e05be9afaed0 -r ba1fc76e3a2c src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c	Mon Mar 26 20:38:18 2012 +0300
+++ b/src/lib-storage/list/subscription-file.c	Mon Mar 26 20:39:09 2012 +0300
@@ -57,8 +57,6 @@
 	const char *line;
 
 	*failed_r = FALSE;
-	if (input == NULL)
-		return NULL;
 
 	while ((line = i_stream_next_line(input)) == NULL) {
                 switch (i_stream_read(input)) {
@@ -138,24 +136,26 @@
 		return -1;
 	}
 
-	input = fd_in == -1 ? NULL :
-		i_stream_create_fd(fd_in, list->mailbox_name_max_length+1,
-				   TRUE);
+	found = FALSE;


More information about the dovecot-cvs mailing list