changeset 9073:dc3739ee4123 HEAD

Sort environ[] before feeding it to settings parser. This fixes running with valgrind.
author Timo Sirainen <tss@iki.fi>
date Sat, 11 Apr 2009 21:41:42 -0400
parents fb11dca591da
children c77a3902dc5e
files src/lib-settings/settings-parser.c
diffstat 1 files changed, 17 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-settings/settings-parser.c	Sat Apr 11 15:30:22 2009 -0400
+++ b/src/lib-settings/settings-parser.c	Sat Apr 11 21:41:42 2009 -0400
@@ -11,6 +11,7 @@
 #include "settings-parser.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/stat.h>
@@ -567,14 +568,25 @@
 int settings_parse_environ(struct setting_parser_context *ctx)
 {
 	extern char **environ;
+	ARRAY_TYPE(string) sorted_envs_arr;
 	const char *key, *value;
-	unsigned int i;
+	char **sorted_envs;
+	unsigned int i, count;
 	int ret = 0;
 
-	for (i = 0; environ[i] != NULL && ret == 0; i++) {
-		value = strchr(environ[i], '=');
+	/* sort the settings first. this is necessary for putenv()
+	   implementations (e.g. valgrind) which change the order of strings
+	   in environ[] */
+	i_array_init(&sorted_envs_arr, 128);
+	for (i = 0; environ[i] != NULL; i++)
+		array_append(&sorted_envs_arr, &environ[i], 1);
+	sorted_envs = array_get_modifiable(&sorted_envs_arr, &count);
+	qsort(sorted_envs, count, sizeof(*sorted_envs), i_strcmp_p);
+
+	for (i = 0; i < count && ret == 0; i++) {
+		value = strchr(sorted_envs[i], '=');
 		if (value != NULL) T_BEGIN {
-			key = t_strdup_until(environ[i], value++);
+			key = t_strdup_until(sorted_envs[i], value++);
 			key = t_str_lcase(key);
 			if (settings_parse_keyvalue(ctx, key, value) < 0) {
 				ctx->error = p_strdup_printf(ctx->parser_pool,
@@ -584,6 +596,7 @@
 			}
 		} T_END;
 	}
+	array_free(&sorted_envs_arr);
 	return ret;
 }