[Dovecot] RC7: BUG! and patch [Was: Re: rc7 bug? [Was: deliver LDA and INBOX location] (fwd)]

David Lee t.d.lee at durham.ac.uk
Tue Sep 5 18:40:00 EEST 2006


On Tue, 5 Sep 2006, David Lee wrote:

> Anyone had any thoughts on the item below? [see earlier in thread]
>
> If the problem is with my config, I'd like to be guided towards how I
> might resolve it.
>
> If it is a bug in rc7, it would be good to fix it, and I'd be happy to
> beta-test.

BUG in rc7 (and probably from much earlier).

The LDA 'deliver' fails to honour any uid (%i) setting in dovecot.conf.
So delivery and reading happen in different places if 'default_mail_env'
uses a '%i' variant.  Clearly incorrect behaviour.

Attached is a draft of a patch which fixes the problem.  Please could the
patch be reviewed and, in some form, applied?

Thanks.

-- 

:  David Lee                                I.T. Service          :
:  Senior Systems Programmer                Computer Centre       :
:                                           Durham University     :
:  http://www.dur.ac.uk/t.d.lee/            South Road            :
:                                           Durham DH1 3LE        :
:  Phone: +44 191 334 2752                  U.K.                  :
-------------- next part --------------
--- src/deliver/deliver.c.orig	2006-08-10 22:47:56.000000000 +0100
+++ src/deliver/deliver.c	2006-09-05 16:29:32.850394000 +0100
@@ -231,7 +231,7 @@
 }
 
 static const struct var_expand_table *
-get_var_expand_table(const char *user, const char *home)
+get_var_expand_table(const char *user, const char *home, uid_t uid)
 {
 	static struct var_expand_table static_tab[] = {
 		{ 'u', NULL },
@@ -242,6 +242,7 @@
 		{ 'l', NULL },
 		{ 'r', NULL },
 		{ 'p', NULL },
+		{ 'i', NULL },
 		{ '\0', NULL }
 	};
 	struct var_expand_table *tab;
@@ -258,6 +259,7 @@
 	tab[5].value = NULL;
 	tab[6].value = NULL;
 	tab[7].value = my_pid;
+	tab[8].value = dec2str(uid);
 
 	return tab;
 }
@@ -356,7 +358,8 @@
 	struct istream *input;
 	struct mailbox_transaction_context *t;
 	struct mail *mail;
-	uid_t process_euid;
+	struct passwd *upw;
+	uid_t process_euid, uid;
 	int i, ret;
 
 	lib_init();
@@ -432,6 +435,13 @@
 			"destination user parameter (-d user) not given");
 	}
 
+	/* get user's details (in particular, the real uid) */
+	upw = getpwnam(user);
+	if (upw == NULL) {
+		i_fatal("Couldn't lookup user's details (user=%s)", user);
+	}
+	uid = upw->pw_uid;
+
 	config_file_init(config_path);
 	open_logfile(user);
 
@@ -483,7 +493,7 @@
 	if (mail_env == NULL) 
 		mail_env = getenv("DEFAULT_MAIL_ENV");
 	if (mail_env != NULL) {
-		table = get_var_expand_table(destination, getenv("HOME"));
+		table = get_var_expand_table(destination, getenv("HOME"), uid);
 		mail_env = expand_mail_env(mail_env, table);
 	}
 


More information about the dovecot mailing list