changeset 14629:c93ca5e46a8a

Marked functions parameters that are allowed to be NULL. Some APIs were also changed. The non-obvious APIs where NULL parameter was changed to "" are master_service_init() and auth_master_user_list_init(). These checks can currently be enabled only on a patched clang: http://llvm.org/bugs/show_bug.cgi?id=6786
author Timo Sirainen <tss@iki.fi>
date Sun, 24 Jun 2012 00:52:57 +0300
parents e0cc3fb5dc64
children 5a9f9c35a8f0
files src/anvil/main.c src/auth/auth-master-connection.c src/auth/auth-master-connection.h src/auth/auth-request-handler.c src/auth/auth-request.c src/auth/auth-request.h src/auth/auth-settings.h src/auth/auth-stream.h src/auth/auth-worker-server.c src/auth/auth.c src/auth/auth.h src/auth/db-checkpassword.h src/auth/db-ldap.c src/auth/db-ldap.h src/auth/db-passwd-file.c src/auth/main.c src/auth/mech-anonymous.c src/auth/mech-apop.c src/auth/mech-cram-md5.c src/auth/mech-ntlm.c src/auth/mech-otp-skey-common.c src/auth/mech-plain-common.c src/auth/mech-rpa.c src/auth/mech-winbind.c src/auth/mech.c src/auth/password-scheme-otp.c src/auth/password-scheme.h src/auth/userdb-passwd.c src/auth/userdb-static.c src/auth/userdb.h src/config/config-parser-private.h src/config/config-request.h src/config/doveconf.c src/config/main.c src/dict/main.c src/director/director-connection.c src/director/director-test.c src/director/director.h src/dns/dns-client.c src/doveadm/doveadm-director.c src/doveadm/doveadm-log.c src/doveadm/doveadm-mail-fetch.c src/doveadm/doveadm-mail-iter.h src/doveadm/doveadm-mail-mailbox-status.c src/doveadm/dsync/doveadm-dsync.c src/doveadm/dsync/dsync-brain.c src/doveadm/dsync/dsync-mailbox-import.c src/doveadm/dsync/dsync-slave-io.c src/doveadm/main.c src/imap-login/client.c src/imap-login/client.h src/imap/cmd-append.c src/imap/cmd-expunge.c src/imap/imap-client.h src/imap/imap-commands-util.h src/imap/imap-expunge.h src/imap/imap-fetch-body.c src/imap/imap-fetch.h src/imap/imap-search.h src/imap/imap-sync.c src/indexer/indexer.c src/indexer/master-connection.c src/ipc/client.c src/ipc/main.c src/lib-auth/auth-client-request.c src/lib-auth/auth-client.h src/lib-auth/auth-master.c src/lib-auth/auth-master.h src/lib-dict/dict.h src/lib-dns/dns-lookup.h src/lib-imap-client/imapc-connection.h src/lib-imap-storage/imap-msgpart.c src/lib-imap/imap-base-subject.c src/lib-imap/imap-parser.c src/lib-imap/imap-parser.h src/lib-imap/imap-url.c src/lib-imap/imap-util.h src/lib-index/mail-cache-lookup.c src/lib-index/mail-cache-transaction.c src/lib-index/mail-index-alloc-cache.c src/lib-index/mail-index-alloc-cache.h src/lib-index/mail-index-map-hdr.c src/lib-index/mail-index-map.c src/lib-index/mail-index-util.h src/lib-index/mail-index-view.c src/lib-index/mail-index.c src/lib-index/mail-index.h src/lib-lda/mail-deliver.h src/lib-lda/smtp-client.h src/lib-mail/istream-binary-converter.c src/lib-mail/istream-dot.c src/lib-mail/istream-header-filter.h src/lib-mail/message-header-parser.h src/lib-mail/message-parser.h src/lib-mail/message-part-serialize.c src/lib-mail/message-search.h src/lib-mail/message-size.c src/lib-mail/message-size.h src/lib-mail/rfc822-parser.h src/lib-mail/test-istream-header-filter.c src/lib-master/anvil-client.h src/lib-master/ipc-client.h src/lib-master/ipc-server.c src/lib-master/master-service-settings-cache.h src/lib-master/master-service-settings.h src/lib-master/master-service.c src/lib-master/master-service.h src/lib-master/mountpoint-list.c src/lib-ntlm/ntlm-encrypt.c src/lib-ntlm/ntlm-encrypt.h src/lib-otp/otp-parse.c src/lib-settings/settings-parser.c src/lib-settings/settings.h src/lib-sql/driver-mysql.c src/lib-sql/driver-pgsql.c src/lib-sql/driver-sqlpool.c src/lib-sql/sql-api.c src/lib-storage/index/dbox-common/dbox-file-fix.c src/lib-storage/index/dbox-common/dbox-save.h src/lib-storage/index/dbox-common/dbox-storage.c src/lib-storage/index/dbox-common/dbox-sync-rebuild.c src/lib-storage/index/dbox-multi/mdbox-map.c src/lib-storage/index/dbox-multi/mdbox-storage.c src/lib-storage/index/dbox-multi/mdbox-storage.h src/lib-storage/index/dbox-multi/mdbox-sync.c src/lib-storage/index/dbox-single/sdbox-storage.c src/lib-storage/index/imapc/imapc-mail.c src/lib-storage/index/index-mail-headers.c src/lib-storage/index/index-mail.c src/lib-storage/index/index-mail.h src/lib-storage/index/index-search.c src/lib-storage/index/index-sort.c src/lib-storage/index/index-storage.h src/lib-storage/index/index-sync-changes.h src/lib-storage/index/maildir/maildir-filename-flags.c src/lib-storage/index/maildir/maildir-filename-flags.h src/lib-storage/index/maildir/maildir-mail.c src/lib-storage/index/maildir/maildir-save.c src/lib-storage/index/maildir/maildir-storage.c src/lib-storage/index/maildir/maildir-storage.h src/lib-storage/index/maildir/maildir-sync-index.c src/lib-storage/index/maildir/maildir-sync.c src/lib-storage/index/maildir/maildir-sync.h src/lib-storage/index/maildir/maildir-uidlist.c src/lib-storage/index/maildir/maildir-uidlist.h src/lib-storage/index/maildir/maildir-util.c src/lib-storage/index/mbox/mbox-file.c src/lib-storage/index/mbox/mbox-lock.c src/lib-storage/index/mbox/mbox-mail.c src/lib-storage/index/mbox/mbox-storage.c src/lib-storage/index/mbox/mbox-sync-parse.c src/lib-storage/index/mbox/mbox-sync.c src/lib-storage/index/raw/raw-storage.c src/lib-storage/index/shared/shared-storage.c src/lib-storage/list/mailbox-list-delete.c src/lib-storage/list/mailbox-list-fs-iter.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-index-status.c src/lib-storage/list/mailbox-list-index.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/mail-namespace.h src/lib-storage/mail-search.h src/lib-storage/mail-storage-service.c src/lib-storage/mail-storage-service.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h src/lib-storage/mail-thread.h src/lib-storage/mail.c src/lib-storage/mailbox-get.c src/lib-storage/mailbox-list-private.h src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h src/lib-storage/mailbox-tree.c src/lib-storage/mailbox-tree.h src/lib-test/test-common.h src/lib/base64.h src/lib/buffer.h src/lib/child-wait.h src/lib/eacces-error.h src/lib/failures.c src/lib/file-dotlock.c src/lib/hash.c src/lib/hash.h src/lib/hash2.h src/lib/ioloop-notify-fd.h src/lib/ioloop.c src/lib/ioloop.h src/lib/iso8601-date.c src/lib/istream-base64-encoder.c src/lib/istream-chain.c src/lib/istream-chain.h src/lib/istream-crlf.c src/lib/istream-private.h src/lib/istream-seekable.h src/lib/istream.c src/lib/istream.h src/lib/lib-signals.c src/lib/lib-signals.h src/lib/macros.h src/lib/mkdir-parents.c src/lib/module-dir.h src/lib/network.c src/lib/network.h src/lib/ostream-private.h src/lib/ostream.c src/lib/ostream.h src/lib/restrict-access.h src/lib/safe-mkstemp.c src/lib/strfuncs.c src/lib/strfuncs.h src/lib/test-iso8601-date.c src/lib/uri-util.c src/lib/uri-util.h src/lib/var-expand.h src/lmtp/client.h src/lmtp/lmtp-proxy.h src/log/main.c src/login-common/client-common-auth.c src/login-common/login-proxy.c src/login-common/login-settings.h src/login-common/sasl-server.c src/login-common/ssl-proxy-openssl.c src/master/common.h src/plugins/acl/acl-backend-vfile-acllist.c src/plugins/acl/acl-plugin.h src/plugins/fts-lucene/fts-backend-lucene.c src/plugins/fts-lucene/lucene-wrapper.h src/plugins/fts-solr/solr-connection.c src/plugins/fts-squat/squat-trie.h src/plugins/fts/fts-storage.c src/plugins/quota/quota-dirsize.c src/plugins/quota/quota-fs.c src/plugins/quota/quota-maildir.c src/plugins/quota/quota.c src/pop3/pop3-client.h src/replication/aggregator/aggregator.c src/replication/replicator/replicator.c src/ssl-params/main.c src/stats/mail-domain.h src/stats/mail-ip.h src/stats/mail-session.h src/stats/mail-user.h src/stats/main.c
diffstat 243 files changed, 738 insertions(+), 599 deletions(-) [+]
line wrap: on
line diff
--- a/src/anvil/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/anvil/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -29,7 +29,8 @@
 	anvil_connection_create(conn->fd, master, conn->fifo);
 }
 
-static void log_fdpass_input(void *context ATTR_UNUSED)
+static void ATTR_NULL(1)
+log_fdpass_input(void *context ATTR_UNUSED)
 {
 	int fd;
 	char c;
@@ -57,7 +58,7 @@
 	const char *error;
 
 	master_service = master_service_init("anvil", service_flags,
-					     &argc, &argv, NULL);
+					     &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 	if (master_service_settings_read_simple(master_service,
--- a/src/auth/auth-master-connection.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-master-connection.c	Sun Jun 24 00:52:57 2012 +0300
@@ -383,14 +383,14 @@
 			return FALSE;
 		auth_request_log_info(auth_request, "passdb", "%s", error);
 		pass_callback(PASSDB_RESULT_USER_UNKNOWN,
-			      NULL, 0, auth_request);
+			      &uchar_nul, 0, auth_request);
 	} else if (conn->userdb_restricted_uid != 0) {
 		/* no permissions to do this lookup */
 		auth_request_log_error(auth_request, "passdb",
 			"Auth client doesn't have permissions to do "
 			"a PASS lookup: %s", auth_restricted_reason(conn));
 		pass_callback(PASSDB_RESULT_INTERNAL_FAILURE,
-			      NULL, 0, auth_request);
+			      &uchar_nul, 0, auth_request);
 	} else {
 		auth_request_set_state(auth_request,
 				       AUTH_REQUEST_STATE_MECH_CONTINUE);
--- a/src/auth/auth-master-connection.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-master-connection.h	Sun Jun 24 00:52:57 2012 +0300
@@ -28,7 +28,7 @@
 struct auth_master_connection *
 auth_master_connection_create(struct auth *auth, int fd,
 			      const char *path, const struct stat *socket_st,
-			      bool userdb_only);
+			      bool userdb_only) ATTR_NULL(4);
 void auth_master_connection_destroy(struct auth_master_connection **conn);
 
 void auth_master_connection_ref(struct auth_master_connection *conn);
--- a/src/auth/auth-request-handler.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-request-handler.c	Sun Jun 24 00:52:57 2012 +0300
@@ -37,7 +37,7 @@
 static struct aqueue *auth_failures;
 static struct timeout *to_auth_failures;
 
-static void auth_failure_timeout(void *context);
+static void auth_failure_timeout(void *context) ATTR_NULL(1);
 
 #undef auth_request_handler_create
 struct auth_request_handler *
@@ -762,7 +762,8 @@
 
 		i_assert(auth_request->state == AUTH_REQUEST_STATE_FINISHED);
 		auth_request_handler_reply(auth_request,
-					   AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
+					   AUTH_CLIENT_RESULT_FAILURE,
+					   &uchar_nul, 0);
 		auth_request_unref(&auth_request);
 	}
 }
--- a/src/auth/auth-request.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-request.c	Sun Jun 24 00:52:57 2012 +0300
@@ -141,8 +141,7 @@
 
 	auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
 	auth_request_refresh_last_access(request);
-	auth_request_handler_reply(request, AUTH_CLIENT_RESULT_FAILURE,
-				   NULL, 0);
+	auth_request_handler_reply(request, AUTH_CLIENT_RESULT_FAILURE, "", 0);
 }
 
 void auth_request_internal_failure(struct auth_request *request)
@@ -325,7 +324,7 @@
 	i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
 
 	if (request->successful) {
-		auth_request_success(request, NULL, 0);
+		auth_request_success(request, "", 0);
 		return;
 	}
 
@@ -790,7 +789,8 @@
 		auth_request_log_debug(request, "password",
 			"passdb doesn't support credential lookups");
 		auth_request_lookup_credentials_callback(
-			PASSDB_RESULT_SCHEME_NOT_AVAILABLE, NULL, 0, request);
+					PASSDB_RESULT_SCHEME_NOT_AVAILABLE,
+					&uchar_nul, 0, request);
 	} else if (passdb->blocking) {
 		passdb_blocking_lookup_credentials(request);
 	} else {
--- a/src/auth/auth-request.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-request.h	Sun Jun 24 00:52:57 2012 +0300
@@ -175,13 +175,13 @@
 
 void auth_request_set_field(struct auth_request *request,
 			    const char *name, const char *value,
-			    const char *default_scheme);
+			    const char *default_scheme) ATTR_NULL(4);
 void auth_request_set_field_keyvalue(struct auth_request *request,
 				     const char *field,
-				     const char *default_scheme);
+				     const char *default_scheme) ATTR_NULL(3);
 void auth_request_set_fields(struct auth_request *request,
 			     const char *const *fields,
-			     const char *default_scheme);
+			     const char *default_scheme) ATTR_NULL(3);
 
 void auth_request_init_userdb_reply(struct auth_request *request);
 void auth_request_set_userdb_field(struct auth_request *request,
@@ -203,7 +203,8 @@
 
 const struct var_expand_table *
 auth_request_get_var_expand_table(const struct auth_request *auth_request,
-				  auth_request_escape_func_t *escape_func);
+				  auth_request_escape_func_t *escape_func)
+	ATTR_NULL(2);
 const char *auth_request_str_escape(const char *string,
 				    const struct auth_request *request);
 
--- a/src/auth/auth-settings.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-settings.h	Sun Jun 24 00:52:57 2012 +0300
@@ -67,6 +67,7 @@
 
 struct auth_settings *
 auth_settings_read(const char *service, pool_t pool,
-		   struct master_service_settings_output *output_r);
+		   struct master_service_settings_output *output_r)
+	ATTR_NULL(1);
 
 #endif
--- a/src/auth/auth-stream.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-stream.h	Sun Jun 24 00:52:57 2012 +0300
@@ -5,7 +5,7 @@
 
 struct auth_stream_reply *auth_stream_reply_init(pool_t pool);
 void auth_stream_reply_add(struct auth_stream_reply *reply,
-			   const char *key, const char *value);
+			   const char *key, const char *value) ATTR_NULL(2, 3);
 void auth_stream_reply_reset(struct auth_stream_reply *reply);
 void auth_stream_reply_remove(struct auth_stream_reply *reply, const char *key);
 
--- a/src/auth/auth-worker-server.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth-worker-server.c	Sun Jun 24 00:52:57 2012 +0300
@@ -57,7 +57,7 @@
 
 static void worker_input(struct auth_worker_connection *conn);
 static void auth_worker_destroy(struct auth_worker_connection **conn,
-				const char *reason, bool restart);
+				const char *reason, bool restart) ATTR_NULL(2);
 
 static void auth_worker_idle_timeout(struct auth_worker_connection *conn)
 {
--- a/src/auth/auth.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth.c	Sun Jun 24 00:52:57 2012 +0300
@@ -137,7 +137,7 @@
 	}
 }
 
-static struct auth *
+static struct auth * ATTR_NULL(2)
 auth_preinit(const struct auth_settings *set, const char *service, pool_t pool,
 	     const struct mechanisms_register *reg)
 {
@@ -229,21 +229,28 @@
 	unsigned int i, count;
 
 	a = array_get(&auths, &count);
-	if (name != NULL) {
-		for (i = 1; i < count; i++) {
-			if (strcmp(a[i]->service, name) == 0)
-				return a[i];
-		}
-		/* not found. maybe we can instead find a !service */
-		for (i = 1; i < count; i++) {
-			if (a[i]->service[0] == '!' &&
-			    strcmp(a[i]->service + 1, name) != 0)
-				return a[i];
-		}
+	for (i = 1; i < count; i++) {
+		if (strcmp(a[i]->service, name) == 0)
+			return a[i];
+	}
+	/* not found. maybe we can instead find a !service */
+	for (i = 1; i < count; i++) {
+		if (a[i]->service[0] == '!' &&
+		    strcmp(a[i]->service + 1, name) != 0)
+			return a[i];
 	}
 	return a[0];
 }
 
+struct auth *auth_default_service(void)
+{
+	struct auth *const *a;
+	unsigned int count;
+
+	a = array_get(&auths, &count);
+	return a[0];
+}
+
 void auths_preinit(const struct auth_settings *set, pool_t pool,
 		   const struct mechanisms_register *reg,
 		   const char *const *services)
--- a/src/auth/auth.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/auth.h	Sun Jun 24 00:52:57 2012 +0300
@@ -33,6 +33,7 @@
 extern struct auth_penalty *auth_penalty;
 
 struct auth *auth_find_service(const char *name);
+struct auth *auth_default_service(void);
 
 void auths_preinit(const struct auth_settings *set, pool_t pool,
 		   const struct mechanisms_register *reg,
--- a/src/auth/db-checkpassword.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/db-checkpassword.h	Sun Jun 24 00:52:57 2012 +0300
@@ -24,6 +24,6 @@
 			   struct auth_request *request,
 			   const char *auth_password,
 			   db_checkpassword_callback_t *callback,
-			   void (*request_callback)());
+			   void (*request_callback)()) ATTR_NULL(3);
 
 #endif
--- a/src/auth/db-ldap.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/db-ldap.c	Sun Jun 24 00:52:57 2012 +0300
@@ -753,7 +753,7 @@
 	net_set_nonblock(conn->fd, TRUE);
 }
 
-static void
+static void ATTR_NULL(1)
 db_ldap_set_opt(struct ldap_connection *conn, int opt, const void *value,
 		const char *optname, const char *value_str)
 {
@@ -766,7 +766,7 @@
 	}
 }
 
-static void
+static void ATTR_NULL(1)
 db_ldap_set_opt_str(struct ldap_connection *conn, int opt, const char *value,
 		    const char *optname)
 {
--- a/src/auth/db-ldap.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/db-ldap.h	Sun Jun 24 00:52:57 2012 +0300
@@ -167,7 +167,7 @@
 
 void db_ldap_set_attrs(struct ldap_connection *conn, const char *attrlist,
 		       char ***attr_names_r, ARRAY_TYPE(ldap_field) *attr_map,
-		       const char *skip_attr);
+		       const char *skip_attr) ATTR_NULL(5);
 
 struct ldap_connection *db_ldap_init(const char *config_path, bool userdb);
 void db_ldap_unref(struct ldap_connection **conn);
--- a/src/auth/db-passwd-file.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/db-passwd-file.c	Sun Jun 24 00:52:57 2012 +0300
@@ -25,8 +25,9 @@
 
 static struct db_passwd_file *passwd_files;
 
-static void passwd_file_add(struct passwd_file *pw, const char *username,
-			    const char *pass, const char *const *args)
+static void ATTR_NULL(3)
+passwd_file_add(struct passwd_file *pw, const char *username,
+		const char *pass, const char *const *args)
 {
 	/* args = uid, gid, user info, home dir, shell, extra_fields */
 	struct passwd_user *pu;
--- a/src/auth/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -227,7 +227,7 @@
 
 	/* set proctitles before init()s, since they may set them to error */
 	auth_refresh_proctitle();
-	auth_worker_refresh_proctitle(NULL);
+	auth_worker_refresh_proctitle("");
 
 	child_wait_init();
 	auth_worker_server_init();
@@ -297,7 +297,7 @@
 	}
 
 	master_service_client_connection_accept(conn);
-	(void)auth_worker_client_create(auth_find_service(NULL), conn->fd);
+	(void)auth_worker_client_create(auth_default_service(), conn->fd);
 }
 
 static void client_connected(struct master_service_connection *conn)
@@ -312,7 +312,7 @@
 		l->type = auth_socket_type_get(conn->name);
 		l->path = i_strdup(conn->name);
 	}
-	auth = auth_find_service(NULL);
+	auth = auth_default_service();
 	switch (l->type) {
 	case AUTH_SOCKET_MASTER:
 		(void)auth_master_connection_create(auth, conn->fd,
--- a/src/auth/mech-anonymous.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-anonymous.c	Sun Jun 24 00:52:57 2012 +0300
@@ -20,7 +20,7 @@
 	request->user = p_strdup(request->pool,
 				 request->set->anonymous_username);
 
-	auth_request_success(request, NULL, 0);
+	auth_request_success(request, "", 0);
 }
 
 static struct auth_request *mech_anonymous_auth_new(void)
--- a/src/auth/mech-apop.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-apop.c	Sun Jun 24 00:52:57 2012 +0300
@@ -54,7 +54,7 @@
 	switch (result) {
 	case PASSDB_RESULT_OK:
 		if (verify_credentials(request, credentials, size))
-			auth_request_success(auth_request, NULL, 0);
+			auth_request_success(auth_request, "", 0);
 		else
 			auth_request_fail(auth_request);
 		break;
--- a/src/auth/mech-cram-md5.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-cram-md5.c	Sun Jun 24 00:52:57 2012 +0300
@@ -115,7 +115,7 @@
 	switch (result) {
 	case PASSDB_RESULT_OK:
 		if (verify_credentials(request, credentials, size))
-			auth_request_success(auth_request, NULL, 0);
+			auth_request_success(auth_request, "", 0);
 		else
 			auth_request_fail(auth_request);
 		break;
--- a/src/auth/mech-ntlm.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-ntlm.c	Sun Jun 24 00:52:57 2012 +0300
@@ -68,7 +68,7 @@
 	switch (result) {
 	case PASSDB_RESULT_OK:
 		if (lm_verify_credentials(request, credentials, size))
-			auth_request_success(auth_request, NULL, 0);
+			auth_request_success(auth_request, "", 0);
 		else
 			auth_request_fail(auth_request);
 		break;
@@ -151,7 +151,7 @@
 	case PASSDB_RESULT_OK:
 		ret = ntlm_verify_credentials(request, credentials, size);
 		if (ret > 0) {
-			auth_request_success(auth_request, NULL, 0);
+			auth_request_success(auth_request, "", 0);
 			return;
 		}
 		if (ret < 0) {
--- a/src/auth/mech-otp-skey-common.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-otp-skey-common.c	Sun Jun 24 00:52:57 2012 +0300
@@ -51,7 +51,7 @@
 				  struct auth_request *auth_request)
 {
 	if (success)
-		auth_request_success(auth_request, NULL, 0);
+		auth_request_success(auth_request, "", 0);
 	else {
 		auth_request_internal_failure(auth_request);
 		otp_unlock(auth_request);
--- a/src/auth/mech-plain-common.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-plain-common.c	Sun Jun 24 00:52:57 2012 +0300
@@ -8,7 +8,7 @@
 {
 	switch (result) {
 	case PASSDB_RESULT_OK:
-		auth_request_success(request, NULL, 0);
+		auth_request_success(request, "", 0);
 		break;
 	case PASSDB_RESULT_INTERNAL_FAILURE:
 		auth_request_internal_failure(request);
--- a/src/auth/mech-rpa.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-rpa.c	Sun Jun 24 00:52:57 2012 +0300
@@ -524,7 +524,7 @@
 			"invalid token 5 or client rejects us");
 		auth_request_fail(auth_request);
 	} else {
-		auth_request_success(auth_request, NULL, 0);
+		auth_request_success(auth_request, "", 0);
 	}
 }
 
--- a/src/auth/mech-winbind.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech-winbind.c	Sun Jun 24 00:52:57 2012 +0300
@@ -264,7 +264,7 @@
 			auth_request_success(&request->auth_request,
 					     buf->data, buf->used);
 		} else {
-			auth_request_success(&request->auth_request, NULL, 0);
+			auth_request_success(&request->auth_request, "", 0);
 		}
 		return HR_OK;
 	} else if (strcmp(token[0], "BH") == 0) {
--- a/src/auth/mech.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/mech.c	Sun Jun 24 00:52:57 2012 +0300
@@ -50,7 +50,7 @@
 			       const unsigned char *data, size_t data_size)
 {
 	if (data == NULL) {
-		auth_request_handler_reply_continue(request, NULL, 0);
+		auth_request_handler_reply_continue(request, &uchar_nul, 0);
 	} else {
 		/* initial reply given, even if it was 0 bytes */
 		request->mech->auth_continue(request, data, data_size);
--- a/src/auth/password-scheme-otp.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/password-scheme-otp.c	Sun Jun 24 00:52:57 2012 +0300
@@ -12,13 +12,13 @@
 #include "randgen.h"
 #include "otp.h"
 
-int password_generate_otp(const char *pw, const char *data,
+int password_generate_otp(const char *pw, const char *state_data,
 			  unsigned int algo, const char **result_r)
 {
 	struct otp_state state;
 
-	if (data != NULL) {
-		if (otp_parse_dbentry(data, &state) != 0)
+	if (state_data != NULL) {
+		if (otp_parse_dbentry(state_data, &state) != 0)
 			return -1;
 	} else {
 		/* Generate new OTP credentials from plaintext */
--- a/src/auth/password-scheme.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/password-scheme.h	Sun Jun 24 00:52:57 2012 +0300
@@ -76,8 +76,9 @@
 /* INTERNAL: */
 const char *password_generate_salt(size_t len);
 const char *password_generate_md5_crypt(const char *pw, const char *salt);
-int password_generate_otp(const char *pw, const char *state,
-			  unsigned int algo, const char **result_r);
+int password_generate_otp(const char *pw, const char *state_data,
+			  unsigned int algo, const char **result_r)
+	ATTR_NULL(2);
 void password_generate_rpa(const char *pw, unsigned char result[]);
 
 int crypt_verify(const char *plaintext, const char *user,
--- a/src/auth/userdb-passwd.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/userdb-passwd.c	Sun Jun 24 00:52:57 2012 +0300
@@ -185,7 +185,8 @@
 	_ctx->callback(NULL, _ctx->context);
 }
 
-static void passwd_iterate_next_timeout(void *context ATTR_UNUSED)
+static void ATTR_NULL(1)
+passwd_iterate_next_timeout(void *context ATTR_UNUSED)
 {
 	timeout_remove(&cur_userdb_iter_to);
 	passwd_iterate_next(&cur_userdb_iter->ctx);
--- a/src/auth/userdb-static.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/userdb-static.c	Sun Jun 24 00:52:57 2012 +0300
@@ -97,7 +97,7 @@
 		} else {
 			static_credentials_callback(
 				PASSDB_RESULT_SCHEME_NOT_AVAILABLE,
-				NULL, 0, auth_request);
+				&uchar_nul, 0, auth_request);
 		}
 	} else {
 		static_lookup_real(auth_request, callback);
--- a/src/auth/userdb.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/auth/userdb.h	Sun Jun 24 00:52:57 2012 +0300
@@ -65,8 +65,10 @@
 	int (*iterate_deinit)(struct userdb_iterate_context *ctx);
 };
 
-uid_t userdb_parse_uid(struct auth_request *request, const char *str);
-gid_t userdb_parse_gid(struct auth_request *request, const char *str);
+uid_t userdb_parse_uid(struct auth_request *request, const char *str)
+	ATTR_NULL(1);
+gid_t userdb_parse_gid(struct auth_request *request, const char *str)
+	ATTR_NULL(1);
 
 struct userdb_module *
 userdb_preinit(pool_t pool, const struct auth_userdb_settings *set);
--- a/src/config/config-parser-private.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/config/config-parser-private.h	Sun Jun 24 00:52:57 2012 +0300
@@ -61,7 +61,7 @@
 extern void (*hook_config_parser_begin)(struct config_parser_context *ctx);
 
 int config_apply_line(struct config_parser_context *ctx, const char *key,
-		      const char *line, const char *section_name);
+		      const char *line, const char *section_name) ATTR_NULL(4);
 void config_parser_apply_line(struct config_parser_context *ctx,
 			      enum config_line_type type,
 			      const char *key, const char *value);
--- a/src/config/config-request.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/config/config-request.h	Sun Jun 24 00:52:57 2012 +0300
@@ -36,11 +36,12 @@
 bool config_export_type(string_t *str, const void *value,
 			const void *default_value,
 			enum setting_type type, bool dump_default,
-			bool *dump_r);
+			bool *dump_r) ATTR_NULL(3);
 struct config_export_context *
 config_export_init(const char *module, enum config_dump_scope scope,
 		   enum config_dump_flags flags,
-		   config_request_callback_t *callback, void *context);
+		   config_request_callback_t *callback, void *context)
+	ATTR_NULL(5);
 void config_export_by_filter(struct config_export_context *ctx,
 			     const struct config_filter *filter);
 void config_export_parsers(struct config_export_context *ctx,
--- a/src/config/doveconf.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/config/doveconf.c	Sun Jun 24 00:52:57 2012 +0300
@@ -163,7 +163,7 @@
 	return FALSE;
 }
 
-static int
+static int ATTR_NULL(4)
 config_dump_human_output(struct config_dump_human_context *ctx,
 			 struct ostream *output, unsigned int indent,
 			 const char *setting_name_filter)
@@ -418,7 +418,7 @@
 	return ret;
 }
 
-static int
+static int ATTR_NULL(4)
 config_dump_human(const struct config_filter *filter, const char *module,
 		  enum config_dump_scope scope, const char *setting_name_filter)
 {
--- a/src/config/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/config/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -18,7 +18,7 @@
 {
 	const char *path, *error;
 
-	master_service = master_service_init("config", 0, &argc, &argv, NULL);
+	master_service = master_service_init("config", 0, &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 	master_service_init_log(master_service, "config: ");
--- a/src/dict/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/dict/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -85,7 +85,7 @@
 	};
 	const char *error;
 
-	master_service = master_service_init("dict", 0, &argc, &argv, NULL);
+	master_service = master_service_init("dict", 0, &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 
--- a/src/director/director-connection.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/director/director-connection.c	Sun Jun 24 00:52:57 2012 +0300
@@ -746,7 +746,7 @@
 	return TRUE;
 }
 
-static bool
+static bool ATTR_NULL(3)
 director_cmd_host_int(struct director_connection *conn, const char *const *args,
 		      struct director_host *dir_host)
 {
--- a/src/director/director-test.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/director/director-test.c	Sun Jun 24 00:52:57 2012 +0300
@@ -508,7 +508,7 @@
 	net_set_nonblock(admin->fd, TRUE);
 }
 
-static void
+static void ATTR_NULL(1)
 director_connection_disconnect_timeout(void *context ATTR_UNUSED)
 {
 	struct director_connection *conn;
@@ -586,7 +586,7 @@
 	const char *admin_path;
 
 	master_service = master_service_init("director-test", 0,
-					     &argc, &argv, NULL);
+					     &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 	admin_path = argv[optind];
--- a/src/director/director.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/director/director.h	Sun Jun 24 00:52:57 2012 +0300
@@ -109,26 +109,27 @@
 
 void director_update_host(struct director *dir, struct director_host *src,
 			  struct director_host *orig_src,
-			  struct mail_host *host);
+			  struct mail_host *host) ATTR_NULL(3);
 void director_remove_host(struct director *dir, struct director_host *src,
 			  struct director_host *orig_src,
-			  struct mail_host *host);
+			  struct mail_host *host) ATTR_NULL(2, 3);
 void director_flush_host(struct director *dir, struct director_host *src,
 			 struct director_host *orig_src,
-			 struct mail_host *host);
+			 struct mail_host *host) ATTR_NULL(3);
 void director_update_user(struct director *dir, struct director_host *src,
 			  struct user *user);
 void director_update_user_weak(struct director *dir, struct director_host *src,
 			       struct director_host *orig_src,
-			       struct user *user);
+			       struct user *user) ATTR_NULL(3);
 void director_move_user(struct director *dir, struct director_host *src,
 			struct director_host *orig_src,
-			unsigned int username_hash, struct mail_host *host);
+			unsigned int username_hash, struct mail_host *host)
+	ATTR_NULL(3);
 void director_user_killed(struct director *dir, unsigned int username_hash);
 void director_user_killed_everywhere(struct director *dir,
 				     struct director_host *src,
 				     struct director_host *orig_src,
-				     unsigned int username_hash);
+				     unsigned int username_hash) ATTR_NULL(3);
 void director_user_weak(struct director *dir, struct user *user);
 
 void director_sync_freeze(struct director *dir);
--- a/src/dns/dns-client.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/dns/dns-client.c	Sun Jun 24 00:52:57 2012 +0300
@@ -128,8 +128,7 @@
 
 int main(int argc, char *argv[])
 {
-	master_service = master_service_init("dns-client", 0,
-					     &argc, &argv, NULL);
+	master_service = master_service_init("dns-client", 0, &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 
--- a/src/doveadm/doveadm-director.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/doveadm-director.c	Sun Jun 24 00:52:57 2012 +0300
@@ -205,7 +205,7 @@
 	hash_table_insert(users, POINTER_CAST(user_hash), user);
 }
 
-static void
+static void ATTR_NULL(1)
 userdb_get_user_list(const char *auth_socket_path, pool_t pool,
 		     struct hash_table *users)
 {
@@ -219,7 +219,7 @@
 	}
 
 	conn = auth_master_init(auth_socket_path, 0);
-	ctx = auth_master_user_list_init(conn, NULL, NULL);
+	ctx = auth_master_user_list_init(conn, "", NULL);
 	while ((username = auth_master_user_list_next(ctx)) != NULL)
 		user_list_add(username, pool, users);
 	if (auth_master_user_list_deinit(&ctx) < 0) {
--- a/src/doveadm/doveadm-log.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/doveadm-log.c	Sun Jun 24 00:52:57 2012 +0300
@@ -23,7 +23,8 @@
 #define LOG_ERRORS_FNAME "log-errors"
 #define LOG_TIMESTAMP_FORMAT "%b %d %H:%M:%S"
 
-static void cmd_log_test(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
+static void ATTR_NULL(2)
+cmd_log_test(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
 {
 	struct failure_context ctx;
 	unsigned int i;
--- a/src/doveadm/doveadm-mail-fetch.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/doveadm-mail-fetch.c	Sun Jun 24 00:52:57 2012 +0300
@@ -126,7 +126,7 @@
 		ret = -1;
 	}
 	i_stream_unref(&input);
-	doveadm_print_stream(NULL, 0);
+	doveadm_print_stream("", 0);
 	return ret;
 }
 
@@ -220,7 +220,7 @@
 		i_error("read() failed: %m");
 		ret = -1;
 	}
-	doveadm_print_stream(NULL, 0);
+	doveadm_print_stream("", 0);
 	return ret;
 }
 
@@ -246,7 +246,7 @@
 		i_error("read() failed: %m");
 		ret = -1;
 	}
-	doveadm_print_stream(NULL, 0);
+	doveadm_print_stream("", 0);
 	return ret;
 }
 
@@ -293,7 +293,7 @@
 	message_decoder_deinit(&decoder);
 	(void)message_parser_deinit(&parser, &parts);
 
-	doveadm_print_stream(NULL, 0);
+	doveadm_print_stream("", 0);
 	if (input->stream_errno != 0) {
 		i_error("read() failed: %m");
 		return -1;
--- a/src/doveadm/doveadm-mail-iter.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/doveadm-mail-iter.h	Sun Jun 24 00:52:57 2012 +0300
@@ -10,7 +10,7 @@
 			   enum mail_fetch_field wanted_fields,
 			   const char *const *wanted_headers,
 			   struct mailbox_transaction_context **trans_r,
-			   struct doveadm_mail_iter **iter_r);
+			   struct doveadm_mail_iter **iter_r) ATTR_NULL(5);
 int doveadm_mail_iter_deinit(struct doveadm_mail_iter **iter);
 int doveadm_mail_iter_deinit_sync(struct doveadm_mail_iter **iter);
 int doveadm_mail_iter_deinit_keep_box(struct doveadm_mail_iter **iter,
--- a/src/doveadm/doveadm-mail-mailbox-status.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/doveadm-mail-mailbox-status.c	Sun Jun 24 00:52:57 2012 +0300
@@ -79,9 +79,10 @@
 	}
 }
 
-static void status_output(struct status_cmd_context *ctx, struct mailbox *box,
-			  const struct mailbox_status *status,
-			  const struct mailbox_metadata *metadata)
+static void ATTR_NULL(2)
+status_output(struct status_cmd_context *ctx, struct mailbox *box,
+	      const struct mailbox_status *status,
+	      const struct mailbox_metadata *metadata)
 {
 	if (box != NULL)
 		doveadm_print(mailbox_get_vname(box));
--- a/src/doveadm/dsync/doveadm-dsync.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/dsync/doveadm-dsync.c	Sun Jun 24 00:52:57 2012 +0300
@@ -257,10 +257,10 @@
 			"virtual mailbox hierarchy separator "
 			"(specify separator for the default namespace)");
 	}
-	path1 = mailbox_list_get_path(user->namespaces->list, NULL,
-				      MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	path2 = mailbox_list_get_path(user2->namespaces->list, NULL,
-				      MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	path1 = mailbox_list_get_root_path(user->namespaces->list,
+					   MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	path2 = mailbox_list_get_root_path(user2->namespaces->list,
+					   MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	if (path1 != NULL && path2 != NULL &&
 	    strcmp(path1, path2) == 0) {
 		i_fatal("Both source and destination mail_location "
@@ -347,7 +347,7 @@
 					ctx->sync_type,
 					DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS |
 					DSYNC_BRAIN_FLAG_SEND_REQUESTS,
-					NULL);
+					"");
 
 	if (!ctx->remote)
 		cmd_dsync_run_local(ctx, user, brain, slave2);
--- a/src/doveadm/dsync/dsync-brain.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/dsync/dsync-brain.c	Sun Jun 24 00:52:57 2012 +0300
@@ -66,7 +66,7 @@
 	const char *error;
 
 	i_assert(sync_type != DSYNC_BRAIN_SYNC_TYPE_UNKNOWN);
-	i_assert(sync_type != DSYNC_BRAIN_SYNC_TYPE_STATE || state != NULL);
+	i_assert(sync_type != DSYNC_BRAIN_SYNC_TYPE_STATE || *state != '\0');
 
 	brain = dsync_brain_common_init(user, slave);
 	brain->sync_type = sync_type;
--- a/src/doveadm/dsync/dsync-mailbox-import.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-import.c	Sun Jun 24 00:52:57 2012 +0300
@@ -367,8 +367,9 @@
 	return remote_saved;
 }
 
-static bool dsync_mailbox_try_save(struct dsync_mailbox_importer *importer,
-				   struct dsync_mail_change *save_change)
+static bool ATTR_NULL(2)
+dsync_mailbox_try_save(struct dsync_mailbox_importer *importer,
+		       struct dsync_mail_change *save_change)
 {
 	if (importer->cur_mail_saved) {
 		if (!importer_next_mail(importer, 0) && save_change == NULL)
--- a/src/doveadm/dsync/dsync-slave-io.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/dsync/dsync-slave-io.c	Sun Jun 24 00:52:57 2012 +0300
@@ -275,7 +275,7 @@
 	slave->io = io_add(slave->fd_in, IO_READ, dsync_slave_io_input, slave);
 	o_stream_set_flush_callback(slave->output, dsync_slave_io_output, slave);
 	slave->to = timeout_add(DSYNC_SLAVE_IO_TIMEOUT_MSECS,
-				dsync_slave_io_timeout, NULL);
+				dsync_slave_io_timeout, slave);
 	o_stream_cork(slave->output);
 	o_stream_send_str(slave->output, DSYNC_HANDSHAKE_VERSION);
 
@@ -362,7 +362,7 @@
 	return 1;
 }
 
-static void ATTR_FORMAT(3, 4)
+static void ATTR_FORMAT(3, 4) ATTR_NULL(2)
 dsync_slave_input_error(struct dsync_slave_io *slave,
 			struct dsync_deserializer_decoder *decoder,
 			const char *fmt, ...)
--- a/src/doveadm/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/doveadm/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -70,7 +70,7 @@
 	};
 	const char *error;
 
-	master_service = master_service_init("doveadm", 0, &argc, &argv, NULL);
+	master_service = master_service_init("doveadm", 0, &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 
--- a/src/imap-login/client.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap-login/client.c	Sun Jun 24 00:52:57 2012 +0300
@@ -427,7 +427,7 @@
 	imap_client->skip_line = FALSE;
 }
 
-static void
+static void ATTR_NULL(3)
 client_send_reply_raw(struct client *client,
 		      const char *prefix, const char *resp_code,
 		      const char *text, bool tagged)
--- a/src/imap-login/client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap-login/client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -40,6 +40,6 @@
 
 void client_send_reply_code(struct client *client,
 			    enum imap_cmd_reply reply, const char *resp_code,
-			    const char *text);
+			    const char *text) ATTR_NULL(3);
 
 #endif
--- a/src/imap/cmd-append.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/cmd-append.c	Sun Jun 24 00:52:57 2012 +0300
@@ -352,7 +352,7 @@
 {
 	struct cmd_append_context *ctx = cmd->context;
 
-	i_stream_chain_append(ctx->catchain, NULL);
+	i_stream_chain_append_eof(ctx->catchain);
 	i_stream_unref(&ctx->input);
 	ctx->catenate = FALSE;
 
--- a/src/imap/cmd-expunge.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/cmd-expunge.c	Sun Jun 24 00:52:57 2012 +0300
@@ -19,8 +19,9 @@
 	return TRUE;
 }
 
-static bool cmd_expunge_finish(struct client_command_context *cmd,
-			       struct mail_search_args *search_args)
+static bool ATTR_NULL(2)
+cmd_expunge_finish(struct client_command_context *cmd,
+		   struct mail_search_args *search_args)
 {
 	struct client *client = cmd->client;
 	int ret;
--- a/src/imap/imap-client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -170,7 +170,7 @@
 			     struct mail_user *user,
 			     struct mail_storage_service_user *service_user,
 			     const struct imap_settings *set);
-void client_destroy(struct client *client, const char *reason);
+void client_destroy(struct client *client, const char *reason) ATTR_NULL(2);
 
 /* Disconnect client connection */
 void client_disconnect(struct client *client, const char *reason);
--- a/src/imap/imap-commands-util.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-commands-util.h	Sun Jun 24 00:52:57 2012 +0300
@@ -49,7 +49,8 @@
 void client_send_mailbox_flags(struct client *client, bool selecting);
 /* Update client->keywords array. Use keywords=NULL when unselecting. */
 void client_update_mailbox_flags(struct client *client,
-				 const ARRAY_TYPE(keywords) *keywords);
+				 const ARRAY_TYPE(keywords) *keywords)
+	ATTR_NULL(2);
 /* Convert keyword indexes to keyword names in selected mailbox. */
 const char *const *
 client_get_keyword_names(struct client *client, ARRAY_TYPE(keywords) *dest,
--- a/src/imap/imap-expunge.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-expunge.h	Sun Jun 24 00:52:57 2012 +0300
@@ -3,6 +3,7 @@
 
 struct mail_search_arg;
 
-int imap_expunge(struct mailbox *box, struct mail_search_arg *next_search_arg);
+int imap_expunge(struct mailbox *box, struct mail_search_arg *next_search_arg)
+	ATTR_NULL(2);
 
 #endif
--- a/src/imap/imap-fetch-body.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-fetch-body.c	Sun Jun 24 00:52:57 2012 +0300
@@ -295,8 +295,9 @@
 	return TRUE;
 }
 
-static int fetch_rfc822_size(struct imap_fetch_context *ctx, struct mail *mail,
-			     void *context ATTR_UNUSED)
+static int ATTR_NULL(3)
+fetch_rfc822_size(struct imap_fetch_context *ctx, struct mail *mail,
+		  void *context ATTR_UNUSED)
 {
 	uoff_t size;
 
@@ -325,8 +326,9 @@
 	return 0;
 }
 
-static int fetch_rfc822(struct imap_fetch_context *ctx, struct mail *mail,
-			void *context ATTR_UNUSED)
+static int ATTR_NULL(3)
+fetch_rfc822(struct imap_fetch_context *ctx, struct mail *mail,
+	     void *context ATTR_UNUSED)
 {
 	struct imap_msgpart *msgpart;
 	const char *str;
@@ -345,8 +347,9 @@
 	return ctx->cont_handler(ctx);
 }
 
-static int fetch_rfc822_header(struct imap_fetch_context *ctx,
-			       struct mail *mail, void *context ATTR_UNUSED)
+static int ATTR_NULL(3)
+fetch_rfc822_header(struct imap_fetch_context *ctx,
+		    struct mail *mail, void *context ATTR_UNUSED)
 {
 	struct imap_msgpart *msgpart;
 	const char *str;
@@ -366,8 +369,9 @@
 	return ctx->cont_handler(ctx);
 }
 
-static int fetch_rfc822_text(struct imap_fetch_context *ctx, struct mail *mail,
-			     void *context ATTR_UNUSED)
+static int ATTR_NULL(3)
+fetch_rfc822_text(struct imap_fetch_context *ctx, struct mail *mail,
+		  void *context ATTR_UNUSED)
 {
 	struct imap_msgpart *msgpart;
 	const char *str;
--- a/src/imap/imap-fetch.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-fetch.h	Sun Jun 24 00:52:57 2012 +0300
@@ -88,7 +88,8 @@
 void imap_fetch_add_handler(struct imap_fetch_init_context *ctx,
 			    enum imap_fetch_handler_flags flags,
 			    const char *nil_reply,
-			    imap_fetch_handler_t *handler, void *context);
+			    imap_fetch_handler_t *handler, void *context)
+	ATTR_NULL(3, 5);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define imap_fetch_add_handler(ctx, flags, nil_reply, handler, context) \
 	({(void)(1 ? 0 : handler((struct imap_fetch_context *)NULL, \
--- a/src/imap/imap-search.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-search.h	Sun Jun 24 00:52:57 2012 +0300
@@ -50,6 +50,6 @@
 
 bool imap_search_start(struct imap_search_context *ctx,
 		       struct mail_search_args *sargs,
-		       const enum mail_sort_type *sort_program);
+		       const enum mail_sort_type *sort_program) ATTR_NULL(3);
 
 #endif
--- a/src/imap/imap-sync.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/imap/imap-sync.c	Sun Jun 24 00:52:57 2012 +0300
@@ -607,7 +607,7 @@
 	return TRUE;
 }
 
-static bool
+static bool ATTR_NULL(4, 5)
 cmd_sync_full(struct client_command_context *cmd, enum mailbox_sync_flags flags,
 	      enum imap_sync_flags imap_flags, const char *tagline,
 	      imap_sync_callback_t *callback)
--- a/src/indexer/indexer.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/indexer/indexer.c	Sun Jun 24 00:52:57 2012 +0300
@@ -120,7 +120,7 @@
 {
 	const char *error;
 
-	master_service = master_service_init("indexer", 0, &argc, &argv, NULL);
+	master_service = master_service_init("indexer", 0, &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 
--- a/src/indexer/master-connection.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/indexer/master-connection.c	Sun Jun 24 00:52:57 2012 +0300
@@ -33,7 +33,7 @@
 	unsigned int version_received:1;
 };
 
-static void
+static void ATTR_NULL(1, 2)
 indexer_worker_refresh_proctitle(const char *username, const char *mailbox,
 				 uint32_t seq1, uint32_t seq2)
 {
--- a/src/ipc/client.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/ipc/client.c	Sun Jun 24 00:52:57 2012 +0300
@@ -83,8 +83,7 @@
 		if (strcmp(id, "*") == 0) {
 			/* send to everyone */
 			if (group == NULL) {
-				client_cmd_input(IPC_CMD_STATUS_OK,
-						 NULL, client);
+				client_cmd_input(IPC_CMD_STATUS_OK, "", client);
 			} else {
 				ret = ipc_group_cmd(group, data,
 						    client_cmd_input, client);
--- a/src/ipc/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/ipc/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -38,7 +38,7 @@
 	const char *error;
 
 	master_service = master_service_init("ipc", service_flags,
-					     &argc, &argv, NULL);
+					     &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 	if (master_service_settings_read_simple(master_service,
--- a/src/lib-auth/auth-client-request.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-auth/auth-client-request.c	Sun Jun 24 00:52:57 2012 +0300
@@ -124,10 +124,11 @@
 		i_error("Error sending continue request to auth server: %m");
 }
 
-static void call_callback(struct auth_client_request *request,
-			  enum auth_request_status status,
-			  const char *data_base64,
-			  const char *const *args)
+static void ATTR_NULL(3, 4)
+call_callback(struct auth_client_request *request,
+	      enum auth_request_status status,
+	      const char *data_base64,
+	      const char *const *args)
 {
 	auth_request_callback_t *callback = request->callback;
 
--- a/src/lib-auth/auth-client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-auth/auth-client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -67,7 +67,7 @@
 bool auth_client_is_disconnected(struct auth_client *client);
 void auth_client_set_connect_notify(struct auth_client *client,
 				    auth_connect_notify_callback_t *callback,
-				    void *context);
+				    void *context) ATTR_NULL(2, 3);
 const struct auth_mech_desc *
 auth_client_get_available_mechs(struct auth_client *client,
 				unsigned int *mech_count);
@@ -84,7 +84,8 @@
 struct auth_client_request *
 auth_client_request_new(struct auth_client *client,
 			const struct auth_request_info *request_info,
-			auth_request_callback_t *callback, void *context);
+			auth_request_callback_t *callback, void *context)
+	ATTR_NULL(4);
 /* Continue authentication. Call when
    reply->result == AUTH_CLIENT_REQUEST_CONTINUE */
 void auth_client_request_continue(struct auth_client_request *request,
--- a/src/lib-auth/auth-master.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-auth/auth-master.c	Sun Jun 24 00:52:57 2012 +0300
@@ -615,7 +615,7 @@
 	str = t_str_new(128);
 	str_printfa(str, "LIST\t%u",
 		    auth_master_next_request_id(conn));
-	if (user_mask != NULL && *user_mask != '\0')
+	if (*user_mask != '\0')
 		str_printfa(str, "\tuser=%s", user_mask);
 	if (info != NULL)
 		auth_user_info_export(str, info);
--- a/src/lib-auth/auth-master.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-auth/auth-master.h	Sun Jun 24 00:52:57 2012 +0300
@@ -50,7 +50,7 @@
 struct auth_master_user_list_ctx *
 auth_master_user_list_init(struct auth_master_connection *conn,
 			   const char *user_mask,
-			   const struct auth_user_info *info);
+			   const struct auth_user_info *info) ATTR_NULL(3);
 const char *auth_master_user_list_next(struct auth_master_user_list_ctx *ctx);
 unsigned int auth_master_user_list_count(struct auth_master_user_list_ctx *ctx);
 /* Returns -1 if anything failed, 0 if ok */
--- a/src/lib-dict/dict.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-dict/dict.h	Sun Jun 24 00:52:57 2012 +0300
@@ -67,7 +67,7 @@
    result. */
 void dict_transaction_commit_async(struct dict_transaction_context **ctx,
 				   dict_transaction_commit_callback_t *callback,
-				   void *context);
+				   void *context) ATTR_NULL(2, 3);
 /* Rollback all changes made in transaction. */
 void dict_transaction_rollback(struct dict_transaction_context **ctx);
 
--- a/src/lib-dns/dns-lookup.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-dns/dns-lookup.h	Sun Jun 24 00:52:57 2012 +0300
@@ -30,7 +30,7 @@
    function. */
 int dns_lookup(const char *host, const struct dns_lookup_settings *set,
 	       struct dns_lookup **lookup_r,
-	       dns_lookup_callback_t *callback, void *context);
+	       dns_lookup_callback_t *callback, void *context) ATTR_NULL(5);
 #define dns_lookup(host, set, callback, context, lookup_r) \
 	CONTEXT_CALLBACK2(dns_lookup, dns_lookup_callback_t, \
 			  callback, const struct dns_lookup_result *, \
--- a/src/lib-imap-client/imapc-connection.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap-client/imapc-connection.h	Sun Jun 24 00:52:57 2012 +0300
@@ -23,7 +23,7 @@
 
 void imapc_connection_connect(struct imapc_connection *conn,
 			      imapc_command_callback_t *login_callback,
-			      void *login_context);
+			      void *login_context) ATTR_NULL(2, 3);
 void imapc_connection_disconnect(struct imapc_connection *conn);
 void imapc_connection_abort_commands(struct imapc_connection *conn,
 				     bool disconnected, bool keep_retriable);
@@ -32,7 +32,8 @@
 
 struct imapc_command *
 imapc_connection_cmd(struct imapc_connection *conn,
-		     imapc_command_callback_t *callback, void *context);
+		     imapc_command_callback_t *callback, void *context)
+	ATTR_NULL(3);
 
 void imapc_connection_unselect(struct imapc_client_mailbox *box);
 
--- a/src/lib-imap-storage/imap-msgpart.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap-storage/imap-msgpart.c	Sun Jun 24 00:52:57 2012 +0300
@@ -312,6 +312,7 @@
 	const char *const *hdr_fields = msgpart->headers;
 	unsigned int hdr_count = str_array_length(hdr_fields);
 	struct istream *input;
+	bool has_nuls;
 
 	if (msgpart->fetch_type == FETCH_HEADER_FIELDS) {
 		input = i_stream_create_header_filter(mail_input,
@@ -328,7 +329,7 @@
 						      null_header_filter_callback, NULL);
 	}
 
-	if (message_get_header_size(input, hdr_size_r, NULL) < 0) {
+	if (message_get_header_size(input, hdr_size_r, &has_nuls) < 0) {
 		errno = input->stream_errno;
 		mail_storage_set_critical(mail->box->storage,
 			"read(%s) failed: %m", i_stream_get_name(mail_input));
--- a/src/lib-imap/imap-base-subject.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap/imap-base-subject.c	Sun Jun 24 00:52:57 2012 +0300
@@ -65,8 +65,7 @@
 			size--;
 		else if (size >= 5 &&
 			 memcmp(data + size - 5, "(FWD)", 5) == 0) {
-			if (is_reply_or_forward_r != NULL)
-				*is_reply_or_forward_r = TRUE;
+			*is_reply_or_forward_r = TRUE;
 			size -= 5;
 		} else {
 			break;
@@ -150,8 +149,7 @@
 
 	data++;
 	*start_pos += (size_t)(data - orig_data);
-	if (is_reply_or_forward_r != NULL)
-		*is_reply_or_forward_r = TRUE;
+	*is_reply_or_forward_r = TRUE;
 	return TRUE;
 }
 
@@ -187,8 +185,7 @@
 	if (data[size-2] != ']')
 		return FALSE;
 
-	if (is_reply_or_forward_r != NULL)
-		*is_reply_or_forward_r = TRUE;
+	*is_reply_or_forward_r = TRUE;
 
 	buffer_set_used_size(buf, size-2);
 	buffer_append_c(buf, '\0');
@@ -204,8 +201,7 @@
 	size_t start_pos, subject_len;
 	bool found;
 
-	if (is_reply_or_forward_r != NULL)
-		*is_reply_or_forward_r = FALSE;
+	*is_reply_or_forward_r = FALSE;
 
 	subject_len = strlen(subject);
 	buf = buffer_create_dynamic(pool, subject_len);
--- a/src/lib-imap/imap-parser.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap/imap-parser.c	Sun Jun 24 00:52:57 2012 +0300
@@ -473,7 +473,7 @@
 	} else {
 		/* we want to save only literal size, not the literal itself. */
 		parser->literal_size_return = TRUE;
-		imap_parser_save_arg(parser, NULL, 0);
+		imap_parser_save_arg(parser, &uchar_nul, 0);
 		return FALSE;
 	}
 }
--- a/src/lib-imap/imap-parser.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap/imap-parser.h	Sun Jun 24 00:52:57 2012 +0300
@@ -38,7 +38,7 @@
    2 * max_line_size. */
 struct imap_parser *
 imap_parser_create(struct istream *input, struct ostream *output,
-		   size_t max_line_size);
+		   size_t max_line_size) ATTR_NULL(2);
 void imap_parser_ref(struct imap_parser *parser);
 void imap_parser_unref(struct imap_parser **parser);
 
@@ -47,7 +47,7 @@
 
 /* Change parser's input and output streams */
 void imap_parser_set_streams(struct imap_parser *parser, struct istream *input,
-			     struct ostream *output);
+			     struct ostream *output) ATTR_NULL(3);
 
 /* Return the last error in parser. fatal is set to TRUE if there's no way to
    continue parsing, currently only if too large non-sync literal size was
--- a/src/lib-imap/imap-url.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap/imap-url.c	Sun Jun 24 00:52:57 2012 +0300
@@ -284,6 +284,7 @@
 	const char *p, *q, *data;
 	buffer_t *uauth_token;
 	time_t expire = (time_t)-1;
+	int tz;
 
 	/* iurlauth         = iurlauth-rump iua-verifier
 	 * enc-urlauth      = 32*HEXDIG
@@ -306,7 +307,7 @@
 
 		if ((p = strchr(urlext+8, ';')) != NULL) {
 			if (!iso8601_date_parse((const unsigned char *)urlext+8,
-						p-urlext-8, &expire, NULL)) {
+						p-urlext-8, &expire, &tz)) {
 				parser->error = "invalid date-time for `;EXPIRE='";
 				return -1;
 			}
--- a/src/lib-imap/imap-util.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-imap/imap-util.h	Sun Jun 24 00:52:57 2012 +0300
@@ -8,7 +8,7 @@
 
 /* Write flags as a space separated string. */
 void imap_write_flags(string_t *dest, enum mail_flags flags,
-		      const char *const *keywords);
+		      const char *const *keywords) ATTR_NULL(3);
 /* Parse system flag from a string, or return 0 if it's invalid. */
 enum mail_flags imap_parse_system_flag(const char *str);
 
--- a/src/lib-index/mail-cache-lookup.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-cache-lookup.c	Sun Jun 24 00:52:57 2012 +0300
@@ -61,9 +61,10 @@
 	struct mail_index_map *map;
 	const void *data;
 	uint32_t offset;
+	bool expunged;
 
 	mail_index_lookup_ext_full(view, seq, cache->ext_id,
-				   &map, &data, NULL);
+				   &map, &data, &expunged);
 	if (data == NULL) {
 		/* no cache offsets */
 		return 0;
--- a/src/lib-index/mail-cache-transaction.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-cache-transaction.c	Sun Jun 24 00:52:57 2012 +0300
@@ -594,8 +594,7 @@
 	*offset_r = ctx->reserved_space_offset;
 	ctx->reserved_space_offset += size;
 	ctx->reserved_space -= size;
-	if (available_space_r != NULL)
-		*available_space_r = size;
+	*available_space_r = size;
 	i_assert((size & 3) == 0);
 
 	if (size == max_size && commit) {
@@ -829,11 +828,11 @@
 			       const buffer_t *buffer)
 {
 	struct mail_cache *cache = ctx->cache;
-	size_t size = buffer->used;
+	size_t max_size, size = buffer->used;
 	uint32_t offset, hdr_offset;
 
 	if (mail_cache_transaction_get_space(ctx, size, size,
-					     &offset, NULL, TRUE) <= 0)
+					     &offset, &max_size, TRUE) <= 0)
 		return -1;
 
 	if (mail_cache_write(cache, buffer->data, size, offset) < 0)
--- a/src/lib-index/mail-index-alloc-cache.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index-alloc-cache.c	Sun Jun 24 00:52:57 2012 +0300
@@ -174,7 +174,8 @@
 		timeout_remove(&to_index);
 }
 
-static void index_removal_timeout(void *context ATTR_UNUSED)
+static void ATTR_NULL(1)
+index_removal_timeout(void *context ATTR_UNUSED)
 {
 	destroy_unrefed(FALSE);
 }
--- a/src/lib-index/mail-index-alloc-cache.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index-alloc-cache.h	Sun Jun 24 00:52:57 2012 +0300
@@ -2,7 +2,7 @@
 #define MAIL_INDEX_ALLOC_CACHE_H
 
 /* If using in-memory indexes, give index_dir=NULL. */
-struct mail_index *
+struct mail_index * ATTR_NULL(1, 2)
 mail_index_alloc_cache_get(const char *mailbox_path,
 			   const char *index_dir, const char *prefix);
 void mail_index_alloc_cache_unref(struct mail_index **index);
--- a/src/lib-index/mail-index-map-hdr.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index-map-hdr.c	Sun Jun 24 00:52:57 2012 +0300
@@ -10,7 +10,7 @@
 	const struct mail_index_ext_header *ext_hdr;
 	unsigned int i, old_count, offset;
 	const char *name, *error;
-	uint32_t ext_id, ext_offset;
+	uint32_t ext_id, ext_map_idx, ext_offset;
 
 	/* extension headers always start from 64bit offsets, so if base header
 	   doesn't happen to be 64bit aligned we'll skip some bytes */
@@ -45,7 +45,7 @@
 					     index->filepath, i, name, error);
 			return -1;
 		}
-		if (mail_index_map_lookup_ext(map, name, NULL)) {
+		if (mail_index_map_lookup_ext(map, name, &ext_map_idx)) {
 			mail_index_set_error(index, "Corrupted index file %s: "
 				"Duplicate header extension %s",
 				index->filepath, name);
--- a/src/lib-index/mail-index-map.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index-map.c	Sun Jun 24 00:52:57 2012 +0300
@@ -50,10 +50,7 @@
 
 	array_foreach(&map->extensions, ext) {
 		if (strcmp(ext->name, name) == 0) {
-			if (idx_r != NULL) {
-				*idx_r = array_foreach_idx(&map->extensions,
-							   ext);
-			}
+			*idx_r = array_foreach_idx(&map->extensions, ext);
 			return TRUE;
 		}
 	}
@@ -72,7 +69,7 @@
 			    const struct mail_index_ext_header *ext_hdr)
 {
 	struct mail_index_ext *ext;
-	uint32_t idx, empty_idx = (uint32_t)-1;
+	uint32_t idx, ext_map_idx, empty_idx = (uint32_t)-1;
 
 	if (!array_is_created(&map->extensions)) {
                 mail_index_map_init_extbufs(map, 5);
@@ -80,7 +77,7 @@
 	} else {
 		idx = array_count(&map->extensions);
 	}
-	i_assert(!mail_index_map_lookup_ext(map, name, NULL));
+	i_assert(!mail_index_map_lookup_ext(map, name, &ext_map_idx));
 
 	ext = array_append_space(&map->extensions);
 	ext->name = p_strdup(map->extension_pool, name);
--- a/src/lib-index/mail-index-util.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index-util.h	Sun Jun 24 00:52:57 2012 +0300
@@ -15,6 +15,6 @@
 				 uint32_t seq, unsigned int *idx_r);
 bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq,
 			      const void *record, size_t record_size,
-			      void *old_record);
+			      void *old_record) ATTR_NULL(5);
 
 #endif
--- a/src/lib-index/mail-index-view.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index-view.c	Sun Jun 24 00:52:57 2012 +0300
@@ -275,16 +275,17 @@
 {
 	const unsigned int *keyword_idx_map;
 	unsigned int i, j, keyword_count, index_idx;
-	uint32_t idx;
-	uint16_t record_size;
+	uint32_t idx, hdr_size;
+	uint16_t record_size, record_align;
 
 	array_clear(keyword_idx);
 	if (data == NULL) {
 		/* no keywords at all in index */
 		return;
 	}
-	(void)mail_index_ext_get_size(NULL, map->index->keywords_ext_id,
-				      map, NULL, &record_size, NULL);
+	(void)mail_index_ext_get_size(map, map->index->keywords_ext_id,
+				      &hdr_size, &record_size,
+				      &record_align);
 
 	/* keyword_idx_map[] contains file => index keyword mapping */
 	if (!array_is_created(&map->keyword_idx_map))
@@ -318,9 +319,10 @@
 {
 	struct mail_index_map *map;
 	const void *data;
+	bool expunged;
 
 	mail_index_lookup_ext_full(view, seq, view->index->keywords_ext_id,
-				   &map, &data, NULL);
+				   &map, &data, &expunged);
 	mail_index_data_lookup_keywords(map, data, keyword_idx);
 }
 
@@ -523,11 +525,6 @@
 				uint32_t ext_id, struct mail_index_map **map_r,
 				const void **data_r, bool *expunged_r)
 {
-	bool expunged;
-
-	if (expunged_r == NULL)
-		expunged_r = &expunged;
-
 	view->v.lookup_ext_full(view, seq, ext_id, map_r, data_r, expunged_r);
 }
 
@@ -551,8 +548,7 @@
 	return view->v.ext_get_reset_id(view, map, ext_id, reset_id_r);
 }
 
-void mail_index_ext_get_size(struct mail_index_view *view ATTR_UNUSED,
-			     uint32_t ext_id, struct mail_index_map *map,
+void mail_index_ext_get_size(struct mail_index_map *map, uint32_t ext_id,
 			     uint32_t *hdr_size_r, uint16_t *record_size_r,
 			     uint16_t *record_align_r)
 {
@@ -563,22 +559,16 @@
 
 	if (!mail_index_map_get_ext_idx(map, ext_id, &idx)) {
 		/* extension doesn't exist in this index file */
-		if (hdr_size_r != NULL)
-			*hdr_size_r = 0;
-		if (record_size_r != NULL)
-			*record_size_r = 0;
-		if (record_align_r != NULL)
-			*record_align_r = 0;
+		*hdr_size_r = 0;
+		*record_size_r = 0;
+		*record_align_r = 0;
 		return;
 	}
 
 	ext = array_idx(&map->extensions, idx);
-	if (hdr_size_r != NULL)
-		*hdr_size_r = ext->hdr_size;
-	if (record_size_r != NULL)
-		*record_size_r = ext->record_size;
-	if (record_align_r != NULL)
-		*record_align_r = ext->record_align;
+	*hdr_size_r = ext->hdr_size;
+	*record_size_r = ext->record_size;
+	*record_align_r = ext->record_align;
 }
 
 static struct mail_index_view_vfuncs view_vfuncs = {
--- a/src/lib-index/mail-index.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index.c	Sun Jun 24 00:52:57 2012 +0300
@@ -251,13 +251,13 @@
 bool mail_index_keyword_lookup(struct mail_index *index,
 			       const char *keyword, unsigned int *idx_r)
 {
-	void *value;
+	void *key, *value;
 
 	/* keywords_hash keeps a name => index mapping of keywords.
 	   Keywords are never removed from it, so the index values are valid
 	   for the lifetime of the mail_index. */
 	if (hash_table_lookup_full(index->keywords_hash, keyword,
-				   NULL, &value)) {
+				   &key, &value)) {
 		*idx_r = POINTER_CAST_TO(value, unsigned int);
 		return TRUE;
 	}
--- a/src/lib-index/mail-index.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-index/mail-index.h	Sun Jun 24 00:52:57 2012 +0300
@@ -485,7 +485,7 @@
 /* Create a keyword list structure. */
 struct mail_keywords *
 mail_index_keywords_create(struct mail_index *index,
-			   const char *const keywords[]);
+			   const char *const keywords[]) ATTR_NULL(2);
 struct mail_keywords *
 mail_index_keywords_create_from_indexes(struct mail_index *index,
 					const ARRAY_TYPE(keyword_indexes)
@@ -573,8 +573,7 @@
 				const void **data_r, bool *expunged_r);
 /* Get current extension sizes. Returns 1 if ok, 0 if extension doesn't exist
    in view. Any of the _r parameters may be NULL. */
-void mail_index_ext_get_size(struct mail_index_view *view,
-			     uint32_t ext_id, struct mail_index_map *map,
+void mail_index_ext_get_size(struct mail_index_map *map, uint32_t ext_id,
 			     uint32_t *hdr_size_r, uint16_t *record_size_r,
 			     uint16_t *record_align_r);
 /* Update extension header field. */
@@ -585,7 +584,8 @@
    was already updated in this transaction, it's set to contain the data it's
    now overwriting. */
 void mail_index_update_ext(struct mail_index_transaction *t, uint32_t seq,
-			   uint32_t ext_id, const void *data, void *old_data);
+			   uint32_t ext_id, const void *data, void *old_data)
+	ATTR_NULL(5);
 /* Increase/decrease number in extension atomically. Returns the sum of the
    diffs for this seq. */
 int mail_index_atomic_inc_ext(struct mail_index_transaction *t,
--- a/src/lib-lda/mail-deliver.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-lda/mail-deliver.h	Sun Jun 24 00:52:57 2012 +0300
@@ -87,7 +87,7 @@
 			   enum mail_error *error_r, const char **error_str_r);
 int mail_deliver_save(struct mail_deliver_context *ctx, const char *mailbox,
 		      enum mail_flags flags, const char *const *keywords,
-		      struct mail_storage **storage_r);
+		      struct mail_storage **storage_r) ATTR_NULL(4);
 void mail_deliver_deduplicate_guid_if_needed(struct mail_deliver_session *session,
 					     struct mail_save_context *save_ctx);
 
--- a/src/lib-lda/smtp-client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-lda/smtp-client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -3,7 +3,7 @@
 
 #include <stdio.h>
 
-struct smtp_client *
+struct smtp_client * ATTR_NULL(3)
 smtp_client_open(const struct lda_settings *set, const char *destination,
 		 const char *return_path, struct ostream **output_r);
 /* Returns sysexits-compatible return value */
--- a/src/lib-mail/istream-binary-converter.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/istream-binary-converter.c	Sun Jun 24 00:52:57 2012 +0300
@@ -219,7 +219,7 @@
 	if (block.part != bstream->convert_part &&
 	    bstream->convert_part != NULL) {
 		/* end of base64 encoded part */
-		stream_encode_base64(bstream, NULL, 0);
+		stream_encode_base64(bstream, "", 0);
 	}
 
 	if (block.hdr != NULL) {
--- a/src/lib-mail/istream-dot.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/istream-dot.c	Sun Jun 24 00:52:57 2012 +0300
@@ -24,7 +24,7 @@
 static int i_stream_dot_read_some(struct dot_istream *dstream)
 {
 	struct istream_private *stream = &dstream->istream;
-	size_t size;
+	size_t size, avail;
 	ssize_t ret;
 
 	(void)i_stream_get_data(stream->parent, &size);
@@ -44,7 +44,7 @@
 		i_assert(size != 0);
 	}
 
-	if (!i_stream_get_buffer_space(stream, size, NULL))
+	if (!i_stream_get_buffer_space(stream, size, &avail))
 		return -2;
 	return 1;
 }
@@ -109,11 +109,11 @@
 	/* @UNSAFE */
 	struct dot_istream *dstream = (struct dot_istream *)stream;
 	const unsigned char *data;
-	size_t i, dest, size;
+	size_t i, dest, size, avail;
 	ssize_t ret, ret1;
 
 	if (dstream->pending[0] != '\0') {
-		if (!i_stream_get_buffer_space(stream, 1, NULL))
+		if (!i_stream_get_buffer_space(stream, 1, &avail))
 			return -2;
 		dest = stream->pos;
 		(void)flush_pending(dstream, &dest);
--- a/src/lib-mail/istream-header-filter.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/istream-header-filter.h	Sun Jun 24 00:52:57 2012 +0300
@@ -30,7 +30,8 @@
 			      enum header_filter_flags flags,
 			      const char *const *headers,
 			      unsigned int headers_count,
-			      header_filter_callback *callback, void *context);
+			      header_filter_callback *callback, void *context)
+	ATTR_NULL(6);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define i_stream_create_header_filter(input, flags, headers, headers_count, \
 				        callback, context) \
--- a/src/lib-mail/message-header-parser.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/message-header-parser.h	Sun Jun 24 00:52:57 2012 +0300
@@ -45,7 +45,7 @@
 
 struct message_header_parser_ctx *
 message_parse_header_init(struct istream *input, struct message_size *hdr_size,
-			  enum message_header_parser_flags flags);
+			  enum message_header_parser_flags flags) ATTR_NULL(2);
 void message_parse_header_deinit(struct message_header_parser_ctx **ctx);
 
 /* Read and return next header line. Returns 1 if header is returned, 0 if
@@ -61,7 +61,8 @@
 /* Read and parse the header from the given stream. */
 void message_parse_header(struct istream *input, struct message_size *hdr_size,
 			  enum message_header_parser_flags flags,
-			  message_header_callback_t *callback, void *context);
+			  message_header_callback_t *callback, void *context)
+	ATTR_NULL(2);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define message_parse_header(input, hdr_size, flags, callback, context) \
 	({(void)(1 ? 0 : callback((struct message_header_line *)0, context)); \
--- a/src/lib-mail/message-parser.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/message-parser.h	Sun Jun 24 00:52:57 2012 +0300
@@ -97,7 +97,7 @@
 void message_parser_parse_header(struct message_parser_ctx *ctx,
 				 struct message_size *hdr_size,
 				 message_part_header_callback_t *callback,
-				 void *context);
+				 void *context) ATTR_NULL(4);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define message_parser_parse_header(ctx, hdr_size, callback, context) \
 	({(void)(1 ? 0 : callback((struct message_part *)0, \
@@ -115,7 +115,7 @@
    for the body content. */
 void message_parser_parse_body(struct message_parser_ctx *ctx,
 			       message_part_header_callback_t *hdr_callback,
-			       void *context);
+			       void *context) ATTR_NULL(3);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define message_parser_parse_body(ctx, callback, context) \
 	({(void)(1 ? 0 : callback((struct message_part *)0, \
--- a/src/lib-mail/message-part-serialize.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/message-part-serialize.c	Sun Jun 24 00:52:57 2012 +0300
@@ -115,7 +115,7 @@
 	return TRUE;
 }
 
-static bool
+static bool ATTR_NULL(2)
 message_part_deserialize_part(struct deserialize_context *ctx,
 			      struct message_part *parent,
 			      unsigned int siblings,
--- a/src/lib-mail/message-search.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/message-search.h	Sun Jun 24 00:52:57 2012 +0300
@@ -29,6 +29,7 @@
 /* Search a full message. Returns 1 if match was found, 0 if not,
    -1 if error (if stream_error == 0, the parts contained broken data) */
 int message_search_msg(struct message_search_context *ctx,
-		       struct istream *input, struct message_part *parts);
+		       struct istream *input, struct message_part *parts)
+	ATTR_NULL(3);
 
 #endif
--- a/src/lib-mail/message-size.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/message-size.c	Sun Jun 24 00:52:57 2012 +0300
@@ -6,22 +6,21 @@
 #include "message-size.h"
 
 int message_get_header_size(struct istream *input, struct message_size *hdr,
-			    bool *has_nuls)
+			    bool *has_nuls_r)
 {
 	const unsigned char *msg;
 	size_t i, size, startpos, missing_cr_count;
 	int ret;
 
 	memset(hdr, 0, sizeof(struct message_size));
-	if (has_nuls != NULL)
-		*has_nuls = FALSE;
+	*has_nuls_r = FALSE;
 
 	missing_cr_count = 0; startpos = 0;
 	while (i_stream_read_data(input, &msg, &size, startpos) > 0) {
 		for (i = startpos; i < size; i++) {
 			if (msg[i] != '\n') {
-				if (msg[i] == '\0' && has_nuls != NULL)
-					*has_nuls = TRUE;
+				if (msg[i] == '\0')
+					*has_nuls_r = TRUE;
 				continue;
 			}
 
@@ -65,15 +64,14 @@
 }
 
 int message_get_body_size(struct istream *input, struct message_size *body,
-			  bool *has_nuls)
+			  bool *has_nuls_r)
 {
 	const unsigned char *msg;
 	size_t i, size, missing_cr_count;
 	int ret;
 
 	memset(body, 0, sizeof(struct message_size));
-	if (has_nuls != NULL)
-		*has_nuls = FALSE;
+	*has_nuls_r = FALSE;
 
 	missing_cr_count = 0;
 	if ((ret = i_stream_read_data(input, &msg, &size, 0)) <= 0)
@@ -97,8 +95,7 @@
 				   at virtual \r */
 				body->lines++;
 			} else if (msg[i] == '\0') {
-				if (has_nuls != NULL)
-					*has_nuls = TRUE;
+				*has_nuls_r = TRUE;
 			}
 		}
 
--- a/src/lib-mail/message-size.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/message-size.h	Sun Jun 24 00:52:57 2012 +0300
@@ -10,10 +10,10 @@
 /* Calculate size of message header. Leave the input point to first
    character in body. */
 int message_get_header_size(struct istream *input, struct message_size *hdr,
-			    bool *has_nuls);
+			    bool *has_nuls_r);
 /* Calculate size of message body. */
 int message_get_body_size(struct istream *input, struct message_size *body,
-			  bool *has_nuls);
+			  bool *has_nuls_r);
 
 /* Sum contents of src into dest. */
 void message_size_add(struct message_size *dest,
--- a/src/lib-mail/rfc822-parser.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/rfc822-parser.h	Sun Jun 24 00:52:57 2012 +0300
@@ -15,7 +15,7 @@
 /* Parse given data using RFC 822 token parser. */
 void rfc822_parser_init(struct rfc822_parser_context *ctx,
 			const unsigned char *data, size_t size,
-			string_t *last_comment);
+			string_t *last_comment) ATTR_NULL(4);
 
 /* The functions below return 1 = more data available, 0 = no more data
    available (but a value might have been returned now), -1 = invalid input.
--- a/src/lib-mail/test-istream-header-filter.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-mail/test-istream-header-filter.c	Sun Jun 24 00:52:57 2012 +0300
@@ -7,8 +7,9 @@
 #include "istream-header-filter.h"
 #include "test-common.h"
 
-static void filter_callback(struct message_header_line *hdr,
-			    bool *matched, void *context ATTR_UNUSED)
+static void ATTR_NULL(3)
+filter_callback(struct message_header_line *hdr,
+		bool *matched, void *context ATTR_UNUSED)
 {
 	if (hdr != NULL && hdr->name_offset == 0) {
 		/* drop first header */
@@ -67,6 +68,7 @@
 
 static void test_istream_end_body_with_lf(void)
 {
+	static const char *empty_strarray[] = { NULL };
 	const char *input = "From: foo\n\nhello world";
 	const char *output = "From: foo\n\nhello world\n";
 	struct istream *istream, *filter;
@@ -82,7 +84,7 @@
 					       HEADER_FILTER_EXCLUDE |
 					       HEADER_FILTER_NO_CR |
 					       HEADER_FILTER_END_BODY_WITH_LF,
-					       NULL, 0,
+					       empty_strarray, 0,
 					       null_header_filter_callback, NULL);
 
 	for (i = 1; i < input_len; i++) {
--- a/src/lib-master/anvil-client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/anvil-client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -13,7 +13,7 @@
    If the callback returns FALSE, reconnection isn't attempted. */
 struct anvil_client *
 anvil_client_init(const char *path, bool (*reconnect_callback)(void),
-		  enum anvil_client_flags flags);
+		  enum anvil_client_flags flags) ATTR_NULL(2);
 void anvil_client_deinit(struct anvil_client **client);
 
 /* Connect to anvil. If retry=TRUE, try connecting for a while */
--- a/src/lib-master/ipc-client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/ipc-client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -15,6 +15,7 @@
 void ipc_client_deinit(struct ipc_client **client);
 
 void ipc_client_cmd(struct ipc_client *client, const char *cmd,
-		    ipc_client_callback_t *callback, void *context);
+		    ipc_client_callback_t *callback, void *context)
+	ATTR_NULL(4);
 
 #endif
--- a/src/lib-master/ipc-server.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/ipc-server.c	Sun Jun 24 00:52:57 2012 +0300
@@ -176,7 +176,7 @@
 
 void ipc_cmd_success(struct ipc_cmd **_cmd)
 {
-	ipc_cmd_success_reply(_cmd, NULL);
+	ipc_cmd_success_reply(_cmd, "");
 }
 
 void ipc_cmd_success_reply(struct ipc_cmd **_cmd, const char *data)
--- a/src/lib-master/master-service-settings-cache.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/master-service-settings-cache.h	Sun Jun 24 00:52:57 2012 +0300
@@ -11,6 +11,6 @@
 				       const struct master_service_settings_input *input,
 				       const struct dynamic_settings_parser *dyn_parsers,
 				       const struct setting_parser_context **parser_r,
-				       const char **error_r);
+				       const char **error_r) ATTR_NULL(3);
 
 #endif
--- a/src/lib-master/master-service-settings.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/master-service-settings.h	Sun Jun 24 00:52:57 2012 +0300
@@ -59,7 +59,7 @@
 				 const char **error_r);
 int master_service_settings_read_simple(struct master_service *service,
 					const struct setting_parser_info **roots,
-					const char **error_r);
+					const char **error_r) ATTR_NULL(2);
 /* destroy settings parser and clear service's set_pool, so that
    master_service_settings_read*() can be called without freeing memory used
    by existing settings structures. */
--- a/src/lib-master/master-service.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/master-service.c	Sun Jun 24 00:52:57 2012 +0300
@@ -149,7 +149,7 @@
 	service->argv = *argv;
 	service->name = i_strdup(name);
 	/* keep getopt_str first in case it contains "+" */
-	service->getopt_str = getopt_str == NULL ?
+	service->getopt_str = *getopt_str == '\0' ?
 		i_strdup(master_service_getopt_string()) :
 		i_strconcat(getopt_str, master_service_getopt_string(), NULL);
 	service->flags = flags;
@@ -289,8 +289,8 @@
 
 		if (strcmp(service->set->log_path, "syslog") != 0) {
 			/* set error handlers back to file */
-			i_set_fatal_handler(NULL);
-			i_set_error_handler(NULL);
+			i_set_fatal_handler(default_fatal_handler);
+			i_set_error_handler(default_error_handler);
 		}
 	}
 
--- a/src/lib-master/master-service.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/master-service.h	Sun Jun 24 00:52:57 2012 +0300
@@ -121,7 +121,8 @@
 
 /* Start the service. Blocks until finished */
 void master_service_run(struct master_service *service,
-			master_service_connection_callback_t *callback);
+			master_service_connection_callback_t *callback)
+	ATTR_NULL(2);
 /* Stop a running service. */
 void master_service_stop(struct master_service *service);
 /* Stop once we're done serving existing new connections, but don't accept
--- a/src/lib-master/mountpoint-list.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-master/mountpoint-list.c	Sun Jun 24 00:52:57 2012 +0300
@@ -58,8 +58,8 @@
 	NULL
 };
 
-struct mountpoint_list *
-mountpoint_list_init(const char *perm_path, const char *state_path)
+static struct mountpoint_list * ATTR_NULL(1)
+mountpoint_list_init_internal(const char *perm_path, const char *state_path)
 {
 	struct mountpoint_list *list;
 	pool_t pool;
@@ -76,9 +76,15 @@
 }
 
 struct mountpoint_list *
+mountpoint_list_init(const char *perm_path, const char *state_path)
+{
+	return mountpoint_list_init_internal(perm_path, state_path);
+}
+
+struct mountpoint_list *
 mountpoint_list_init_readonly(const char *state_path)
 {
-	return mountpoint_list_init(NULL, state_path);
+	return mountpoint_list_init_internal(NULL, state_path);
 }
 
 void mountpoint_list_deinit(struct mountpoint_list **_list)
--- a/src/lib-ntlm/ntlm-encrypt.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-ntlm/ntlm-encrypt.c	Sun Jun 24 00:52:57 2012 +0300
@@ -74,7 +74,7 @@
 	hmac_md5_update(ctx, wstr, len);
 }
 
-static void
+static void ATTR_NULL(2)
 ntlm_v2_hash(const char *user, const char *target,
 	     const unsigned char *hash_v1,
 	     unsigned char hash[NTLMSSP_V2_HASH_SIZE])
@@ -83,7 +83,7 @@
 
 	hmac_md5_init(&ctx, hash_v1, NTLMSSP_HASH_SIZE);
 	hmac_md5_ucs2le_string_ucase(&ctx, user);
-	if (target)
+	if (target != NULL)
 		hmac_md5_ucs2le_string_ucase(&ctx, target);
 	hmac_md5_final(&ctx, hash);
 }
--- a/src/lib-ntlm/ntlm-encrypt.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-ntlm/ntlm-encrypt.h	Sun Jun 24 00:52:57 2012 +0300
@@ -20,6 +20,7 @@
 			 const unsigned char *hash_v1,
 			 const unsigned char *challenge,
 			 const unsigned char *blob, size_t blob_size,
-			 unsigned char response[NTLMSSP_V2_RESPONSE_SIZE]);
+			 unsigned char response[NTLMSSP_V2_RESPONSE_SIZE])
+	ATTR_NULL(2);
 
 #endif
--- a/src/lib-otp/otp-parse.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-otp/otp-parse.c	Sun Jun 24 00:52:57 2012 +0300
@@ -55,15 +55,13 @@
 				break;
 			}
 		} else if (!IS_LWS(c)) {
-			if (endptr)
-				*endptr = data;
+			*endptr = data;
 			return -1;
 		}
 		data++;
 	}
 
-	if (endptr)
-		*endptr = data;
+	*endptr = data;
 
 	if (i < OTP_HASH_SIZE * 2)
 		return -1;
@@ -246,7 +244,7 @@
 	if (*end++ != ' ')
 		return -1;
 
-	return otp_read_hex(end, NULL, state->hash);
+	return otp_read_hex(end, &end, state->hash);
 }
 
 const char *otp_print_dbentry(const struct otp_state *state)
--- a/src/lib-settings/settings-parser.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-settings/settings-parser.c	Sun Jun 24 00:52:57 2012 +0300
@@ -493,9 +493,10 @@
 	}
 }
 
-static int setting_link_add(struct setting_parser_context *ctx,
-			    const struct setting_define *def,
-			    const struct setting_link *link_copy, char *key)
+static int ATTR_NULL(2)
+setting_link_add(struct setting_parser_context *ctx,
+		 const struct setting_define *def,
+		 const struct setting_link *link_copy, char *key)
 {
 	struct setting_link *link;
 
@@ -520,7 +521,7 @@
 	return 0;
 }
 
-static int
+static int ATTR_NULL(3, 8)
 get_deflist(struct setting_parser_context *ctx, struct setting_link *parent,
 	    const struct setting_define *def,
 	    const struct setting_parser_info *info,
@@ -1183,19 +1184,9 @@
 		settings_parse_set_key_expandeded(ctx, pool, *keys);
 }
 
-void settings_parse_var_skip(struct setting_parser_context *ctx)
-{
-	unsigned int i;
-
-	for (i = 0; i < ctx->root_count; i++) {
-		settings_var_expand(ctx->roots[i].info,
-				    ctx->roots[i].set_struct, NULL, NULL);
-	}
-}
-
-static void
-settings_var_expand_info(const struct setting_parser_info *info,
-			 pool_t pool, void *set,
+static void ATTR_NULL(3, 4, 5)
+settings_var_expand_info(const struct setting_parser_info *info, void *set,
+			 pool_t pool,
 			 const struct var_expand_table *table, string_t *str)
 {
 	const struct setting_define *def;
@@ -1245,7 +1236,7 @@
 			children = array_get(val, &count);
 			for (i = 0; i < count; i++) {
 				settings_var_expand_info(def->list_info,
-							 pool, children[i],
+							 children[i], pool,
 							 table, str);
 			}
 			break;
@@ -1262,10 +1253,21 @@
 
 	T_BEGIN {
 		str = t_str_new(256);
-		settings_var_expand_info(info, pool, set, table, str);
+		settings_var_expand_info(info, set, pool, table, str);
 	} T_END;
 }
 
+void settings_parse_var_skip(struct setting_parser_context *ctx)
+{
+	unsigned int i;
+
+	for (i = 0; i < ctx->root_count; i++) {
+		settings_var_expand_info(ctx->roots[i].info,
+					 ctx->roots[i].set_struct,
+					 NULL, NULL, NULL);
+	}
+}
+
 bool settings_vars_have_key(const struct setting_parser_info *info, void *set,
 			    char var_key, const char *long_var_key,
 			    const char **key_r, const char **value_r)
--- a/src/lib-settings/settings.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-settings/settings.h	Sun Jun 24 00:52:57 2012 +0300
@@ -42,7 +42,8 @@
 
 bool settings_read(const char *path, const char *section,
 		   settings_callback_t *callback,
-		   settings_section_callback_t *sect_callback, void *context);
+		   settings_section_callback_t *sect_callback, void *context)
+	ATTR_NULL(2, 4, 5);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define settings_read(path, section, callback, sect_callback, context) \
 	({(void)(1 ? 0 : callback((const char *)0, (const char *)0, context)); \
--- a/src/lib-sql/driver-mysql.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-sql/driver-mysql.c	Sun Jun 24 00:52:57 2012 +0300
@@ -500,7 +500,7 @@
 		callback(NULL, context);
 }
 
-static int
+static int ATTR_NULL(3)
 transaction_send_query(struct mysql_transaction_context *ctx, const char *query,
 		       unsigned int *affected_rows_r)
 {
--- a/src/lib-sql/driver-pgsql.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-sql/driver-pgsql.c	Sun Jun 24 00:52:57 2012 +0300
@@ -485,8 +485,10 @@
 		(void)sql_connect(&db->api);
 	}
 	if (db->api.state != SQL_DB_STATE_DISCONNECTED) {
+		int error;
+
 		to = t_buffer_get(len * 2 + 1);
-		len = PQescapeStringConn(db->pg, to, string, len, NULL);
+		len = PQescapeStringConn(db->pg, to, string, len, &error);
 	} else
 #endif
 	{
--- a/src/lib-sql/driver-sqlpool.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-sql/driver-sqlpool.c	Sun Jun 24 00:52:57 2012 +0300
@@ -80,7 +80,7 @@
 driver_sqlpool_commit_callback(const char *error,
 			       struct sqlpool_transaction_context *ctx);
 
-static struct sqlpool_request *
+static struct sqlpool_request * ATTR_NULL(2)
 sqlpool_request_new(struct sqlpool_db *db, const char *query)
 {
 	struct sqlpool_request *request;
@@ -639,8 +639,9 @@
 	}
 }
 
-static void driver_sqlpool_query(struct sql_db *_db, const char *query,
-				 sql_query_callback_t *callback, void *context)
+static void ATTR_NULL(3, 4)
+driver_sqlpool_query(struct sql_db *_db, const char *query,
+		     sql_query_callback_t *callback, void *context)
 {
         struct sqlpool_db *db = (struct sqlpool_db *)_db;
 	struct sqlpool_request *request;
--- a/src/lib-sql/sql-api.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-sql/sql-api.c	Sun Jun 24 00:52:57 2012 +0300
@@ -369,7 +369,7 @@
 
 void sql_update(struct sql_transaction_context *ctx, const char *query)
 {
-	sql_update_get_rows(ctx, query, NULL);
+	ctx->db->v.update(ctx, query, NULL);
 }
 
 void sql_update_get_rows(struct sql_transaction_context *ctx, const char *query,
--- a/src/lib-storage/index/dbox-common/dbox-file-fix.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-common/dbox-file-fix.c	Sun Jun 24 00:52:57 2012 +0300
@@ -164,6 +164,7 @@
 	uoff_t offset, msg_size, hdr_offset, body_offset;
 	bool pre, write_header, have_guid;
 	struct message_size body;
+	bool has_nuls;
 	struct istream *body_input;
 	guid_128_t guid_128;
 	int ret;
@@ -248,7 +249,7 @@
 		/* get message body size */
 		i_stream_seek(file->input, body_offset);
 		body_input = i_stream_create_limit(file->input, msg_size);
-		ret = message_get_body_size(body_input, &body, NULL);
+		ret = message_get_body_size(body_input, &body, &has_nuls);
 		i_stream_unref(&body_input);
 		if (ret < 0) {
 			errno = output->stream_errno;
--- a/src/lib-storage/index/dbox-common/dbox-save.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-common/dbox-save.h	Sun Jun 24 00:52:57 2012 +0300
@@ -26,7 +26,7 @@
 void dbox_save_write_metadata(struct mail_save_context *ctx,
 			      struct ostream *output, uoff_t output_msg_size,
 			      const char *orig_mailbox_name,
-			      guid_128_t guid_128_r);
+			      guid_128_t guid_128_r) ATTR_NULL(4);
 
 void dbox_save_add_to_index(struct dbox_save_context *ctx);
 
--- a/src/lib-storage/index/dbox-common/dbox-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-common/dbox-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -59,12 +59,10 @@
 {
 	const char *root_dir, *alt_symlink_path, *alt_path;
 
-	root_dir = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_DIR);
+	root_dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_DIR);
 	alt_symlink_path =
 		t_strconcat(root_dir, "/"DBOX_ALT_SYMLINK_NAME, NULL);
-	alt_path = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX);
+	alt_path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX);
 	if (!dbox_alt_path_has_changed(root_dir, alt_path, alt_symlink_path))
 		return;
 
@@ -123,8 +121,7 @@
 {
 	const char *path;
 
-	path = mailbox_list_get_path(list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_CONTROL);
+	path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_CONTROL);
 	path = t_strconcat(path, "/"DBOX_UIDVALIDITY_FILE_NAME, NULL);
 	return mailbox_uidvalidity_next(list, path);
 }
--- a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c	Sun Jun 24 00:52:57 2012 +0300
@@ -207,8 +207,7 @@
 	const char *alt_path, *error;
 	struct stat st;
 
-	alt_path = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_ALT_DIR);
+	alt_path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_ALT_DIR);
 	if (alt_path == NULL)
 		return 0;
 
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c	Sun Jun 24 00:52:57 2012 +0300
@@ -52,10 +52,8 @@
 	const char *root, *index_root;
 	mode_t dir_mode;
 
-	root = mailbox_list_get_path(root_list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_DIR);
-	index_root = mailbox_list_get_path(root_list, NULL,
-					   MAILBOX_LIST_PATH_TYPE_INDEX);
+	root = mailbox_list_get_root_path(root_list, MAILBOX_LIST_PATH_TYPE_DIR);
+	index_root = mailbox_list_get_root_path(root_list, MAILBOX_LIST_PATH_TYPE_INDEX);
 
 	map = i_new(struct mdbox_map, 1);
 	map->storage = storage;
--- a/src/lib-storage/index/dbox-multi/mdbox-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -52,7 +52,7 @@
 	_storage->unique_root_dir =
 		p_strdup(_storage->pool, ns->list->set.root_dir);
 
-	dir = mailbox_list_get_path(ns->list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
+	dir = mailbox_list_get_root_path(ns->list, MAILBOX_LIST_PATH_TYPE_DIR);
 	storage->storage_dir = p_strconcat(_storage->pool, dir,
 					   "/"MDBOX_GLOBAL_DIR_NAME, NULL);
 	storage->alt_storage_dir = p_strconcat(_storage->pool,
@@ -243,9 +243,10 @@
 	}
 }
 
-static int mdbox_write_index_header(struct mailbox *box,
-				    const struct mailbox_update *update,
-				    struct mail_index_transaction *trans)
+static int ATTR_NULL(2, 3)
+mdbox_write_index_header(struct mailbox *box,
+			 const struct mailbox_update *update,
+			 struct mail_index_transaction *trans)
 {
 	struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box;
 	struct mail_index_transaction *new_trans = NULL;
--- a/src/lib-storage/index/dbox-multi/mdbox-storage.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage.h	Sun Jun 24 00:52:57 2012 +0300
@@ -72,7 +72,7 @@
 		      struct mdbox_index_header *hdr);
 void mdbox_update_header(struct mdbox_mailbox *mbox,
 			 struct mail_index_transaction *trans,
-			 const struct mailbox_update *update);
+			 const struct mailbox_update *update) ATTR_NULL(3);
 
 struct mail_save_context *
 mdbox_save_alloc(struct mailbox_transaction_context *_t);
--- a/src/lib-storage/index/dbox-multi/mdbox-sync.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c	Sun Jun 24 00:52:57 2012 +0300
@@ -30,10 +30,11 @@
 {
 	const void *data;
 	uint32_t uid;
+	bool expunged;
 
 	mail_index_lookup_uid(ctx->sync_view, seq, &uid);
 	mail_index_lookup_ext(ctx->sync_view, seq,
-			      ctx->mbox->guid_ext_id, &data, NULL);
+			      ctx->mbox->guid_ext_id, &data, &expunged);
 	if (guid_128_is_empty(guid_128) ||
 	    memcmp(data, guid_128, GUID_128_SIZE) == 0)
 		return 0;
@@ -99,6 +100,7 @@
 	unsigned int n;
 	const void *data;
 	uint32_t seq, uid;
+	bool expunged;
 
 	/* use a separate transaction here so that we can commit the changes
 	   during map transaction */
@@ -107,7 +109,7 @@
 	while (seq_range_array_iter_nth(&iter, n++, &seq)) {
 		mail_index_lookup_uid(ctx->sync_view, seq, &uid);
 		mail_index_lookup_ext(ctx->sync_view, seq,
-				      ctx->mbox->guid_ext_id, &data, NULL);
+				      ctx->mbox->guid_ext_id, &data, &expunged);
 		mail_index_expunge_guid(trans, seq, data);
 	}
 	if (mail_index_transaction_commit(&trans) < 0)
--- a/src/lib-storage/index/dbox-single/sdbox-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/dbox-single/sdbox-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -178,9 +178,10 @@
 	       sizeof(mbox->mailbox_guid));
 }
 
-static int sdbox_mailbox_create_indexes(struct mailbox *box,
-					const struct mailbox_update *update,
-					struct mail_index_transaction *trans)
+static int ATTR_NULL(2, 3)
+sdbox_mailbox_create_indexes(struct mailbox *box,
+			     const struct mailbox_update *update,
+			     struct mail_index_transaction *trans)
 {
 	struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
 	struct mail_index_transaction *new_trans = NULL;
--- a/src/lib-storage/index/imapc/imapc-mail.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Sun Jun 24 00:52:57 2012 +0300
@@ -196,7 +196,7 @@
 			   return them as empty mails instead of disconnecting
 			   the client. */
 			mail->body_fetched = TRUE;
-			data->stream = i_stream_create_from_data(NULL, 0);
+			data->stream = i_stream_create_from_data(&uchar_nul, 0);
 			imapc_mail_init_stream(mail, TRUE);
 		}
 	}
--- a/src/lib-storage/index/index-mail-headers.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-mail-headers.c	Sun Jun 24 00:52:57 2012 +0300
@@ -64,7 +64,7 @@
 				i_assert((match[match_idx] &
 					  HEADER_MATCH_FLAG_FOUND) == 0);
 				index_mail_cache_add_idx(mail, match_idx,
-							 NULL, 0);
+							 "", 0);
 			}
 			match_idx++;
 		}
@@ -125,7 +125,7 @@
 			/* this header doesn't exist. remember that. */
 			i_assert((match[match_idx] &
 				  HEADER_MATCH_FLAG_FOUND) == 0);
-			index_mail_cache_add_idx(mail, match_idx, NULL, 0);
+			index_mail_cache_add_idx(mail, match_idx, "", 0);
 		}
 	}
 
--- a/src/lib-storage/index/index-mail.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-mail.c	Sun Jun 24 00:52:57 2012 +0300
@@ -872,6 +872,7 @@
 	struct mail *_mail = &mail->mail.mail;
 	struct index_mail_data *data = &mail->data;
 	struct istream *input;
+	bool has_nuls;
 	int ret;
 
 	if (!data->initialized_wrapper_stream &&
@@ -903,7 +904,8 @@
 					return -1;
 			} else {
 				message_get_header_size(data->stream,
-							&data->hdr_size, NULL);
+							&data->hdr_size,
+							&has_nuls);
 				data->hdr_size_set = TRUE;
 			}
 		}
@@ -923,7 +925,8 @@
 					return -1;
 			} else {
 				message_get_body_size(data->stream,
-						      &data->body_size, NULL);
+						      &data->body_size,
+						      &has_nuls);
 				data->body_size_set = TRUE;
 			}
 		}
--- a/src/lib-storage/index/index-mail.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-mail.h	Sun Jun 24 00:52:57 2012 +0300
@@ -170,12 +170,14 @@
 
 bool index_mail_want_parse_headers(struct index_mail *mail);
 void index_mail_parse_header_init(struct index_mail *mail,
-				  struct mailbox_header_lookup_ctx *headers);
+				  struct mailbox_header_lookup_ctx *headers)
+	ATTR_NULL(2);
 void index_mail_parse_header(struct message_part *part,
 			     struct message_header_line *hdr,
-			     struct index_mail *mail);
+			     struct index_mail *mail) ATTR_NULL(1);
 int index_mail_parse_headers(struct index_mail *mail,
-			     struct mailbox_header_lookup_ctx *headers);
+			     struct mailbox_header_lookup_ctx *headers)
+	ATTR_NULL(2);
 int index_mail_headers_get_envelope(struct index_mail *mail);
 
 int index_mail_get_first_header(struct mail *_mail, const char *field,
@@ -201,7 +203,7 @@
 int index_mail_init_stream(struct index_mail *mail,
 			   struct message_size *hdr_size,
 			   struct message_size *body_size,
-			   struct istream **stream_r);
+			   struct istream **stream_r) ATTR_NULL(2, 3);
 int index_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
 			   const char **value_r);
 struct mail *index_mail_get_real_mail(struct mail *mail);
--- a/src/lib-storage/index/index-search.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-search.c	Sun Jun 24 00:52:57 2012 +0300
@@ -58,8 +58,9 @@
 				     struct mail_search_arg *args,
 				     uint32_t *seq1_r, uint32_t *seq2_r);
 
-static void search_none(struct mail_search_arg *arg ATTR_UNUSED,
-			struct search_body_context *ctx ATTR_UNUSED)
+static void ATTR_NULL(2)
+search_none(struct mail_search_arg *arg ATTR_UNUSED,
+	    struct search_body_context *ctx ATTR_UNUSED)
 {
 }
 
@@ -1164,8 +1165,9 @@
 	return &ctx->mail_ctx;
 }
 
-static void search_arg_deinit(struct mail_search_arg *arg,
-			      void *context ATTR_UNUSED)
+static void ATTR_NULL(2)
+search_arg_deinit(struct mail_search_arg *arg,
+		  void *context ATTR_UNUSED)
 {
 	struct message_search_context *search_ctx = arg->context;
 
--- a/src/lib-storage/index/index-sort.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-sort.c	Sun Jun 24 00:52:57 2012 +0300
@@ -57,10 +57,11 @@
 {
 	ARRAY_TYPE(mail_sort_node_date) *nodes = program->context;
 	struct mail_sort_node_date *node;
+	int tz;
 
 	node = array_append_space(nodes);
 	node->seq = mail->seq;
-	if (mail_get_date(mail, &node->date, NULL) < 0)
+	if (mail_get_date(mail, &node->date, &tz) < 0)
 		node->date = 0;
 	else if (node->date == 0) {
 		if (mail_get_received_date(mail, &node->date) < 0)
@@ -410,6 +411,7 @@
 {
 	const char *str;
 	int ret;
+	bool reply_or_fw;
 
 	mail_set_seq(mail, seq);
 	str_truncate(dest, 0);
@@ -419,7 +421,7 @@
 		if ((ret = mail_get_first_header(mail, "Subject", &str)) <= 0)
 			return ret;
 		str = imap_get_base_subject_cased(pool_datastack_create(),
-						  str, NULL);
+						  str, &reply_or_fw);
 		str_append(dest, str);
 		return 0;
 	case MAIL_SORT_CC:
@@ -453,7 +455,7 @@
 	time_t time1, time2;
 	uoff_t size1, size2;
 	float float1, float2;
-	int ret = 0;
+	int tz, ret = 0;
 
 	sort_type = *sort_program & MAIL_SORT_MASK;
 	switch (sort_type) {
@@ -488,7 +490,7 @@
 		break;
 	case MAIL_SORT_DATE:
 		mail_set_seq(mail, seq1);
-		if (mail_get_date(mail, &time1, NULL) < 0)
+		if (mail_get_date(mail, &time1, &tz) < 0)
 			time1 = 0;
 		else if (time1 == 0) {
 			if (mail_get_received_date(mail, &time1) < 0)
@@ -496,7 +498,7 @@
 		}
 
 		mail_set_seq(mail, seq2);
-		if (mail_get_date(mail, &time2, NULL) < 0)
+		if (mail_get_date(mail, &time2, &tz) < 0)
 			time2 = 0;
 		else if (time2 == 0) {
 			if (mail_get_received_date(mail, &time2) < 0)
--- a/src/lib-storage/index/index-storage.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-storage.h	Sun Jun 24 00:52:57 2012 +0300
@@ -62,7 +62,8 @@
 int index_storage_mailbox_exists(struct mailbox *box, bool auto_boxes,
 				 enum mailbox_existence *existence_r);
 int index_storage_mailbox_exists_full(struct mailbox *box, const char *subdir,
-				      enum mailbox_existence *existence_r);
+				      enum mailbox_existence *existence_r)
+	ATTR_NULL(2);
 int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory);
 int index_storage_mailbox_enable(struct mailbox *box,
 				 enum mailbox_feature feature);
--- a/src/lib-storage/index/index-sync-changes.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/index-sync-changes.h	Sun Jun 24 00:52:57 2012 +0300
@@ -22,6 +22,7 @@
 void index_sync_changes_apply(struct index_sync_changes_context *ctx,
 			      pool_t pool, uint8_t *flags,
 			      ARRAY_TYPE(keyword_indexes) *keywords,
-			      enum mail_index_sync_type *sync_type_r);
+			      enum mail_index_sync_type *sync_type_r)
+	ATTR_NULL(2);
 
 #endif
--- a/src/lib-storage/index/maildir/maildir-filename-flags.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-filename-flags.c	Sun Jun 24 00:52:57 2012 +0300
@@ -88,9 +88,10 @@
 	      char_cmp);
 }
 
-const char *maildir_filename_flags_set(struct maildir_keywords_sync_ctx *ctx,
-				       const char *fname, enum mail_flags flags,
-				       ARRAY_TYPE(keyword_indexes) *keywords)
+static const char * ATTR_NULL(1, 4)
+maildir_filename_flags_full_set(struct maildir_keywords_sync_ctx *ctx,
+				const char *fname, enum mail_flags flags,
+				ARRAY_TYPE(keyword_indexes) *keywords)
 {
 	string_t *flags_str;
 	enum mail_flags flags_left;
@@ -170,3 +171,15 @@
 
 	return str_c(flags_str);
 }
+
+const char *maildir_filename_flags_set(const char *fname, enum mail_flags flags)
+{
+	return maildir_filename_flags_full_set(NULL, fname, flags, NULL);
+}
+
+const char *maildir_filename_flags_kw_set(struct maildir_keywords_sync_ctx *ctx,
+					  const char *fname, enum mail_flags flags,
+					  ARRAY_TYPE(keyword_indexes) *keywords)
+{
+	return maildir_filename_flags_full_set(ctx, fname, flags, keywords);
+}
--- a/src/lib-storage/index/maildir/maildir-filename-flags.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-filename-flags.h	Sun Jun 24 00:52:57 2012 +0300
@@ -5,8 +5,9 @@
 			       const char *fname, enum mail_flags *flags_r,
                                ARRAY_TYPE(keyword_indexes) *keywords_r);
 
-const char *maildir_filename_flags_set(struct maildir_keywords_sync_ctx *ctx,
-				       const char *fname, enum mail_flags flags,
-				       ARRAY_TYPE(keyword_indexes) *keywords);
+const char *maildir_filename_flags_set(const char *fname, enum mail_flags flags);
+const char *maildir_filename_flags_kw_set(struct maildir_keywords_sync_ctx *ctx,
+					  const char *fname, enum mail_flags flags,
+					  ARRAY_TYPE(keyword_indexes) *keywords);
 
 #endif
--- a/src/lib-storage/index/maildir/maildir-mail.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-mail.c	Sun Jun 24 00:52:57 2012 +0300
@@ -504,8 +504,8 @@
 				"Maildir %s: Corrupted dovecot-uidlist: "
 				"UID %u had empty GUID, clearing it",
 				mailbox_get_path(_mail->box), _mail->uid);
-			maildir_uidlist_set_ext(mbox->uidlist, _mail->uid,
-				MAILDIR_UIDLIST_REC_EXT_GUID, NULL);
+			maildir_uidlist_unset_ext(mbox->uidlist, _mail->uid,
+				MAILDIR_UIDLIST_REC_EXT_GUID);
 		}
 
 		/* default to base filename: */
@@ -617,13 +617,13 @@
 
 	if (maildir_uidlist_lookup_ext(mbox->uidlist, mail->uid,
 				       MAILDIR_UIDLIST_REC_EXT_VSIZE) != NULL) {
-		maildir_uidlist_set_ext(mbox->uidlist, mail->uid,
-					MAILDIR_UIDLIST_REC_EXT_VSIZE, NULL);
+		maildir_uidlist_unset_ext(mbox->uidlist, mail->uid,
+					  MAILDIR_UIDLIST_REC_EXT_VSIZE);
 	}
 	if (maildir_uidlist_lookup_ext(mbox->uidlist, mail->uid,
 				       MAILDIR_UIDLIST_REC_EXT_PSIZE) != NULL) {
-		maildir_uidlist_set_ext(mbox->uidlist, mail->uid,
-					MAILDIR_UIDLIST_REC_EXT_PSIZE, NULL);
+		maildir_uidlist_unset_ext(mbox->uidlist, mail->uid,
+					  MAILDIR_UIDLIST_REC_EXT_PSIZE);
 	}
 }
 
--- a/src/lib-storage/index/maildir/maildir-save.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-save.c	Sun Jun 24 00:52:57 2012 +0300
@@ -135,7 +135,7 @@
 	ctx->newdir = p_strconcat(pool, path, "/new", NULL);
 	ctx->curdir = p_strconcat(pool, path, "/cur", NULL);
 
-	buffer_create_const_data(&ctx->keywords_buffer, NULL, 0);
+	buffer_create_const_data(&ctx->keywords_buffer, "", 0);
 	array_create_from_buffer(&ctx->keywords_array, &ctx->keywords_buffer,
 				 sizeof(unsigned int));
 	ctx->last_save_finished = TRUE;
@@ -272,17 +272,18 @@
 			return TRUE;
 		}
 
-		*fname_r = maildir_filename_flags_set(NULL, basename,
-					mf->flags & MAIL_FLAGS_MASK, NULL);
+		*fname_r = maildir_filename_flags_set(basename,
+					mf->flags & MAIL_FLAGS_MASK);
 		return FALSE;
 	}
 
 	i_assert(ctx->keywords_sync_ctx != NULL || mf->keywords_count == 0);
 	buffer_create_const_data(&ctx->keywords_buffer, mf + 1,
 				 mf->keywords_count * sizeof(unsigned int));
-	*fname_r = maildir_filename_flags_set(ctx->keywords_sync_ctx, basename,
-					      mf->flags & MAIL_FLAGS_MASK,
-					      &ctx->keywords_array);
+	*fname_r = maildir_filename_flags_kw_set(ctx->keywords_sync_ctx,
+						 basename,
+						 mf->flags & MAIL_FLAGS_MASK,
+						 &ctx->keywords_array);
 	return FALSE;
 }
 
--- a/src/lib-storage/index/maildir/maildir-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -60,12 +60,10 @@
 		/* put the temp files into tmp/ directory preferrably */
 		storage->temp_prefix = p_strconcat(_storage->pool, "tmp/",
 						   storage->temp_prefix, NULL);
-		dir = mailbox_list_get_path(list, NULL,
-					    MAILBOX_LIST_PATH_TYPE_DIR);
+		dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_DIR);
 	} else {
 		/* control dir should also be writable */
-		dir = mailbox_list_get_path(list, NULL,
-					    MAILBOX_LIST_PATH_TYPE_CONTROL);
+		dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_CONTROL);
 	}
 	_storage->temp_path_prefix = p_strconcat(_storage->pool, dir, "/",
 						 storage->temp_prefix, NULL);
@@ -351,8 +349,7 @@
 		return -1;
 
 	/* tmp/ directory doesn't exist. does the maildir? */
-	root_dir = mailbox_list_get_path(box->list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_dir = mailbox_list_get_root_path(box->list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	if (strcmp(box_path, root_dir) == 0) {
 		/* root directory. either INBOX or some other namespace root */
 		errno = ENOENT;
@@ -465,8 +462,7 @@
 
 	/* if dovecot-shared exists in the root dir, copy it to newly
 	   created mailboxes */
-	root_dir = mailbox_list_get_path(box->list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_dir = mailbox_list_get_root_path(box->list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	shared_path = t_strconcat(root_dir, "/dovecot-shared", NULL);
 	if (stat(shared_path, &st) == 0) {
 		if (maildir_create_shared(box) < 0)
@@ -552,8 +548,7 @@
 {
 	const char *path;
 
-	path = mailbox_list_get_path(list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_CONTROL);
+	path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_CONTROL);
 	path = t_strconcat(path, "/"MAILDIR_UIDVALIDITY_FNAME, NULL);
 	return mailbox_uidvalidity_next(list, path);
 }
@@ -568,10 +563,8 @@
 		return mbox->_private_flags_mask;
 	mbox->private_flags_mask_set = TRUE;
 
-	path = mailbox_list_get_path(box->list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	path2 = mailbox_list_get_path(box->list, NULL,
-				      MAILBOX_LIST_PATH_TYPE_INDEX);
+	path = mailbox_list_get_root_path(box->list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	path2 = mailbox_list_get_root_path(box->list, MAILBOX_LIST_PATH_TYPE_INDEX);
 	if (strcmp(path, path2) == 0) {
 		/* no separate index directory. we can't have private flags,
 		   so don't even bother checking if dovecot-shared exists */
--- a/src/lib-storage/index/maildir/maildir-storage.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.h	Sun Jun 24 00:52:57 2012 +0300
@@ -126,7 +126,7 @@
 
 struct maildir_filename *
 maildir_save_add(struct mail_save_context *_ctx, const char *tmp_fname,
-		 struct mail *src_mail);
+		 struct mail *src_mail) ATTR_NULL(3);
 void maildir_save_set_dest_basename(struct mail_save_context *ctx,
 				    struct maildir_filename *mf,
 				    const char *basename);
--- a/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c	Sun Jun 24 00:52:57 2012 +0300
@@ -132,8 +132,8 @@
 	ctx->flags = flags8;
 
 	/* and try renaming with the new name */
-	newfname = maildir_filename_flags_set(ctx->keywords_sync_ctx, fname,
-					      ctx->flags, &ctx->keywords);
+	newfname = maildir_filename_flags_kw_set(ctx->keywords_sync_ctx, fname,
+						 ctx->flags, &ctx->keywords);
 	newpath = t_strconcat(dir, newfname, NULL);
 	if (strcmp(path, newpath) == 0) {
 		/* just make sure that the file still exists. avoid rename()
--- a/src/lib-storage/index/maildir/maildir-sync.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Sun Jun 24 00:52:57 2012 +0300
@@ -749,8 +749,9 @@
 	return mail_index_sync_have_any(mbox->box.index, flags) ? 1 : 0;
 }
 
-static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced,
-				uint32_t *find_uid, bool *lost_files_r)
+static int ATTR_NULL(3)
+maildir_sync_context(struct maildir_sync_context *ctx, bool forced,
+		     uint32_t *find_uid, bool *lost_files_r)
 {
 	enum maildir_uidlist_sync_flags sync_flags;
 	enum maildir_uidlist_rec_flag flags;
--- a/src/lib-storage/index/maildir/maildir-sync.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.h	Sun Jun 24 00:52:57 2012 +0300
@@ -31,7 +31,8 @@
 
 int maildir_sync_index_begin(struct maildir_mailbox *mbox,
 			     struct maildir_sync_context *maildir_sync_ctx,
-			     struct maildir_index_sync_context **ctx_r);
+			     struct maildir_index_sync_context **ctx_r)
+	ATTR_NULL(2);
 int maildir_sync_index(struct maildir_index_sync_context *sync_ctx,
 		       bool partial);
 int maildir_sync_index_commit(struct maildir_index_sync_context **_ctx);
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Jun 24 00:52:57 2012 +0300
@@ -1165,9 +1165,10 @@
 	memcpy(rec->extensions, buf->data, buf->used);
 }
 
-void maildir_uidlist_set_ext(struct maildir_uidlist *uidlist, uint32_t uid,
-			     enum maildir_uidlist_rec_ext_key key,
-			     const char *value)
+static void ATTR_NULL(4)
+maildir_uidlist_set_ext_internal(struct maildir_uidlist *uidlist, uint32_t uid,
+				 enum maildir_uidlist_rec_ext_key key,
+				 const char *value)
 {
 	struct maildir_uidlist_rec *rec;
 	int ret;
@@ -1199,6 +1200,19 @@
 	}
 }
 
+void maildir_uidlist_set_ext(struct maildir_uidlist *uidlist, uint32_t uid,
+			     enum maildir_uidlist_rec_ext_key key,
+			     const char *value)
+{
+	return maildir_uidlist_set_ext_internal(uidlist, uid, key, value);
+}
+
+void maildir_uidlist_unset_ext(struct maildir_uidlist *uidlist, uint32_t uid,
+			       enum maildir_uidlist_rec_ext_key key)
+{
+	return maildir_uidlist_set_ext_internal(uidlist, uid, key, NULL);
+}
+
 static void
 maildir_uidlist_generate_uid_validity(struct maildir_uidlist *uidlist)
 {
--- a/src/lib-storage/index/maildir/maildir-uidlist.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.h	Sun Jun 24 00:52:57 2012 +0300
@@ -99,10 +99,12 @@
 void maildir_uidlist_set_next_uid(struct maildir_uidlist *uidlist,
 				  uint32_t next_uid, bool force);
 
-/* Update extended record. value=NULL removes the key. */
+/* Update extended record. */
 void maildir_uidlist_set_ext(struct maildir_uidlist *uidlist, uint32_t uid,
 			     enum maildir_uidlist_rec_ext_key key,
 			     const char *value);
+void maildir_uidlist_unset_ext(struct maildir_uidlist *uidlist, uint32_t uid,
+			       enum maildir_uidlist_rec_ext_key key);
 
 /* If uidlist has changed, update it. This is mostly meant to be used with
    maildir_uidlist_set_ext() */
--- a/src/lib-storage/index/maildir/maildir-util.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-util.c	Sun Jun 24 00:52:57 2012 +0300
@@ -44,13 +44,13 @@
 	mail_index_lookup_view_flags(view, seq, &flags, &keywords);
 	if (array_count(&keywords) == 0) {
 		*have_flags_r = (flags & MAIL_FLAGS_NONRECENT) != 0;
-		fname = maildir_filename_flags_set(NULL, fname, flags, NULL);
+		fname = maildir_filename_flags_set(fname, flags);
 	} else {
 		*have_flags_r = TRUE;
 		kw_ctx = maildir_keywords_sync_init_readonly(mbox->keywords,
 							     mbox->box.index);
-		fname = maildir_filename_flags_set(kw_ctx, fname,
-						   flags, &keywords);
+		fname = maildir_filename_flags_kw_set(kw_ctx, fname,
+						      flags, &keywords);
 		maildir_keywords_sync_deinit(&kw_ctx);
 	}
 
--- a/src/lib-storage/index/mbox/mbox-file.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-file.c	Sun Jun 24 00:52:57 2012 +0300
@@ -77,7 +77,7 @@
 
 		if (mbox->mbox_writeonly) {
 			mbox->mbox_file_stream =
-				i_stream_create_from_data(NULL, 0);
+				i_stream_create_from_data("", 0);
 		} else {
 			mbox->mbox_file_stream =
 				i_stream_create_fd(mbox->mbox_fd,
--- a/src/lib-storage/index/mbox/mbox-lock.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-lock.c	Sun Jun 24 00:52:57 2012 +0300
@@ -246,9 +246,10 @@
 	return TRUE;
 }
 
-static int mbox_dotlock_privileged_op(struct mbox_mailbox *mbox,
-				      struct dotlock_settings *set,
-				      enum mbox_dotlock_op op)
+static int ATTR_NULL(2)
+mbox_dotlock_privileged_op(struct mbox_mailbox *mbox,
+			   struct dotlock_settings *set,
+			   enum mbox_dotlock_op op)
 {
 	const char *box_path, *dir, *fname;
 	int ret = -1, orig_dir_fd, orig_errno;
@@ -357,8 +358,8 @@
 		mail_storage_set_critical(&mbox->storage->storage,
 			"%s (not INBOX -> no privileged locking)", errmsg);
 	} else if (!mbox->mbox_privileged_locking) {
-		dir = mailbox_list_get_path(mbox->box.list, NULL,
-					    MAILBOX_LIST_PATH_TYPE_DIR);
+		dir = mailbox_list_get_root_path(mbox->box.list,
+						 MAILBOX_LIST_PATH_TYPE_DIR);
 		mail_storage_set_critical(&mbox->storage->storage,
 			"%s (under root dir %s -> no privileged locking)",
 			errmsg, dir);
--- a/src/lib-storage/index/mbox/mbox-mail.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-mail.c	Sun Jun 24 00:52:57 2012 +0300
@@ -153,6 +153,7 @@
 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 	struct mbox_mailbox *mbox = (struct mbox_mailbox *)mail->mail.mail.box;
 	const void *ext_data;
+	bool expunged;
 
 	if (mail->data.guid != NULL) {
 		*value_r = mail->data.guid;
@@ -161,7 +162,7 @@
 
 	mail_index_lookup_ext(mail->mail.mail.transaction->view,
 			      mail->mail.mail.seq, mbox->md5hdr_ext_idx,
-			      &ext_data, NULL);
+			      &ext_data, &expunged);
 	if (ext_data != NULL && memcmp(ext_data, empty_md5, 16) != 0) {
 		mail->data.guid = p_strdup(mail->data_pool,
 					   binary_to_hex(ext_data, 16));
--- a/src/lib-storage/index/mbox/mbox-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -136,8 +136,7 @@
 
 	storage->set = mail_storage_get_driver_settings(_storage);
 
-	dir = mailbox_list_get_path(ns->list, NULL,
-				    MAILBOX_LIST_PATH_TYPE_INDEX);
+	dir = mailbox_list_get_root_path(ns->list, MAILBOX_LIST_PATH_TYPE_INDEX);
 	if (*dir != '\0') {
 		_storage->temp_path_prefix = p_strconcat(_storage->pool, dir,
 			"/", mailbox_list_get_temp_prefix(ns->list), NULL);
@@ -411,8 +410,8 @@
 	if (box->inbox_any || strcmp(box->name, "INBOX") == 0) {
 		/* if INBOX isn't under the root directory, it's probably in
 		   /var/mail and we want to allow privileged dotlocking */
-		rootdir = mailbox_list_get_path(box->list, NULL,
-						MAILBOX_LIST_PATH_TYPE_DIR);
+		rootdir = mailbox_list_get_root_path(box->list,
+						     MAILBOX_LIST_PATH_TYPE_DIR);
 		if (strncmp(box_path, rootdir, strlen(rootdir)) != 0)
 			mbox->mbox_privileged_locking = TRUE;
 	}
--- a/src/lib-storage/index/mbox/mbox-sync-parse.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync-parse.c	Sun Jun 24 00:52:57 2012 +0300
@@ -548,6 +548,7 @@
 	struct header_func *func;
 	struct mbox_md5_context *mbox_md5_ctx;
 	const void *data;
+	bool expunged;
 	uint32_t uid;
 	int ret;
 
@@ -595,7 +596,8 @@
 	/* match by MD5 sum */
 	mbox->mbox_save_md5 = TRUE;
 
-	mail_index_lookup_ext(view, seq, mbox->md5hdr_ext_idx, &data, NULL);
+	mail_index_lookup_ext(view, seq, mbox->md5hdr_ext_idx,
+			      &data, &expunged);
 	return data == NULL ? 0 :
 		memcmp(data, ctx.hdr_md5_sum, 16) == 0;
 }
--- a/src/lib-storage/index/mbox/mbox-sync.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync.c	Sun Jun 24 00:52:57 2012 +0300
@@ -244,6 +244,7 @@
         const struct mail_index_record *rec = NULL;
 	uint32_t messages_count;
 	const void *data;
+	bool expunged;
 
 	if (sync_ctx->index_reset) {
 		*rec_r = NULL;
@@ -257,7 +258,7 @@
 		mail_index_lookup_ext(sync_ctx->sync_view,
 				      sync_ctx->idx_seq,
 				      sync_ctx->mbox->md5hdr_ext_idx,
-				      &data, NULL);
+				      &data, &expunged);
 		if (data != NULL && memcmp(data, hdr_md5_sum, 16) == 0)
 			break;
 
@@ -277,12 +278,13 @@
 {
 	const void *data;
 	uint64_t offset;
+	bool expunged;
 
 	if (!nocheck) {
 		/* see if from_offset needs updating */
 		mail_index_lookup_ext(sync_ctx->sync_view, sync_ctx->idx_seq,
 				      sync_ctx->mbox->mbox_ext_idx,
-				      &data, NULL);
+				      &data, &expunged);
 		if (data != NULL &&
 		    *((const uint64_t *)data) == mail->from_offset)
 			return;
@@ -314,9 +316,11 @@
 {
         struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx;
 	const void *ext_data;
+	bool expunged;
 
 	mail_index_lookup_ext(sync_ctx->sync_view, sync_ctx->idx_seq,
-			      sync_ctx->mbox->md5hdr_ext_idx, &ext_data, NULL);
+			      sync_ctx->mbox->md5hdr_ext_idx,
+			      &ext_data, &expunged);
 	if (ext_data == NULL ||
 	    memcmp(mail_ctx->hdr_md5_sum, ext_data, 16) != 0) {
 		mail_index_update_ext(sync_ctx->t, sync_ctx->idx_seq,
@@ -1412,8 +1416,7 @@
 {
 	const char *path;
 
-	path = mailbox_list_get_path(list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_CONTROL);
+	path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_CONTROL);
 	path = t_strconcat(path, "/"MBOX_UIDVALIDITY_FNAME, NULL);
 	return mailbox_uidvalidity_next(list, path);
 }
--- a/src/lib-storage/index/raw/raw-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/raw/raw-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -40,7 +40,7 @@
 	return user;
 }
 
-static int
+static int ATTR_NULL(2, 3)
 raw_mailbox_alloc_common(struct mail_user *user, struct istream *input,
 			 const char *path, time_t received_time,
 			 const char *envelope_sender, struct mailbox **box_r)
@@ -125,7 +125,7 @@
 	mbox->box.list = list;
 	mbox->box.mail_vfuncs = &raw_mail_vfuncs;
 
-	index_storage_mailbox_alloc(&mbox->box, vname, flags, NULL);
+	index_storage_mailbox_alloc(&mbox->box, vname, flags, "dovecot.index");
 
 	mbox->mtime = mbox->ctime = (time_t)-1;
 	mbox->storage = (struct raw_storage *)storage;
--- a/src/lib-storage/index/shared/shared-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/index/shared/shared-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -125,7 +125,7 @@
 	const char *path;
 	struct stat st;
 
-	path = mailbox_list_get_path(ns->list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
+	path = mailbox_list_get_root_path(ns->list, MAILBOX_LIST_PATH_TYPE_DIR);
 	if (path == NULL) {
 		/* we can't know if this exists */
 		return TRUE;
--- a/src/lib-storage/list/mailbox-list-delete.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-delete.c	Sun Jun 24 00:52:57 2012 +0300
@@ -19,8 +19,7 @@
 {
 	const char *root_dir;
 
-	root_dir = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_DIR);
+	root_dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_DIR);
 	if (strcmp(root_dir, path) != 0)
 		return 0;
 
@@ -242,7 +241,7 @@
 	const char *root_dir, *p;
 	unsigned int len;
 
-	root_dir = mailbox_list_get_path(list, NULL, type);
+	root_dir = mailbox_list_get_root_path(list, type);
 	if (strncmp(path, root_dir, strlen(root_dir)) != 0) {
 		/* mbox workaround: name=child/box, root_dir=mail/.imap/,
 		   path=mail/child/.imap/box. we'll want to try to delete
--- a/src/lib-storage/list/mailbox-list-fs-iter.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-fs-iter.c	Sun Jun 24 00:52:57 2012 +0300
@@ -97,8 +97,8 @@
 	string_t *dest = t_str_new(128);
 	const char *root, *src;
 
-	root = mailbox_list_get_path(ctx->ctx.list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root = mailbox_list_get_root_path(ctx->ctx.list,
+					  MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	src = t_strconcat(root, "/", storage_name, NULL);
 
 	(void)uni_utf8_get_valid_data((const void *)storage_name,
@@ -153,8 +153,8 @@
 	}
 	if (strcmp(d->d_name, ctx->ctx.list->set.subscription_fname) == 0) {
 		/* if this is the subscriptions file, skip it */
-		root_dir = mailbox_list_get_path(ctx->ctx.list, NULL,
-						 MAILBOX_LIST_PATH_TYPE_DIR);
+		root_dir = mailbox_list_get_root_path(ctx->ctx.list,
+						      MAILBOX_LIST_PATH_TYPE_DIR);
 		if (strcmp(root_dir, dir_path) == 0)
 			return 0;
 	}
@@ -229,8 +229,8 @@
 	}
 	if (*path != '/') {
 		/* non-absolute path. add the mailbox root dir as prefix. */
-		root = mailbox_list_get_path(ctx->ctx.list, NULL,
-					     MAILBOX_LIST_PATH_TYPE_MAILBOX);
+		root = mailbox_list_get_root_path(ctx->ctx.list,
+						  MAILBOX_LIST_PATH_TYPE_MAILBOX);
 		path = *path == '\0' ? root :
 			t_strconcat(root, "/", path, NULL);
 	}
--- a/src/lib-storage/list/mailbox-list-fs.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-fs.c	Sun Jun 24 00:52:57 2012 +0300
@@ -150,7 +150,7 @@
 
 	if (name == NULL) {
 		/* return root directories */
-		return mailbox_list_get_root_path(set, type);
+		return mailbox_list_set_get_root_path(set, type);
 	}
 
 	i_assert(mailbox_list_is_valid_pattern(_list, name));
@@ -318,8 +318,7 @@
 {
 	const char *root_dir;
 
-	root_dir = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_DIR);
+	root_dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_DIR);
 	return t_strdup_printf("%s/"MAILBOX_LIST_FS_TRASH_DIR_NAME, root_dir);
 }
 
@@ -514,8 +513,7 @@
 	newpath = mailbox_list_get_path(newlist, newname, path_type);
 	alt_newpath = mailbox_list_get_path(newlist, newname, alt_path_type);
 
-	root_path = mailbox_list_get_path(oldlist, NULL,
-					  MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_path = mailbox_list_get_root_path(oldlist, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	if (strcmp(oldpath, root_path) == 0) {
 		/* most likely INBOX */
 		mailbox_list_set_error(oldlist, MAIL_ERROR_NOTPOSSIBLE,
--- a/src/lib-storage/list/mailbox-list-index-status.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-index-status.c	Sun Jun 24 00:52:57 2012 +0300
@@ -60,7 +60,7 @@
 	return 1;
 }
 
-static bool
+static bool ATTR_NULL(6)
 index_list_get_view_status(struct mailbox *box, struct mail_index_view *view,
 			   uint32_t seq, enum mailbox_status_items items,
 			   struct mailbox_status *status_r,
--- a/src/lib-storage/list/mailbox-list-index.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-index.c	Sun Jun 24 00:52:57 2012 +0300
@@ -355,7 +355,7 @@
 	struct mailbox_list_index *ilist;
 	const char *dir;
 
-	dir = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_INDEX);
+	dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX);
 	if (!list->mail_set->mailbox_list_index) {
 		/* reserve the module context anyway, so syncing code knows
 		   that the index is disabled */
--- a/src/lib-storage/list/mailbox-list-maildir.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Sun Jun 24 00:52:57 2012 +0300
@@ -193,7 +193,7 @@
 
 	if (name == NULL) {
 		/* return root directories */
-		return mailbox_list_get_root_path(&_list->set, type);
+		return mailbox_list_set_get_root_path(&_list->set, type);
 	}
 
 	if (_list->mail_set->mail_full_filesystem_access &&
@@ -334,8 +334,7 @@
 		path = t_strdup_until(path, p);
 	}
 
-	root_dir = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	mailbox_list_get_permissions(list, name, &perm);
 	if (mkdir_parents_chgrp(path, perm.dir_create_mode,
 				perm.file_create_gid,
@@ -375,8 +374,7 @@
 		(struct maildir_mailbox_list *)_list;
 	const char *root_dir;
 
-	root_dir = mailbox_list_get_path(_list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_DIR);
+	root_dir = mailbox_list_get_root_path(_list, MAILBOX_LIST_PATH_TYPE_DIR);
 	return t_strdup_printf("%s/%c%c"MAILBOX_LIST_MAILDIR_TRASH_DIR_NAME,
 			       root_dir, list->sep, list->sep);
 }
@@ -571,8 +569,8 @@
 	newpath = mailbox_list_get_path(newlist, newname,
 					MAILBOX_LIST_PATH_TYPE_MAILBOX);
 
-	root_path = mailbox_list_get_path(oldlist, NULL,
-					  MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_path = mailbox_list_get_root_path(oldlist,
+					       MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	if (strcmp(oldpath, root_path) == 0) {
 		/* most likely INBOX */
 		mailbox_list_set_error(oldlist, MAIL_ERROR_NOTPOSSIBLE,
--- a/src/lib-storage/mail-namespace.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-namespace.h	Sun Jun 24 00:52:57 2012 +0300
@@ -74,7 +74,7 @@
 
 int mail_namespaces_init(struct mail_user *user, const char **error_r);
 int mail_namespaces_init_location(struct mail_user *user, const char *location,
-				  const char **error_r);
+				  const char **error_r) ATTR_NULL(2);
 struct mail_namespace *mail_namespaces_init_empty(struct mail_user *user);
 /* Deinitialize all namespaces. mail_user_deinit() calls this automatically
    for user's namespaces. */
--- a/src/lib-storage/mail-search.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-search.h	Sun Jun 24 00:52:57 2012 +0300
@@ -123,7 +123,8 @@
    change uidsets to seqsets. */
 void mail_search_args_init(struct mail_search_args *args,
 			   struct mailbox *box, bool change_uidsets,
-			   const ARRAY_TYPE(seq_range) *search_saved_uidset);
+			   const ARRAY_TYPE(seq_range) *search_saved_uidset)
+	ATTR_NULL(4);
 /* Free keywords. The args can initialized afterwards again if needed.
    The args can be reused for other queries after calling this. */
 void mail_search_args_deinit(struct mail_search_args *args);
@@ -149,7 +150,7 @@
    Returns 1 = search matched, 0 = search unmatched, -1 = don't know yet */
 int mail_search_args_foreach(struct mail_search_arg *args,
 			     mail_search_foreach_callback_t *callback,
-			     void *context);
+			     void *context) ATTR_NULL(3);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define mail_search_args_foreach(args, callback, context) \
 	({(void)(1 ? 0 : callback((struct mail_search_arg *)NULL, context)); \
--- a/src/lib-storage/mail-storage-service.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-storage-service.c	Sun Jun 24 00:52:57 2012 +0300
@@ -1208,7 +1208,7 @@
 		(void)auth_master_user_list_deinit(&ctx->auth_list);
 	mail_storage_service_init_settings(ctx, NULL);
 
-	ctx->auth_list = auth_master_user_list_init(ctx->conn, NULL, NULL);
+	ctx->auth_list = auth_master_user_list_init(ctx->conn, "", NULL);
 	return auth_master_user_list_count(ctx->auth_list);
 }
 
--- a/src/lib-storage/mail-storage-service.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-storage-service.h	Sun Jun 24 00:52:57 2012 +0300
@@ -59,7 +59,7 @@
 struct mail_storage_service_ctx *
 mail_storage_service_init(struct master_service *service,
 			  const struct setting_parser_info *set_roots[],
-			  enum mail_storage_service_flags flags);
+			  enum mail_storage_service_flags flags) ATTR_NULL(2);
 struct auth_master_connection *
 mail_storage_service_get_auth_conn(struct mail_storage_service_ctx *ctx);
 int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
@@ -67,12 +67,13 @@
 				       pool_t pool,
 				       const struct setting_parser_info **user_info_r,
 				       const struct setting_parser_context **parser_r,
-				       const char **error_r);
+				       const char **error_r) ATTR_NULL(2);
 /* Read settings and initialize context to use them. Do nothing if service is
    already initialized. This is mainly necessary when calling _get_auth_conn()
    or _all_init(). */
 void mail_storage_service_init_settings(struct mail_storage_service_ctx *ctx,
-					const struct mail_storage_service_input *input);
+					const struct mail_storage_service_input *input)
+	ATTR_NULL(2);
 /* Returns 1 if ok, 0 if user wasn't found, -1 if fatal error,
    -2 if error is user-specific (e.g. invalid settings).
    Error can be safely shown to untrusted users. */
--- a/src/lib-storage/mail-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -234,8 +234,7 @@
 	bool autocreate;
 	int ret;
 
-	root_dir = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	if (root_dir == NULL) {
 		/* storage doesn't use directories (e.g. shared root) */
 		return 0;
@@ -860,7 +859,8 @@
 	return ret;
 }
 
-static int mailbox_open_full(struct mailbox *box, struct istream *input)
+static int ATTR_NULL(2)
+mailbox_open_full(struct mailbox *box, struct istream *input)
 {
 	int ret;
 
@@ -1383,7 +1383,10 @@
 
 void mailbox_notify_changes_stop(struct mailbox *box)
 {
-	mailbox_notify_changes(box, NULL, NULL);
+	box->notify_callback = NULL;
+	box->notify_context = NULL;
+
+	box->v.notify_changes(box);
 }
 
 struct mail_search_context *
--- a/src/lib-storage/mail-storage.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-storage.h	Sun Jun 24 00:52:57 2012 +0300
@@ -355,7 +355,8 @@
    from ns location. If ns location is NULL, it uses the first storage that
    exists. The storage is put into ns->storage. */
 int mail_storage_create(struct mail_namespace *ns, const char *driver,
-			enum mail_storage_flags flags, const char **error_r);
+			enum mail_storage_flags flags, const char **error_r)
+	ATTR_NULL(2);
 void mail_storage_unref(struct mail_storage **storage);
 
 /* Returns the mail storage settings. */
@@ -366,7 +367,7 @@
 /* Set storage callback functions to use. */
 void mail_storage_set_callbacks(struct mail_storage *storage,
 				struct mail_storage_callbacks *callbacks,
-				void *context);
+				void *context) ATTR_NULL(3);
 
 /* Purge storage's mailboxes (freeing disk space from expunged mails),
    if supported by the storage. Otherwise just a no-op. */
@@ -374,10 +375,10 @@
 
 /* Returns the error message of last occurred error. */
 const char *mail_storage_get_last_error(struct mail_storage *storage,
-					enum mail_error *error_r);
+					enum mail_error *error_r) ATTR_NULL(2);
 /* Wrapper for mail_storage_get_last_error(); */
 const char *mailbox_get_last_error(struct mailbox *box,
-				   enum mail_error *error_r);
+				   enum mail_error *error_r) ATTR_NULL(2);
 /* Wrapper for mail_storage_get_last_error(); */
 enum mail_error mailbox_get_last_mail_error(struct mailbox *box);
 
@@ -415,7 +416,7 @@
    If update is non-NULL, its contents are used to set initial mailbox
    metadata. */
 int mailbox_create(struct mailbox *box, const struct mailbox_update *update,
-		   bool directory);
+		   bool directory) ATTR_NULL(2);
 /* Update existing mailbox's metadata. */
 int mailbox_update(struct mailbox *box, const struct mailbox_update *update);
 /* Delete mailbox (and its parent directory, if it has no siblings) */
@@ -495,7 +496,8 @@
 
 /* Call given callback function when something changes in the mailbox. */
 void mailbox_notify_changes(struct mailbox *box,
-			    mailbox_notify_callback_t *callback, void *context);
+			    mailbox_notify_callback_t *callback, void *context)
+	ATTR_NULL(3);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define mailbox_notify_changes(box, callback, context) \
 	({(void)(1 ? 0 : callback((struct mailbox *)NULL, context)); \
@@ -558,7 +560,7 @@
 
 /* Initialize new search request. If sort_program is non-NULL, the messages are
    returned in the requested order, otherwise from first to last. */
-struct mail_search_context *
+struct mail_search_context * ATTR_NULL(3, 5)
 mailbox_search_init(struct mailbox_transaction_context *t,
 		    struct mail_search_args *args,
 		    const enum mail_sort_type *sort_program,
@@ -689,7 +691,8 @@
 
 struct mail *mail_alloc(struct mailbox_transaction_context *t,
 			enum mail_fetch_field wanted_fields,
-			struct mailbox_header_lookup_ctx *wanted_headers);
+			struct mailbox_header_lookup_ctx *wanted_headers)
+	ATTR_NULL(3);
 void mail_free(struct mail **mail);
 void mail_set_seq(struct mail *mail, uint32_t seq);
 /* Returns TRUE if successful, FALSE if message doesn't exist.
@@ -700,7 +703,8 @@
    after the next mail_set_seq/uid(). */
 void mail_add_temp_wanted_fields(struct mail *mail,
 				 enum mail_fetch_field fields,
-				 struct mailbox_header_lookup_ctx *headers);
+				 struct mailbox_header_lookup_ctx *headers)
+	ATTR_NULL(3);
 
 /* Returns message's flags */
 enum mail_flags mail_get_flags(struct mail *mail);
@@ -758,11 +762,12 @@
    hdr_size and body_size are updated unless they're NULL. The returned stream
    is destroyed automatically, don't unreference it. */
 int mail_get_stream(struct mail *mail, struct message_size *hdr_size,
-		    struct message_size *body_size, struct istream **stream_r);
+		    struct message_size *body_size, struct istream **stream_r)
+	ATTR_NULL(2, 3);
 /* Similar to mail_get_stream(), but the stream may or may not contain the
    message body. */
 int mail_get_hdr_stream(struct mail *mail, struct message_size *hdr_size,
-			struct istream **stream_r);
+			struct istream **stream_r) ATTR_NULL(2);
 
 /* Get any of the "special" fields. Unhandled specials are returned as "". */
 int mail_get_special(struct mail *mail, enum mail_fetch_field field,
--- a/src/lib-storage/mail-thread.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail-thread.h	Sun Jun 24 00:52:57 2012 +0300
@@ -28,7 +28,7 @@
 
 /* Build thread from given search arguments. args=NULL searches everything. */
 int mail_thread_init(struct mailbox *box, struct mail_search_args *args,
-		     struct mail_thread_context **ctx_r);
+		     struct mail_thread_context **ctx_r) ATTR_NULL(2);
 void mail_thread_deinit(struct mail_thread_context **ctx);
 
 /* Iterate through thread tree. If write_seqs=TRUE, sequences are returned in
--- a/src/lib-storage/mail.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mail.c	Sun Jun 24 00:52:57 2012 +0300
@@ -110,10 +110,6 @@
 int mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
 {
 	struct mail_private *p = (struct mail_private *)mail;
-	int tz;
-
-	if (timezone_r == NULL)
-		timezone_r = &tz;
 
 	return p->v.get_date(mail, date_r, timezone_r);
 }
--- a/src/lib-storage/mailbox-get.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mailbox-get.c	Sun Jun 24 00:52:57 2012 +0300
@@ -150,7 +150,7 @@
 	}
 }
 
-static bool
+static bool ATTR_NULL(4, 5)
 mailbox_get_expunges_full(struct mailbox *box, uint64_t prev_modseq,
 			  const ARRAY_TYPE(seq_range) *uids_filter,
 			  ARRAY_TYPE(seq_range) *expunged_uids,
--- a/src/lib-storage/mailbox-list-private.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mailbox-list-private.h	Sun Jun 24 00:52:57 2012 +0300
@@ -181,8 +181,8 @@
 const char *mailbox_list_get_unexpanded_path(struct mailbox_list *list,
 					     enum mailbox_list_path_type type);
 const char *
-mailbox_list_get_root_path(const struct mailbox_list_settings *set,
-			   enum mailbox_list_path_type type);
+mailbox_list_set_get_root_path(const struct mailbox_list_settings *set,
+			       enum mailbox_list_path_type type);
 
 int mailbox_list_delete_index_control(struct mailbox_list *list,
 				      const char *name);
@@ -195,7 +195,7 @@
 bool mailbox_list_try_get_absolute_path(struct mailbox_list *list,
 					const char **name);
 int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
-					  const char *name);
+					  const char *name) ATTR_NULL(2);
 int mailbox_list_create_missing_index_pvt_dir(struct mailbox_list *list,
 					      const char *name);
 
--- a/src/lib-storage/mailbox-list.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mailbox-list.c	Sun Jun 24 00:52:57 2012 +0300
@@ -357,7 +357,7 @@
 
 	if (mailbox_list_settings_parse(user, p + 1, &set, &error) < 0)
 		return "";
-	return mailbox_list_get_root_path(&set, type);
+	return mailbox_list_set_get_root_path(&set, type);
 }
 
 static const char *
@@ -634,8 +634,10 @@
 	return list->v.get_hierarchy_sep(list);
 }
 
-void mailbox_list_get_permissions(struct mailbox_list *list, const char *name,
-				  struct mailbox_permissions *permissions_r)
+static void ATTR_NULL(2)
+mailbox_list_get_permissions_internal(struct mailbox_list *list,
+				      const char *name,
+				      struct mailbox_permissions *permissions_r)
 {
 	const char *path, *parent_name, *p;
 	struct stat st;
@@ -650,7 +652,9 @@
 	permissions_r->file_create_gid = (gid_t)-1;
 	permissions_r->file_create_gid_origin = "defaults";
 
-	path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
+	path = name == NULL ?
+		mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_DIR) :
+		mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
 	if (path == NULL) {
 		/* no filesystem support in storage */
 	} else if (stat(path, &st) < 0) {
@@ -728,6 +732,12 @@
 	}
 }
 
+void mailbox_list_get_permissions(struct mailbox_list *list, const char *name,
+				  struct mailbox_permissions *permissions_r)
+{
+	mailbox_list_get_permissions_internal(list, name, permissions_r);
+}
+
 void mailbox_list_get_root_permissions(struct mailbox_list *list,
 				       mode_t *file_mode_r, mode_t *dir_mode_r,
 				       gid_t *gid_r, const char **gid_origin_r)
@@ -740,7 +750,7 @@
 		*gid_r = list->file_create_gid;
 		*gid_origin_r = list->file_create_gid_origin;
 	} else {
-		mailbox_list_get_permissions(list, NULL, &perm);
+		mailbox_list_get_permissions_internal(list, NULL, &perm);
 
 		*file_mode_r = perm.file_create_mode;
 		*dir_mode_r = perm.dir_create_mode;
@@ -848,7 +858,7 @@
 		if (p == unexpanded)
 			expanded = "";
 		else {
-			expanded = mailbox_list_get_path(list, NULL, type);
+			expanded = mailbox_list_get_root_path(list, type);
 			expanded = get_expanded_path(unexpanded, p, expanded);
 		}
 	}
@@ -944,9 +954,15 @@
 	return list->v.get_path(list, name, type);
 }
 
+const char *mailbox_list_get_root_path(struct mailbox_list *list,
+				       enum mailbox_list_path_type type)
+{
+	return list->v.get_path(list, NULL, type);
+}
+
 const char *
-mailbox_list_get_root_path(const struct mailbox_list_settings *set,
-			   enum mailbox_list_path_type type)
+mailbox_list_set_get_root_path(const struct mailbox_list_settings *set,
+			       enum mailbox_list_path_type type)
 {
 	const char *path;
 
@@ -1073,8 +1089,7 @@
 		return mailbox_list_iter_deinit(&iter);
 	}
 
-	rootdir = mailbox_list_get_path(list, NULL,
-					MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	rootdir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	i_assert(rootdir != NULL);
 	path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
 
@@ -1126,7 +1141,7 @@
 
 	/* don't do this in mailbox_list_create(), because _get_path() might be
 	   overridden by storage (mbox). */
-	path = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_INDEX);
+	path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX);
 	if (*path == '\0')
 		return FALSE;
 
@@ -1325,8 +1340,7 @@
 
 	/* okay, we have an absolute path now. but check first if it points to
 	   same directory as one of our regular mailboxes. */
-	root_dir = mailbox_list_get_path(list, NULL,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_dir = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	len = strlen(root_dir);
 	if (strncmp(root_dir, *name, len) == 0 && (*name)[len] == '/') {
 		mailbox_name = *name + len + 1;
@@ -1347,7 +1361,15 @@
 {
 	struct mailbox_permissions perm;
 
-	mailbox_list_get_permissions(list, mailbox, &perm);
+	if (mailbox != NULL)
+		mailbox_list_get_permissions(list, mailbox, &perm);
+	else {
+		mailbox_list_get_root_permissions(list, 
+						  &perm.file_create_mode,
+						  &perm.dir_create_mode,
+						  &perm.file_create_gid,
+						  &perm.file_create_gid_origin);
+	}
 	if (mkdir_parents_chgrp(path, perm.dir_create_mode,
 				perm.file_create_gid,
 				perm.file_create_gid_origin) < 0 &&
@@ -1371,16 +1393,17 @@
 	return mailbox_list_mkdir(list, mailbox, t_strdup_until(path, p));
 }
 
-static int mailbox_list_create_missing_dir(struct mailbox_list *list,
-					   const char *name,
-					   enum mailbox_list_path_type type)
+static int ATTR_NULL(2)
+mailbox_list_create_missing_dir(struct mailbox_list *list, const char *name,
+				enum mailbox_list_path_type type)
 {
 	const char *root_dir, *index_dir, *parent_dir, *p, *error;
 	struct mailbox_permissions perm;
 	unsigned int n = 0;
 
-	root_dir = mailbox_list_get_path(list, name,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	root_dir = name == NULL ?
+		mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_MAILBOX) :
+		mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	index_dir = mailbox_list_get_path(list, name, type);
 	if (index_dir == NULL || *index_dir == '\0')
 		return 0;
--- a/src/lib-storage/mailbox-list.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mailbox-list.h	Sun Jun 24 00:52:57 2012 +0300
@@ -213,12 +213,13 @@
 				       gid_t *gid_r, const char **gid_origin_r);
 /* Create path's directory with proper permissions. */
 int mailbox_list_mkdir(struct mailbox_list *list,
-		       const char *mailbox, const char *path);
+		       const char *mailbox, const char *path) ATTR_NULL(2);
 /* Like mailbox_list_mkdir(), but create path's parent parent directory.
    Since most directories are created lazily, this function can be used to
    easily create them whenever file creation fails with ENOENT. */
 int mailbox_list_mkdir_parent(struct mailbox_list *list,
-			      const char *mailbox, const char *path);
+			      const char *mailbox, const char *path)
+	ATTR_NULL(2);
 /* mkdir() a root directory of given type with proper permissions. */
 int mailbox_list_mkdir_root(struct mailbox_list *list, const char *path,
 			    enum mailbox_list_path_type type,
@@ -238,10 +239,12 @@
 const char *mailbox_list_get_vname(struct mailbox_list *list, const char *name);
 
 /* Return full path for the given mailbox name. The name must be a valid
-   existing mailbox name, or NULL to get the root directory.
-   For INDEX=MEMORY it returns "" as the path. */
+   existing mailbox name. For INDEX=MEMORY it returns "" as the path. */
 const char *mailbox_list_get_path(struct mailbox_list *list, const char *name,
 				  enum mailbox_list_path_type type);
+/* Returns root directory path for given type. */
+const char *mailbox_list_get_root_path(struct mailbox_list *list,
+				       enum mailbox_list_path_type type);
 /* Returns mailbox's change log, or NULL if it doesn't have one. */
 struct mailbox_log *mailbox_list_get_changelog(struct mailbox_list *list);
 /* Specify timestamp to use when writing mailbox changes to changelog.
--- a/src/lib-storage/mailbox-tree.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mailbox-tree.c	Sun Jun 24 00:52:57 2012 +0300
@@ -62,7 +62,7 @@
 	tree->nodes = NULL;
 }
 
-static struct mailbox_node *
+static struct mailbox_node * ATTR_NULL(2)
 mailbox_tree_traverse(struct mailbox_tree_context *tree, const char *path,
 		      bool create, bool *created_r)
 {
@@ -138,8 +138,7 @@
 	if (created && tree->parents_nonexistent)
 		node->flags = 0;
 
-	if (created_r != NULL)
-		*created_r = created;
+	*created_r = created;
 	return node;
 }
 
@@ -163,7 +162,7 @@
 
 	ctx = i_new(struct mailbox_tree_iterate_context, 1);
 	ctx->separator = tree->separator;
-	ctx->root = root != NULL ? root : mailbox_tree_get(tree, NULL, NULL);
+	ctx->root = root != NULL ? root : tree->nodes;
 	ctx->flags_mask = flags_mask;
 	ctx->path_str = str_new(default_pool, 256);
 	i_array_init(&ctx->node_path, 16);
--- a/src/lib-storage/mailbox-tree.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-storage/mailbox-tree.h	Sun Jun 24 00:52:57 2012 +0300
@@ -27,7 +27,7 @@
 struct mailbox_node *
 mailbox_tree_lookup(struct mailbox_tree_context *tree, const char *path);
 
-struct mailbox_tree_iterate_context *
+struct mailbox_tree_iterate_context * ATTR_NULL(2)
 mailbox_tree_iterate_init(struct mailbox_tree_context *tree,
 			  struct mailbox_node *root, unsigned int flags_mask);
 struct mailbox_node *
--- a/src/lib-test/test-common.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib-test/test-common.h	Sun Jun 24 00:52:57 2012 +0300
@@ -15,7 +15,8 @@
 void test_end(void);
 
 void test_out(const char *name, bool success);
-void test_out_reason(const char *name, bool success, const char *reason);
+void test_out_reason(const char *name, bool success, const char *reason)
+	ATTR_NULL(3);
 
 int test_run(void (*test_functions[])(void));
 
--- a/src/lib/base64.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/base64.h	Sun Jun 24 00:52:57 2012 +0300
@@ -15,7 +15,7 @@
    If src_pos is non-NULL, it's updated to first non-translated character in
    src. */
 int base64_decode(const void *src, size_t src_size,
-		  size_t *src_pos_r, buffer_t *dest);
+		  size_t *src_pos_r, buffer_t *dest) ATTR_NULL(3);
 
 /* Decode given string to a buffer allocated from data stack. */
 buffer_t *t_base64_decode_str(const char *str);
--- a/src/lib/buffer.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/buffer.h	Sun Jun 24 00:52:57 2012 +0300
@@ -73,7 +73,8 @@
 /* Like buffer_get_data(), but don't return it as const. Returns NULL if the
    buffer is non-modifiable. WARNING: The returned address may become invalid
    if you add more data to buffer. */
-void *buffer_get_modifiable_data(const buffer_t *buf, size_t *used_size_r);
+void *buffer_get_modifiable_data(const buffer_t *buf, size_t *used_size_r)
+	ATTR_NULL(2);
 
 /* Set the "used size" of buffer, ie. 0 would set the buffer empty.
    Must not be used to grow buffer. */
@@ -87,7 +88,7 @@
 
 /* Returns pointer to beginning of buffer data. Current used size of buffer is
    stored in used_size if it's non-NULL. */
-static inline const void *
+static inline const void * ATTR_NULL(2)
 buffer_get_data(const buffer_t *buf, size_t *used_size_r)
 {
 	if (used_size_r != NULL)
--- a/src/lib/child-wait.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/child-wait.h	Sun Jun 24 00:52:57 2012 +0300
@@ -13,7 +13,7 @@
 
 struct child_wait *
 child_wait_new_with_pid(pid_t pid, child_wait_callback_t *callback,
-			void *context);
+			void *context) ATTR_NULL(3);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define child_wait_new_with_pid(pid, callback, context) \
 	({(void)(1 ? 0 : callback((const struct child_wait_status *)0, \
--- a/src/lib/eacces-error.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/eacces-error.h	Sun Jun 24 00:52:57 2012 +0300
@@ -8,6 +8,7 @@
    failures when only the group is being changed. gid_origin specifies why
    exactly this group is being used. */
 const char *eperm_error_get_chgrp(const char *func, const char *path,
-				  gid_t gid, const char *gid_origin);
+				  gid_t gid, const char *gid_origin)
+	ATTR_NULL(4);
 
 #endif
--- a/src/lib/failures.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/failures.c	Sun Jun 24 00:52:57 2012 +0300
@@ -342,29 +342,21 @@
 
 void i_set_fatal_handler(failure_callback_t *callback ATTR_NORETURN)
 {
-	if (callback == NULL)
-		callback = default_fatal_handler;
         fatal_handler = callback;
 }
 
 void i_set_error_handler(failure_callback_t *callback)
 {
-	if (callback == NULL)
-		callback = default_error_handler;
 	error_handler = callback;
 }
 
 void i_set_info_handler(failure_callback_t *callback)
 {
-	if (callback == NULL)
-		callback = default_error_handler;
 	info_handler = callback;
 }
 
 void i_set_debug_handler(failure_callback_t *callback)
 {
-	if (callback == NULL)
-		callback = default_error_handler;
 	debug_handler = callback;
 }
 
@@ -504,10 +496,10 @@
 	log_info_fd = log_fd;
 	log_debug_fd = log_fd;
 
-	i_set_fatal_handler(NULL);
-	i_set_error_handler(NULL);
-	i_set_info_handler(NULL);
-	i_set_debug_handler(NULL);
+	i_set_fatal_handler(default_fatal_handler);
+	i_set_error_handler(default_error_handler);
+	i_set_info_handler(default_error_handler);
+	i_set_debug_handler(default_error_handler);
 }
 
 static void i_failure_send_option(const char *key, const char *value)
@@ -680,7 +672,7 @@
 	/* write debug-level messages to the info_log_path,
 	  until i_set_debug_file() was called */
 	log_debug_fd = log_info_fd;
-	i_set_debug_handler(NULL);
+	i_set_debug_handler(default_error_handler);
 }
 
 void i_set_debug_file(const char *path)
--- a/src/lib/file-dotlock.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/file-dotlock.c	Sun Jun 24 00:52:57 2012 +0300
@@ -800,7 +800,7 @@
 	return dotlock->fd;
 }
 
-static int
+static int ATTR_NULL(7)
 file_dotlock_open_mode_full(const struct dotlock_settings *set, const char *path,
 			    enum dotlock_create_flags flags,
 			    mode_t mode, uid_t uid, gid_t gid,
--- a/src/lib/hash.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/hash.c	Sun Jun 24 00:52:57 2012 +0300
@@ -171,10 +171,8 @@
 	if (node == NULL)
 		return FALSE;
 
-	if (orig_key != NULL)
-		*orig_key = node->key;
-	if (value != NULL)
-		*value = node->value;
+	*orig_key = node->key;
+	*value = node->value;
 	return TRUE;
 }
 
--- a/src/lib/hash.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/hash.h	Sun Jun 24 00:52:57 2012 +0300
@@ -14,7 +14,8 @@
    be free'd before hash_table_destroy() is called. */
 struct hash_table *
 hash_table_create(pool_t table_pool, pool_t node_pool, unsigned int initial_size,
-		  hash_callback_t *hash_cb, hash_cmp_callback_t *key_compare_cb);
+		  hash_callback_t *hash_cb, hash_cmp_callback_t *key_compare_cb)
+	ATTR_NULL(4, 5);
 void hash_table_destroy(struct hash_table **table);
 /* Remove all nodes from hash table. If free_collisions is TRUE, the
    memory allocated from node_pool is freed, or discarded with
--- a/src/lib/hash2.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/hash2.h	Sun Jun 24 00:52:57 2012 +0300
@@ -16,7 +16,7 @@
 struct hash2_table *
 hash2_create(unsigned int initial_size, unsigned int value_size,
 	     hash2_key_callback_t *key_hash_cb,
-	     hash2_cmp_callback_t *key_compare_cb, void *context);
+	     hash2_cmp_callback_t *key_compare_cb, void *context) ATTR_NULL(5);
 void hash2_destroy(struct hash2_table **hash);
 /* Remove all nodes from hash table. */
 void hash2_clear(struct hash2_table *hash);
--- a/src/lib/ioloop-notify-fd.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/ioloop-notify-fd.h	Sun Jun 24 00:52:57 2012 +0300
@@ -16,8 +16,9 @@
 	struct io_notify *notifies;
 };
 
-struct io *io_notify_fd_add(struct ioloop_notify_fd_context *ctx, int fd,
-			    io_callback_t *callback, void *context);
+struct io *
+io_notify_fd_add(struct ioloop_notify_fd_context *ctx, int fd,
+		 io_callback_t *callback, void *context) ATTR_NULL(4);
 void io_notify_fd_free(struct ioloop_notify_fd_context *ctx,
 		       struct io_notify *io);
 
--- a/src/lib/ioloop.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/ioloop.c	Sun Jun 24 00:52:57 2012 +0300
@@ -189,7 +189,7 @@
 	timeout_free(timeout);
 }
 
-static void
+static void ATTR_NULL(2)
 timeout_reset_timeval(struct timeout *timeout, struct timeval *tv_now)
 {
 	timeout_update_next(timeout, tv_now);
--- a/src/lib/ioloop.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/ioloop.h	Sun Jun 24 00:52:57 2012 +0300
@@ -47,12 +47,13 @@
    the behavior will be undefined. */
 struct io *io_add(int fd, enum io_condition condition,
 		  unsigned int source_linenum,
-		  io_callback_t *callback, void *context);
+		  io_callback_t *callback, void *context) ATTR_NULL(5);
 #define io_add(fd, condition, callback, context) \
 	CONTEXT_CALLBACK(io_add, io_callback_t, \
 			 callback, context, fd, condition, __LINE__)
-enum io_notify_result io_add_notify(const char *path, io_callback_t *callback,
-				    void *context, struct io **io_r);
+enum io_notify_result
+io_add_notify(const char *path, io_callback_t *callback,
+	      void *context, struct io **io_r) ATTR_NULL(3);
 #ifdef CONTEXT_TYPE_SAFETY
 #  define io_add_notify(path, callback, context, io_r) \
 	({(void)(1 ? 0 : callback(context)); \
@@ -69,15 +70,16 @@
 void io_remove_closed(struct io **io);
 
 /* Timeout handlers */
-struct timeout *timeout_add(unsigned int msecs, unsigned int source_linenum,
-			    timeout_callback_t *callback, void *context);
+struct timeout *
+timeout_add(unsigned int msecs, unsigned int source_linenum,
+	    timeout_callback_t *callback, void *context) ATTR_NULL(4);
 #define timeout_add(msecs, callback, context) \
 	CONTEXT_CALLBACK(timeout_add, timeout_callback_t, \
 			 callback, context, msecs, __LINE__), \
 	(void)COMPILE_ERROR_IF_TRUE(__builtin_constant_p(msecs) && (msecs > 0 && msecs < 1000))
 struct timeout *
 timeout_add_short(unsigned int msecs, unsigned int source_linenum,
-		  timeout_callback_t *callback, void *context);
+		  timeout_callback_t *callback, void *context) ATTR_NULL(4);
 #define timeout_add_short(msecs, callback, context) \
 	CONTEXT_CALLBACK(timeout_add_short, timeout_callback_t, \
 			 callback, context, msecs, __LINE__)
--- a/src/lib/iso8601-date.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/iso8601-date.c	Sun Jun 24 00:52:57 2012 +0300
@@ -249,26 +249,28 @@
 	if (timestamp == (time_t)-1)
 		return FALSE;
 
-	if (timezone_offset_r != NULL)
-		*timezone_offset_r = parser.timezone_offset;
-	if (tm_r != NULL)
-		*tm_r = parser.tm;
-	if (timestamp_r != NULL)
-		*timestamp_r = timestamp - parser.timezone_offset * 60;
+	*timezone_offset_r = parser.timezone_offset;
+	*tm_r = parser.tm;
+	*timestamp_r = timestamp - parser.timezone_offset * 60;
 	return TRUE;
 }
 
 bool iso8601_date_parse(const unsigned char *data, size_t size,
 			time_t *timestamp_r, int *timezone_offset_r)
 {
-	return iso8601_date_do_parse(data, size, NULL,
+	struct tm tm;
+
+	return iso8601_date_do_parse(data, size, &tm,
 				     timestamp_r, timezone_offset_r);
 }
 
 bool iso8601_date_parse_tm(const unsigned char *data, size_t size,
 			   struct tm *tm_r, int *timezone_offset_r)
 {
-	return iso8601_date_do_parse(data, size, tm_r, NULL, timezone_offset_r);
+	time_t timestamp;
+
+	return iso8601_date_do_parse(data, size, tm_r,
+				     &timestamp, timezone_offset_r);
 }
 
 const char *iso8601_date_create_tm(struct tm *tm, int timezone_offset)
--- a/src/lib/istream-base64-encoder.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream-base64-encoder.c	Sun Jun 24 00:52:57 2012 +0300
@@ -43,7 +43,7 @@
 {
 	struct istream_private *stream = &bstream->istream;
 	const unsigned char *data;
-	size_t size, buffer_avail;
+	size_t size, avail, buffer_avail;
 	buffer_t buf;
 
 	data = i_stream_get_data(stream->parent, &size);
@@ -53,7 +53,7 @@
 	if (bstream->cur_line_len == bstream->chars_per_line) {
 		/* @UNSAFE: end of line, add newline */
 		if (!i_stream_get_buffer_space(stream,
-					       bstream->crlf ? 2 : 1, NULL))
+					       bstream->crlf ? 2 : 1, &avail))
 			return FALSE;
 
 		if (bstream->crlf)
@@ -62,7 +62,7 @@
 		bstream->cur_line_len = 0;
 	}
 
-	i_stream_get_buffer_space(stream, (size+2)/3*4, NULL);
+	(void)i_stream_get_buffer_space(stream, (size+2)/3*4, &avail);
 	buffer_avail = stream->buffer_size - stream->pos;
 
 	if ((size + 2) / 3 * 4 > buffer_avail) {
--- a/src/lib/istream-chain.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream-chain.c	Sun Jun 24 00:52:57 2012 +0300
@@ -28,7 +28,9 @@
 	struct istream_chain chain;
 };
 
-void i_stream_chain_append(struct istream_chain *chain, struct istream *stream)
+static void ATTR_NULL(2)
+i_stream_chain_append_internal(struct istream_chain *chain,
+			       struct istream *stream)
 {
 	struct istream_chain_link *link;
 
@@ -55,6 +57,16 @@
 	DLLIST2_APPEND(&chain->head, &chain->tail, link);
 }
 
+void i_stream_chain_append(struct istream_chain *chain, struct istream *stream)
+{
+	return i_stream_chain_append_internal(chain, stream);
+}
+
+void i_stream_chain_append_eof(struct istream_chain *chain)
+{
+	return i_stream_chain_append_internal(chain, NULL);
+}
+
 static void
 i_stream_chain_set_max_buffer_size(struct iostream_private *stream,
 				    size_t max_size)
--- a/src/lib/istream-chain.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream-chain.h	Sun Jun 24 00:52:57 2012 +0300
@@ -11,8 +11,10 @@
    argument returns a pointer to the chain object. */
 struct istream *i_stream_create_chain(struct istream_chain **chain_r);
 
-/* Append an input stream to the chain. A NULL stream marks the end of the chain
-   and only then reads from the chain stream can return EOF. */
+/* Append an input stream to the chain. */
 void i_stream_chain_append(struct istream_chain *chain, struct istream *stream);
+/* Mark the end of the chain. Only then reads from the chain stream can
+   return EOF. */
+void i_stream_chain_append_eof(struct istream_chain *chain);
 
 #endif
--- a/src/lib/istream-crlf.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream-crlf.c	Sun Jun 24 00:52:57 2012 +0300
@@ -14,7 +14,7 @@
 static int i_stream_crlf_read_common(struct crlf_istream *cstream)
 {
 	struct istream_private *stream = &cstream->istream;
-	size_t size;
+	size_t size, avail;
 	ssize_t ret;
 
 	(void)i_stream_get_data(stream->parent, &size);
@@ -30,7 +30,7 @@
 		i_assert(size != 0);
 	}
 
-	if (!i_stream_get_buffer_space(stream, size, NULL))
+	if (!i_stream_get_buffer_space(stream, size, &avail))
 		return -2;
 	return 1;
 }
--- a/src/lib/istream-private.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream-private.h	Sun Jun 24 00:52:57 2012 +0300
@@ -48,7 +48,8 @@
 };
 
 struct istream *
-i_stream_create(struct istream_private *stream, struct istream *parent, int fd);
+i_stream_create(struct istream_private *stream, struct istream *parent, int fd)
+	ATTR_NULL(2);
 
 void i_stream_compress(struct istream_private *stream);
 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
--- a/src/lib/istream-seekable.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream-seekable.h	Sun Jun 24 00:52:57 2012 +0300
@@ -11,6 +11,6 @@
 i_stream_create_seekable(struct istream *input[],
 			 size_t max_buffer_size,
 			 int (*fd_callback)(const char **path_r, void *context),
-			 void *context);
+			 void *context) ATTR_NULL(4);
 
 #endif
--- a/src/lib/istream.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream.c	Sun Jun 24 00:52:57 2012 +0300
@@ -501,8 +501,7 @@
 		}
 	}
 
-	if (size_r != NULL)
-		*size_r = stream->buffer_size - stream->pos;
+	*size_r = stream->buffer_size - stream->pos;
 	return stream->pos != stream->buffer_size;
 }
 
--- a/src/lib/istream.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/istream.h	Sun Jun 24 00:52:57 2012 +0300
@@ -50,7 +50,8 @@
 void i_stream_unref(struct istream **stream);
 /* Call the given callback function when stream is destroyed. */
 void i_stream_set_destroy_callback(struct istream *stream,
-				   istream_callback_t *callback, void *context);
+				   istream_callback_t *callback, void *context)
+	ATTR_NULL(3);
 #define i_stream_set_destroy_callback(stream, callback, context) \
 	CONTEXT_CALLBACK(i_stream_set_destroy_callback, istream_callback_t, \
 			 callback, context, stream)
--- a/src/lib/lib-signals.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/lib-signals.c	Sun Jun 24 00:52:57 2012 +0300
@@ -151,7 +151,8 @@
 	   the system call might be restarted */
 }
 
-static void signal_read(void *context ATTR_UNUSED)
+static void ATTR_NULL(1)
+signal_read(void *context ATTR_UNUSED)
 {
 	siginfo_t signals[MAX_SIGNAL_VALUE+1];
 	sigset_t fullset, oldset;
--- a/src/lib/lib-signals.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/lib-signals.h	Sun Jun 24 00:52:57 2012 +0300
@@ -30,11 +30,13 @@
 
 /* Set signal handler for specific signal. */
 void lib_signals_set_handler(int signo, enum libsig_flags flags,
-			     signal_handler_t *handler, void *context);
+			     signal_handler_t *handler, void *context)
+	ATTR_NULL(4);
 /* Ignore given signal. */
 void lib_signals_ignore(int signo, bool restart_syscalls);
 void lib_signals_unset_handler(int signo,
-			       signal_handler_t *handler, void *context);
+			       signal_handler_t *handler, void *context)
+	ATTR_NULL(3);
 
 /* Remove and add the internal I/O handler back. This is necessary to get
    the delayed signals to work when using multiple I/O loops. */
--- a/src/lib/macros.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/macros.h	Sun Jun 24 00:52:57 2012 +0300
@@ -109,6 +109,11 @@
 #  define ATTR_CONST
 #  define ATTR_PURE
 #endif
+#ifdef HAVE_ATTR_NULL
+#  define ATTR_NULL(...) __attribute__((null(__VA_ARGS__)))
+#else
+#  define ATTR_NULL(...)
+#endif
 #if __GNUC__ > 2
 #  define ATTR_MALLOC __attribute__((malloc))
 #else
--- a/src/lib/mkdir-parents.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/mkdir-parents.c	Sun Jun 24 00:52:57 2012 +0300
@@ -9,7 +9,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-static int
+static int ATTR_NULL(5)
 mkdir_chown_full(const char *path, mode_t mode, uid_t uid,
 		 gid_t gid, const char *gid_origin)
 {
@@ -79,7 +79,7 @@
 	return mkdir_chown_full(path, mode, (uid_t)-1, gid, gid_origin);
 }
 
-static int
+static int ATTR_NULL(5)
 mkdir_parents_chown_full(const char *path, mode_t mode, uid_t uid, gid_t gid,
 			 const char *gid_origin)
 {
--- a/src/lib/module-dir.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/module-dir.h	Sun Jun 24 00:52:57 2012 +0300
@@ -38,14 +38,16 @@
 };
 
 /* Load modules in given directory. module_names is a space separated list of
-   module names to load, or NULL to load everything. */
+   module names to load. */
 struct module *module_dir_load(const char *dir, const char *module_names,
-			       const struct module_dir_load_settings *set);
+			       const struct module_dir_load_settings *set)
+	ATTR_NULL(2);
 /* Load modules that aren't already loaded. */
 struct module *
 module_dir_load_missing(struct module *old_modules,
 			const char *dir, const char *module_names,
-			const struct module_dir_load_settings *set);
+			const struct module_dir_load_settings *set)
+	ATTR_NULL(1, 3);
 /* Call init() in all modules */
 void module_dir_init(struct module *modules);
 /* Call deinit() in all modules and mark them NULL so module_dir_unload()
--- a/src/lib/network.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/network.c	Sun Jun 24 00:52:57 2012 +0300
@@ -500,7 +500,7 @@
 	return fd;
 }
 
-int net_accept(int fd, struct ip_addr *addr, unsigned int *port)
+int net_accept(int fd, struct ip_addr *addr_r, unsigned int *port_r)
 {
 	union sockaddr_union so;
 	int ret;
@@ -518,12 +518,12 @@
 			return -2;
 	}
 	if (so.sin.sin_family == AF_UNIX) {
-		if (addr != NULL)
-			memset(addr, 0, sizeof(*addr));
-		if (port != NULL) *port = 0;
+		if (addr_r != NULL)
+			memset(addr_r, 0, sizeof(*addr_r));
+		if (port_r != NULL) *port_r = 0;
 	} else {
-		if (addr != NULL) sin_get_ip(&so, addr);
-		if (port != NULL) *port = sin_get_port(&so);
+		if (addr_r != NULL) sin_get_ip(&so, addr_r);
+		if (port_r != NULL) *port_r = sin_get_port(&so);
 	}
 	return ret;
 }
--- a/src/lib/network.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/network.h	Sun Jun 24 00:52:57 2012 +0300
@@ -57,10 +57,10 @@
 /* Connect to socket with ip address. The socket and connect() is
    non-blocking. */
 int net_connect_ip(const struct ip_addr *ip, unsigned int port,
-		   const struct ip_addr *my_ip);
+		   const struct ip_addr *my_ip) ATTR_NULL(3);
 /* Like net_connect_ip(), but do a blocking connect(). */
 int net_connect_ip_blocking(const struct ip_addr *ip, unsigned int port,
-			    const struct ip_addr *my_ip);
+			    const struct ip_addr *my_ip) ATTR_NULL(3);
 /* Returns 0 if we can bind() as given IP, -1 if not. */
 int net_try_bind(const struct ip_addr *ip);
 /* Connect to named UNIX socket */
@@ -91,8 +91,9 @@
    again. */
 int net_listen_unix_unlink_stale(const char *path, int backlog);
 /* Accept a connection on a socket. Returns -1 if the connection got closed,
-   -2 for other failures. For UNIX sockets addr->family=port=0. */
-int net_accept(int fd, struct ip_addr *addr, unsigned int *port);
+   -2 for other failures. For UNIX sockets addr_r->family=port=0. */
+int net_accept(int fd, struct ip_addr *addr_r, unsigned int *port_r)
+	ATTR_NULL(2, 3);
 
 /* Read data from socket, return number of bytes read,
    -1 = error, -2 = disconnected */
@@ -111,9 +112,11 @@
 int net_hosterror_notfound(int error) ATTR_CONST;
 
 /* Get socket local address/port. For UNIX sockets addr->family=port=0. */
-int net_getsockname(int fd, struct ip_addr *addr, unsigned int *port);
+int net_getsockname(int fd, struct ip_addr *addr, unsigned int *port)
+	ATTR_NULL(2, 3);
 /* Get socket remote address/port. For UNIX sockets addr->family=port=0. */
-int net_getpeername(int fd, struct ip_addr *addr, unsigned int *port);
+int net_getpeername(int fd, struct ip_addr *addr, unsigned int *port)
+	ATTR_NULL(2, 3);
 /* Get UNIX socket name. */
 int net_getunixname(int fd, const char **name_r);
 /* Get UNIX socket peer process's credentials. The pid may be (pid_t)-1 if
--- a/src/lib/ostream-private.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/ostream-private.h	Sun Jun 24 00:52:57 2012 +0300
@@ -39,7 +39,8 @@
 };
 
 struct ostream *
-o_stream_create(struct ostream_private *_stream, struct ostream *parent);
+o_stream_create(struct ostream_private *_stream, struct ostream *parent)
+	ATTR_NULL(2);
 
 off_t io_stream_copy(struct ostream *outstream, struct istream *instream,
 		     size_t block_size);
--- a/src/lib/ostream.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/ostream.c	Sun Jun 24 00:52:57 2012 +0300
@@ -55,7 +55,9 @@
 
 void o_stream_unset_flush_callback(struct ostream *stream)
 {
-	o_stream_set_flush_callback(stream, NULL, NULL);
+	struct ostream_private *_stream = stream->real_stream;
+
+	_stream->set_flush_callback(_stream, NULL, NULL);
 }
 
 void o_stream_set_max_buffer_size(struct ostream *stream, size_t max_size)
--- a/src/lib/ostream.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/ostream.h	Sun Jun 24 00:52:57 2012 +0300
@@ -57,7 +57,7 @@
    finishes when the buffer is empty.  */
 void o_stream_set_flush_callback(struct ostream *stream,
 				 stream_flush_callback_t *callback,
-				 void *context);
+				 void *context) ATTR_NULL(3);
 #define o_stream_set_flush_callback(stream, callback, context) \
 	CONTEXT_CALLBACK(o_stream_set_flush_callback, stream_flush_callback_t, \
 			 callback, context, stream)
--- a/src/lib/restrict-access.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/restrict-access.h	Sun Jun 24 00:52:57 2012 +0300
@@ -32,7 +32,7 @@
 /* Restrict access as specified by the settings. If home is not NULL,
    it's chdir()ed after chrooting, otherwise it chdirs to / (the chroot). */
 void restrict_access(const struct restrict_access_settings *set,
-		     const char *home, bool disallow_root);
+		     const char *home, bool disallow_root) ATTR_NULL(2);
 /* Set environment variables so they can be read with
    restrict_access_by_env(). */
 void restrict_access_set_env(const struct restrict_access_settings *set);
@@ -41,7 +41,7 @@
 /* Read restrictions from environment and call restrict_access().
    If disallow_roots is TRUE, we'll kill ourself if we didn't have the
    environment settings. */
-void restrict_access_by_env(const char *home, bool disallow_root);
+void restrict_access_by_env(const char *home, bool disallow_root) ATTR_NULL(1);
 
 /* Return the chrooted directory if restrict_access*() chrooted,
    otherwise NULL. */
--- a/src/lib/safe-mkstemp.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/safe-mkstemp.c	Sun Jun 24 00:52:57 2012 +0300
@@ -12,7 +12,7 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 
-static int
+static int ATTR_NULL(5)
 safe_mkstemp_full(string_t *prefix, mode_t mode, uid_t uid, gid_t gid,
 		  const char *gid_origin)
 {
--- a/src/lib/strfuncs.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/strfuncs.c	Sun Jun 24 00:52:57 2012 +0300
@@ -12,6 +12,8 @@
 
 #define STRCONCAT_BUFSIZE 512
 
+const unsigned char uchar_nul = '\0';
+
 int i_snprintf(char *dest, size_t max_chars, const char *format, ...)
 {
 	va_list args;
--- a/src/lib/strfuncs.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/strfuncs.h	Sun Jun 24 00:52:57 2012 +0300
@@ -3,6 +3,8 @@
 
 #define MAX_INT_STRLEN ((sizeof(uintmax_t) * CHAR_BIT + 2) / 3 + 1)
 
+extern const unsigned char uchar_nul; /* (const unsigned char *)"" */
+
 /* Returns -1 if dest wasn't large enough, 0 if not. */
 int i_snprintf(char *dest, size_t max_chars, const char *format, ...)
 	ATTR_FORMAT(3, 4);
--- a/src/lib/test-iso8601-date.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/test-iso8601-date.c	Sun Jun 24 00:52:57 2012 +0300
@@ -124,6 +124,8 @@
 
 	for (i = 0; i < invalid_date_test_count; i++) T_BEGIN {
 		const char *date_in;
+		struct tm tm;
+		int tz;
 		bool result;
 
 		date_in = invalid_date_tests[i];
@@ -131,7 +133,7 @@
 		test_begin(t_strdup_printf("iso8601 date invalid [%d]", i));
 
 		result = iso8601_date_parse_tm
-			((const unsigned char *)date_in, strlen(date_in), NULL, NULL);
+			((const unsigned char *)date_in, strlen(date_in), &tm, &tz);
 		test_out(t_strdup_printf("parse %s", date_in), !result);
 
 		test_end();
--- a/src/lib/uri-util.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/uri-util.c	Sun Jun 24 00:52:57 2012 +0300
@@ -82,7 +82,7 @@
 	return -1;
 }
 
-static int
+static int ATTR_NULL(3)
 uri_parse_pct_encoded(struct uri_parser *parser, const unsigned char **p,
 		      const unsigned char *pend, unsigned char *ch_r)
 {
--- a/src/lib/uri-util.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/uri-util.h	Sun Jun 24 00:52:57 2012 +0300
@@ -29,7 +29,7 @@
 int uri_parse_unreserved(struct uri_parser *parser, string_t *part);
 
 bool uri_data_decode(struct uri_parser *parser, const char *data,
-		     const char *until, const char **decoded_r);
+		     const char *until, const char **decoded_r) ATTR_NULL(3);
 
 int uri_cut_scheme(const char **uri_p, const char **scheme_r);
 int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r);
--- a/src/lib/var-expand.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lib/var-expand.h	Sun Jun 24 00:52:57 2012 +0300
@@ -22,7 +22,7 @@
 void var_expand_with_funcs(string_t *dest, const char *str,
 			   const struct var_expand_table *table,
 			   const struct var_expand_func_table *func_table,
-			   void *func_context);
+			   void *func_context) ATTR_NULL(3, 4, 5);
 
 /* Returns the actual key character for given string, ie. skip any modifiers
    that are before it. The string should be the data after the '%' character. */
--- a/src/lmtp/client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lmtp/client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -72,7 +72,7 @@
 struct client *client_create(int fd_in, int fd_out,
 			     const struct master_service_connection *conn);
 void client_destroy(struct client *client, const char *prefix,
-		    const char *reason);
+		    const char *reason) ATTR_NULL(2, 3);
 void client_disconnect(struct client *client, const char *prefix,
 		       const char *reason);
 void client_io_reset(struct client *client);
--- a/src/lmtp/lmtp-proxy.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/lmtp/lmtp-proxy.h	Sun Jun 24 00:52:57 2012 +0300
@@ -39,6 +39,7 @@
 /* Start proxying */
 void lmtp_proxy_start(struct lmtp_proxy *proxy, struct istream *data_input,
 		      const char *header,
-		      lmtp_proxy_finish_callback_t *callback, void *context);
+		      lmtp_proxy_finish_callback_t *callback, void *context)
+	ATTR_NULL(3);
 
 #endif
--- a/src/log/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/log/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -57,7 +57,7 @@
 {
 	const char *error;
 
-	master_service = master_service_init("log", 0, &argc, &argv, NULL);
+	master_service = master_service_init("log", 0, &argc, &argv, "");
 
 	/* use log prefix and log to stderr until we've configured the real
 	   logging */
--- a/src/login-common/client-common-auth.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/login-common/client-common-auth.c	Sun Jun 24 00:52:57 2012 +0300
@@ -324,7 +324,7 @@
 	return 0;
 }
 
-static void
+static void ATTR_NULL(3, 4)
 client_auth_result(struct client *client, enum client_auth_result result,
 		   const struct client_auth_reply *reply, const char *text)
 {
--- a/src/login-common/login-proxy.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/login-common/login-proxy.c	Sun Jun 24 00:52:57 2012 +0300
@@ -59,7 +59,8 @@
 static void login_proxy_ipc_cmd(struct ipc_cmd *cmd, const char *line);
 
 static void
-login_proxy_free_reason(struct login_proxy **_proxy, const char *reason);
+login_proxy_free_reason(struct login_proxy **_proxy, const char *reason)
+	ATTR_NULL(2);
 
 static void login_proxy_free_errno(struct login_proxy **proxy,
 				   int err, const char *who)
@@ -316,7 +317,7 @@
 	return 0;
 }
 
-static void
+static void ATTR_NULL(2)
 login_proxy_free_reason(struct login_proxy **_proxy, const char *reason)
 {
 	struct login_proxy *proxy = *_proxy;
--- a/src/login-common/login-settings.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/login-common/login-settings.h	Sun Jun 24 00:52:57 2012 +0300
@@ -45,7 +45,7 @@
 		    const struct ip_addr *local_ip,
 		    const struct ip_addr *remote_ip,
 		    const char *local_name,
-		    void ***other_settings_r);
+		    void ***other_settings_r) ATTR_NULL(2, 3, 4);
 void login_settings_deinit(void);
 
 #endif
--- a/src/login-common/sasl-server.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/login-common/sasl-server.c	Sun Jun 24 00:52:57 2012 +0300
@@ -77,7 +77,7 @@
 	return auth_flags;
 }
 
-static void
+static void ATTR_NULL(3, 4)
 call_client_callback(struct client *client, enum sasl_server_reply reply,
 		     const char *data, const char *const *args)
 {
@@ -154,7 +154,8 @@
 			    master_auth_callback, client, &client->master_tag);
 }
 
-static void anvil_lookup_callback(const char *reply, void *context)
+static void ATTR_NULL(1)
+anvil_lookup_callback(const char *reply, void *context)
 {
 	struct anvil_request *req = context;
 	struct client *client = req->client;
@@ -333,8 +334,9 @@
 					authenticate_callback, client);
 }
 
-static void sasl_server_auth_cancel(struct client *client, const char *reason,
-				    enum sasl_server_reply reply)
+static void ATTR_NULL(2)
+sasl_server_auth_cancel(struct client *client, const char *reason,
+			enum sasl_server_reply reply)
 {
 	i_assert(client->authenticating);
 
--- a/src/login-common/ssl-proxy-openssl.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/login-common/ssl-proxy-openssl.c	Sun Jun 24 00:52:57 2012 +0300
@@ -1026,7 +1026,7 @@
 	}
 }
 
-static EVP_PKEY *
+static EVP_PKEY * ATTR_NULL(2)
 ssl_proxy_load_key(const char *key, const char *password)
 {
 	EVP_PKEY *pkey;
--- a/src/master/common.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/master/common.h	Sun Jun 24 00:52:57 2012 +0300
@@ -12,7 +12,8 @@
 extern int null_fd, global_master_dead_pipe_fd[2];
 extern struct service_list *services;
 
-void process_exec(const char *cmd, const char *extra_args[]) ATTR_NORETURN;
+void process_exec(const char *cmd, const char *extra_args[])
+	ATTR_NORETURN ATTR_NULL(2);
 
 int get_uidgid(const char *user, uid_t *uid_r, gid_t *gid_r,
 	       const char **error_r);
--- a/src/plugins/acl/acl-backend-vfile-acllist.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/acl/acl-backend-vfile-acllist.c	Sun Jun 24 00:52:57 2012 +0300
@@ -43,20 +43,20 @@
 	struct mail_storage *storage;
 	const char *rootdir, *maildir;
 
-	rootdir = mailbox_list_get_path(backend->backend.list, NULL,
-					MAILBOX_LIST_PATH_TYPE_DIR);
+	rootdir = mailbox_list_get_root_path(backend->backend.list,
+					     MAILBOX_LIST_PATH_TYPE_DIR);
 
 	storage = mailbox_list_get_namespace(backend->backend.list)->storage;
 	if (mail_storage_is_mailbox_file(storage)) {
-		maildir = mailbox_list_get_path(backend->backend.list, NULL,
-						MAILBOX_LIST_PATH_TYPE_MAILBOX);
+		maildir = mailbox_list_get_root_path(backend->backend.list,
+						     MAILBOX_LIST_PATH_TYPE_MAILBOX);
 		if (strcmp(maildir, rootdir) == 0) {
 			/* dovecot-acl-list would show up as a mailbox if we
 			   created it to root dir. since we don't really have
 			   any other good alternatives, place it to control
 			   dir */
-			rootdir = mailbox_list_get_path(backend->backend.list,
-					NULL, MAILBOX_LIST_PATH_TYPE_CONTROL);
+			rootdir = mailbox_list_get_root_path(backend->backend.list,
+					MAILBOX_LIST_PATH_TYPE_CONTROL);
 		}
 	}
 	return rootdir;
--- a/src/plugins/acl/acl-plugin.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/acl/acl-plugin.h	Sun Jun 24 00:52:57 2012 +0300
@@ -50,7 +50,7 @@
 struct acl_backend *acl_mailbox_list_get_backend(struct mailbox_list *list);
 int acl_mailbox_list_have_right(struct mailbox_list *list, const char *name,
 				bool parent, unsigned int acl_storage_right_idx,
-				bool *can_see_r);
+				bool *can_see_r) ATTR_NULL(5);
 
 void acl_plugin_init(struct module *module);
 void acl_plugin_deinit(void);
--- a/src/plugins/fts-lucene/fts-backend-lucene.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/fts-lucene/fts-backend-lucene.c	Sun Jun 24 00:52:57 2012 +0300
@@ -144,8 +144,8 @@
 		return -1;
 	}
 
-	path = mailbox_list_get_path(_backend->ns->list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_INDEX);
+	path = mailbox_list_get_root_path(_backend->ns->list,
+					  MAILBOX_LIST_PATH_TYPE_INDEX);
 	i_assert(path != NULL); /* fts already checked this */
 
 	backend->dir_path = i_strconcat(path, "/"LUCENE_INDEX_DIR_NAME, NULL);
--- a/src/plugins/fts-lucene/lucene-wrapper.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/fts-lucene/lucene-wrapper.h	Sun Jun 24 00:52:57 2012 +0300
@@ -16,9 +16,10 @@
 	uint32_t uid;
 };
 
-struct lucene_index *lucene_index_init(const char *path,
-				       struct mailbox_list *list,
-				       const struct fts_lucene_settings *set);
+struct lucene_index *
+lucene_index_init(const char *path, struct mailbox_list *list,
+		  const struct fts_lucene_settings *set)
+	ATTR_NULL(2, 3);
 void lucene_index_deinit(struct lucene_index *index);
 
 void lucene_index_select_mailbox(struct lucene_index *index,
--- a/src/plugins/fts-solr/solr-connection.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/fts-solr/solr-connection.c	Sun Jun 24 00:52:57 2012 +0300
@@ -446,7 +446,7 @@
 		i_error("fts_solr: Lookup failed: %s", conn->http_failure);
 		return -1;
 	}
-	parse_ret = solr_xml_parse(conn, NULL, 0, TRUE);
+	parse_ret = solr_xml_parse(conn, "", 0, TRUE);
 	hash_table_destroy(&solr_lookup_context.mailboxes);
 
 	(void)array_append_space(&solr_lookup_context.results);
@@ -575,7 +575,7 @@
 
 	i_assert(conn->posting);
 
-	solr_connection_post_more(post, NULL, 0);
+	solr_connection_post_more(post, &uchar_nul, 0);
 
 	curl_easy_getinfo(conn->curl, CURLINFO_RESPONSE_CODE, &httpret);
 	if (httpret != 200 && ret == 0) {
--- a/src/plugins/fts-squat/squat-trie.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/fts-squat/squat-trie.h	Sun Jun 24 00:52:57 2012 +0300
@@ -37,7 +37,8 @@
 /* if expunged_uids is non-NULL, they may be removed from the index if they
    still exist. */
 int squat_trie_build_deinit(struct squat_trie_build_context **ctx,
-			    const ARRAY_TYPE(seq_range) *expunged_uids);
+			    const ARRAY_TYPE(seq_range) *expunged_uids)
+	ATTR_NULL(2);
 
 int squat_trie_get_last_uid(struct squat_trie *trie, uint32_t *last_uid_r);
 /* type specifies if we're looking at header, body or both */
--- a/src/plugins/fts/fts-storage.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/fts/fts-storage.c	Sun Jun 24 00:52:57 2012 +0300
@@ -643,8 +643,7 @@
 		return;
 	}
 
-	path = mailbox_list_get_path(list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_INDEX);
+	path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX);
 	if (*path == '\0') {
 		if (list->mail_set->mail_debug) {
 			i_debug("fts: Indexes disabled for namespace '%s'",
--- a/src/plugins/quota/quota-dirsize.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/quota/quota-dirsize.c	Sun Jun 24 00:52:57 2012 +0300
@@ -162,8 +162,8 @@
 			continue;
 
 		is_file = mail_storage_is_mailbox_file(namespaces[i]->storage);
-		path = mailbox_list_get_path(namespaces[i]->list, NULL,
-					     MAILBOX_LIST_PATH_TYPE_DIR);
+		path = mailbox_list_get_root_path(namespaces[i]->list,
+						  MAILBOX_LIST_PATH_TYPE_DIR);
 		quota_count_path_add(&paths, path, FALSE);
 
 		/* INBOX may be in different path. */
--- a/src/plugins/quota/quota-fs.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/quota/quota-fs.c	Sun Jun 24 00:52:57 2012 +0300
@@ -276,8 +276,7 @@
 	struct fs_quota_root *root;
 	const char *dir;
 
-	dir = mailbox_list_get_path(ns->list, NULL,
-				    MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	dir = mailbox_list_get_root_path(ns->list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	mount = dir == NULL ? NULL :
 		fs_quota_mountpoint_get(dir);
 	if (mount != NULL) {
--- a/src/plugins/quota/quota-maildir.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/quota/quota-maildir.c	Sun Jun 24 00:52:57 2012 +0300
@@ -795,8 +795,7 @@
 	if (root->maildirsize_path != NULL)
 		return;
 
-	control_dir = mailbox_list_get_path(ns->list, NULL,
-					    MAILBOX_LIST_PATH_TYPE_CONTROL);
+	control_dir = mailbox_list_get_root_path(ns->list, MAILBOX_LIST_PATH_TYPE_CONTROL);
 	root->maildirsize_ns = ns;
 	root->maildirsize_path =
 		p_strconcat(_root->pool, control_dir,
--- a/src/plugins/quota/quota.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/plugins/quota/quota.c	Sun Jun 24 00:52:57 2012 +0300
@@ -632,12 +632,11 @@
 
 	/* first check if there already exists a namespace with the exact same
 	   path. we don't want to count them twice. */
-	path = mailbox_list_get_path(ns->list, NULL,
-				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	path = mailbox_list_get_root_path(ns->list, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	if (path != NULL) {
 		namespaces = array_get(&quota->namespaces, &count);
 		for (i = 0; i < count; i++) {
-			path2 = mailbox_list_get_path(namespaces[i]->list, NULL,
+			path2 = mailbox_list_get_root_path(namespaces[i]->list,
 				     	MAILBOX_LIST_PATH_TYPE_MAILBOX);
 			if (strcmp(path, path2) == 0) {
 				/* duplicate */
--- a/src/pop3/pop3-client.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/pop3/pop3-client.h	Sun Jun 24 00:52:57 2012 +0300
@@ -104,7 +104,7 @@
 			     struct mail_user *user,
 			     struct mail_storage_service_user *service_user,
 			     const struct pop3_settings *set);
-void client_destroy(struct client *client, const char *reason);
+void client_destroy(struct client *client, const char *reason) ATTR_NULL(2);
 
 /* Disconnect client connection */
 void client_disconnect(struct client *client, const char *reason);
--- a/src/replication/aggregator/aggregator.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/replication/aggregator/aggregator.c	Sun Jun 24 00:52:57 2012 +0300
@@ -50,8 +50,7 @@
 	};
 	const char *error;
 
-	master_service = master_service_init("aggregator", 0,
-					     &argc, &argv, NULL);
+	master_service = master_service_init("aggregator", 0, &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 
--- a/src/replication/replicator/replicator.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/replication/replicator/replicator.c	Sun Jun 24 00:52:57 2012 +0300
@@ -42,7 +42,7 @@
 
 	/* add all users into replication queue, so that we can start doing
 	   full syncs for everyone whose state can't be found */
-	ctx = auth_master_user_list_init(auth_conn, NULL, &user_info);
+	ctx = auth_master_user_list_init(auth_conn, "", &user_info);
 	while ((username = auth_master_user_list_next(ctx)) != NULL) {
 		user = replicator_queue_add(queue, username,
 					    REPLICATION_PRIORITY_NONE);
@@ -56,7 +56,8 @@
 	(void)replicator_queue_import(queue, REPLICATOR_DB_PATH);
 }
 
-static void replicator_dump_timeout(void *context ATTR_UNUSED)
+static void ATTR_NULL(1)
+replicator_dump_timeout(void *context ATTR_UNUSED)
 {
 	(void)replicator_queue_export(queue, REPLICATOR_DB_PATH);
 }
@@ -95,7 +96,7 @@
 	const char *error;
 
 	master_service = master_service_init("replicator", service_flags,
-					     &argc, &argv, NULL);
+					     &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 
--- a/src/ssl-params/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/ssl-params/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -132,8 +132,7 @@
 {
 	const struct ssl_params_settings *set;
 
-	master_service = master_service_init("ssl-params", 0,
-					     &argc, &argv, NULL);
+	master_service = master_service_init("ssl-params", 0, &argc, &argv, "");
 	master_service_init_log(master_service, "ssl-params: ");
 
 	if (master_getopt(master_service) > 0)
--- a/src/stats/mail-domain.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/stats/mail-domain.h	Sun Jun 24 00:52:57 2012 +0300
@@ -8,7 +8,7 @@
 struct mail_domain *mail_domain_login(const char *name);
 struct mail_domain *mail_domain_lookup(const char *name);
 void mail_domain_refresh(struct mail_domain *domain,
-			 const struct mail_stats *diff_stats);
+			 const struct mail_stats *diff_stats) ATTR_NULL(2);
 
 void mail_domain_ref(struct mail_domain *domain);
 void mail_domain_unref(struct mail_domain **domain);
--- a/src/stats/mail-ip.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/stats/mail-ip.h	Sun Jun 24 00:52:57 2012 +0300
@@ -5,7 +5,8 @@
 
 struct mail_ip *mail_ip_login(const struct ip_addr *ip_addr);
 struct mail_ip *mail_ip_lookup(const struct ip_addr *ip_addr);
-void mail_ip_refresh(struct mail_ip *ip, const struct mail_stats *diff_stats);
+void mail_ip_refresh(struct mail_ip *ip, const struct mail_stats *diff_stats)
+	ATTR_NULL(2);
 
 void mail_ip_ref(struct mail_ip *ip);
 void mail_ip_unref(struct mail_ip **ip);
--- a/src/stats/mail-session.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/stats/mail-session.h	Sun Jun 24 00:52:57 2012 +0300
@@ -19,7 +19,7 @@
 int mail_session_get(const char *guid, struct mail_session **session_r,
 		     const char **error_r);
 void mail_session_refresh(struct mail_session *session,
-			  const struct mail_stats *diff_stats);
+			  const struct mail_stats *diff_stats) ATTR_NULL(2);
 
 void mail_sessions_free_memory(void);
 void mail_sessions_init(void);
--- a/src/stats/mail-user.h	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/stats/mail-user.h	Sun Jun 24 00:52:57 2012 +0300
@@ -9,7 +9,7 @@
 struct mail_user *mail_user_lookup(const char *username);
 
 void mail_user_refresh(struct mail_user *user,
-		       const struct mail_stats *diff_stats);
+		       const struct mail_stats *diff_stats) ATTR_NULL(2);
 
 void mail_user_ref(struct mail_user *user);
 void mail_user_unref(struct mail_user **user);
--- a/src/stats/main.c	Fri Jun 22 21:59:01 2012 +0300
+++ b/src/stats/main.c	Sun Jun 24 00:52:57 2012 +0300
@@ -44,7 +44,7 @@
 	void **sets;
 
 	master_service = master_service_init("stats", service_flags,
-					     &argc, &argv, NULL);
+					     &argc, &argv, "");
 	if (master_getopt(master_service) > 0)
 		return FATAL_DEFAULT;
 	if (master_service_settings_read_simple(master_service, set_roots,