changeset 21958:61665dc536ad

auth: Check var_expand error in vpopmail
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Tue, 11 Apr 2017 20:39:55 +0300
parents 23ea7cc3b559
children a060d8f6eb32
files src/auth/userdb-vpopmail.c
diffstat 1 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/userdb-vpopmail.c	Tue Apr 11 15:50:14 2017 +0300
+++ b/src/auth/userdb-vpopmail.c	Tue Apr 11 20:39:55 2017 +0300
@@ -51,23 +51,29 @@
 #endif
 
 #ifdef USERDB_VPOPMAIL
-static const char *
-userdb_vpopmail_get_quota(const char *template, const char *vpop_str)
+static int
+userdb_vpopmail_get_quota(const char *template, const char *vpop_str,
+			  const char **quota_r, const char **error_r)
 {
 	struct var_expand_table *tab;
 	string_t *quota;
 
 	if (template == NULL || *vpop_str == '\0' ||
-	    strcmp(vpop_str, "NOQUOTA") == 0)
-		return "";
+	    strcmp(vpop_str, "NOQUOTA") == 0) {
+		*quota_r = "";
+		return 0;
+	}
 
 	tab = t_new(struct var_expand_table, 2);
 	tab[0].key = 'q';
 	tab[0].value = format_maildirquota(vpop_str);
 
 	quota = t_str_new(128);
-	var_expand(quota, template, tab);
-	return str_c(quota);
+	if (var_expand(quota, template, tab, error_r) < 0)
+		return -1;
+
+	*quota_r = str_c(quota);
+	return 0;
 }
 
 static void vpopmail_lookup(struct auth_request *auth_request,
@@ -78,7 +84,7 @@
 		(struct vpopmail_userdb_module *)_module;
 	char vpop_user[VPOPMAIL_LIMIT], vpop_domain[VPOPMAIL_LIMIT];
 	struct vqpasswd *vpw;
-	const char *quota;
+	const char *quota, *error;
 	uid_t uid;
 	gid_t gid;
 
@@ -124,12 +130,20 @@
 		}
 	}
 
+	if (userdb_vpopmail_get_quota(module->quota_template_value,
+				      vpw->pw_shell, &quota, &error) < 0) {
+		auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
+				       "userdb_vpopmail_get_quota(%s, %s) failed: %s",
+				       module->quota_template_value,
+				       vpw->pw_shell, error);
+		callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
+		return;
+	}
+
 	auth_request_set_userdb_field(auth_request, "uid", dec2str(uid));
 	auth_request_set_userdb_field(auth_request, "gid", dec2str(gid));
 	auth_request_set_userdb_field(auth_request, "home", vpw->pw_dir);
 
-	quota = userdb_vpopmail_get_quota(module->quota_template_value,
-					  vpw->pw_shell);
 	if (*quota != '\0') {
 		auth_request_set_userdb_field(auth_request,
 					      module->quota_template_key,