changeset 20253:3d700b8ae925

lib-dict-extra: Avoid out of scope data stack usage.
author Teemu Huovila <teemu.huovila@dovecot.fi>
date Fri, 29 Apr 2016 21:36:31 +0300
parents 2cacbc8e95c5
children 5e50b5711dd9
files src/lib-dict-extra/dict-ldap.c
diffstat 1 files changed, 8 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict-extra/dict-ldap.c	Wed Apr 20 17:34:53 2016 +0300
+++ b/src/lib-dict-extra/dict-ldap.c	Fri Apr 29 21:36:31 2016 +0300
@@ -162,13 +162,14 @@
 	return ldap_client_init(&set, &dict->client, error_r);
 }
 
-static
-const char* ldap_dict_build_query(struct ldap_dict *dict, const struct dict_ldap_map *map, ARRAY_TYPE(const_string) *values, bool priv)
+static void
+ldap_dict_build_query(struct ldap_dict *dict, const struct dict_ldap_map *map,
+                      ARRAY_TYPE(const_string) *values, bool priv,
+                      string_t *query_r)
 {
 	const char *template;
 	ARRAY(struct var_expand_table) exp;
 	struct var_expand_table entry;
-	string_t *query = t_str_new(64);
 
 	t_array_init(&exp, 8);
 	entry.key = '\0';
@@ -191,9 +192,7 @@
 
 	array_append_zero(&exp);
 
-	var_expand(query, template, array_idx(&exp, 0));
-
-	return str_c(query);
+	var_expand(query_r, template, array_idx(&exp, 0));
 }
 
 static
@@ -377,6 +376,7 @@
 	struct ldap_dict *ctx = (struct ldap_dict*)dict;
 	struct dict_ldap_op *op;
 	pool_t oppool = pool_alloconly_create("ldap dict lookup", 64);
+	string_t *query = str_new(oppool, 64);
 	op = p_new(oppool, struct dict_ldap_op, 1);
 	op->pool = oppool;
 	op->dict = ctx;
@@ -398,7 +398,8 @@
 			memset(&input, 0, sizeof(input));
 			input.base_dn = map->base_dn;
 			input.scope = map->scope_val;
-			input.filter = ldap_dict_build_query(ctx, map, &values, strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE))==0);
+			ldap_dict_build_query(ctx, map, &values, strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE))==0, query);
+			input.filter = str_c(query);
 			input.attributes = attributes;
 			input.timeout_secs = ctx->set->timeout;
 			ctx->pending++;