dovecot-1.2: Settings parser: !included files without absolute p...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Apr 21 20:34:00 EEST 2009
details: http://hg.dovecot.org/dovecot-1.2/rev/c2595e358867
changeset: 8975:c2595e358867
user: Timo Sirainen <tss at iki.fi>
date: Tue Apr 21 13:33:53 2009 -0400
description:
Settings parser: !included files without absolute paths are relative to their parent config file.
diffstat:
1 file changed, 24 insertions(+), 4 deletions(-)
src/lib-settings/settings.c | 28 ++++++++++++++++++++++++----
diffs (52 lines):
diff -r 1f4f68091243 -r c2595e358867 src/lib-settings/settings.c
--- a/src/lib-settings/settings.c Mon Apr 20 14:54:49 2009 -0400
+++ b/src/lib-settings/settings.c Tue Apr 21 13:33:53 2009 -0400
@@ -70,6 +70,24 @@ parse_setting_from_defs(pool_t pool, str
return t_strconcat("Unknown setting: ", key, NULL);
}
+static const char *
+fix_relative_path(const char *path, struct input_stack *input)
+{
+ const char *p;
+
+ if (*path == '/')
+ return path;
+
+ while (input->prev != NULL)
+ input = input->prev;
+
+ p = strrchr(input->path, '/');
+ if (p == NULL)
+ return path;
+
+ return t_strconcat(t_strdup_until(input->path, p+1), path, NULL);
+}
+
#define IS_WHITE(c) ((c) == ' ' || (c) == '\t')
static bool
@@ -169,17 +187,19 @@ prevfile:
if (strcmp(key, "!include_try") == 0 ||
strcmp(key, "!include") == 0) {
struct input_stack *tmp;
-
+ const char *path;
+
+ path = fix_relative_path(line, input);
for (tmp = input; tmp != NULL; tmp = tmp->prev) {
- if (strcmp(tmp->path, line) == 0)
+ if (strcmp(tmp->path, path) == 0)
break;
}
if (tmp != NULL) {
errormsg = "Recursive include";
- } else if ((fd = open(line, O_RDONLY)) != -1) {
+ } else if ((fd = open(path, O_RDONLY)) != -1) {
new_input = t_new(struct input_stack, 1);
new_input->prev = input;
- new_input->path = t_strdup(line);
+ new_input->path = t_strdup(path);
input = new_input;
goto newfile;
} else {
More information about the dovecot-cvs
mailing list