If is_master is set then the configuration is being
read as part a reinitialisation. And as such it seems
reasonable to ignore errors when resolving users and groups -
if they are unchanged from the original configuration then
they will already be set, and otherwise they may not be settable
as the process may already be non-privileged.
Resolution failure may commonly occur if chroot is in effect
and for example /etc/passwd and /etc/group are not present in
the chroot.
---
src/cfgparse.c | 39 +++++++++++++++++++++++----------------
1 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/src/cfgparse.c b/src/cfgparse.c
index aae2efe..e7ce4c3 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -466,6 +466,17 @@ static int warnif_cond_requires_req(const struct acl_cond
*cond, const char *fil
return ERR_WARN;
}
+static int Warning_if_master(const char *fmt, ...)
+{
+ va_list argp;
+ void (*f)(const char *, va_list) = is_master ? vWarning : vAlert;
+
+ va_start(argp, fmt);
+ f(fmt, argp);
+ va_end(argp);
+
+ return is_master ? 0 : (ERR_ALERT | ERR_FATAL);
+}
/*
* parse a line in a <global> section. Returns the error code, 0 if OK, or
@@ -655,8 +666,7 @@ int cfg_parse_global(const char *file, int linenum, char
**args, int kwm)
global.uid = (int)ha_user->pw_uid;
}
else {
- Alert("parsing [%s:%d] : cannot find user id for '%s'
(%d:%s)\n", file, linenum, args[1], errno, strerror(errno));
- err_code |= ERR_ALERT | ERR_FATAL;
+ err_code |= Warning_if_master("parsing [%s:%d] : cannot
find user id for '%s' (%d:%s)\n", file, linenum, args[1], errno,
strerror(errno));
}
}
else if (!strcmp(args[0], "group")) {
@@ -672,8 +682,7 @@ int cfg_parse_global(const char *file, int linenum, char
**args, int kwm)
global.gid = (int)ha_group->gr_gid;
}
else {
- Alert("parsing [%s:%d] : cannot find group id for '%s'
(%d:%s)\n", file, linenum, args[1], errno, strerror(errno));
- err_code |= ERR_ALERT | ERR_FATAL;
+ err_code |= Warning_if_master("parsing [%s:%d] : cannot
find group id for '%s' (%d:%s)\n", file, linenum, args[1], errno,
strerror(errno));
}
}
/* end of user/group name handling*/
@@ -1871,13 +1880,12 @@ int cfg_parse_listen(const char *file, int linenum,
char **args, int kwm)
}
user = getpwnam(args[cur_arg + 1]);
if (!user) {
- Alert("parsing [%s:%d] : '%s' : '%s'
unknown user.\n",
+ err_code |= Warning_if_master("parsing
[%s:%d] : '%s' : '%s' unknown user.\n",
file, linenum, args[0],
args[cur_arg + 1 ]);
- err_code |= ERR_ALERT | ERR_FATAL;
- goto out;
- }
-
- curproxy->listen->perm.ux.uid = user->pw_uid;
+ if (!is_master)
+ goto out;
+ } else
+ curproxy->listen->perm.ux.uid =
user->pw_uid;
cur_arg += 2;
continue;
}
@@ -1893,13 +1901,12 @@ int cfg_parse_listen(const char *file, int linenum,
char **args, int kwm)
}
group = getgrnam(args[cur_arg + 1]);
if (!group) {
- Alert("parsing [%s:%d] : '%s' : '%s'
unknown group.\n",
+ err_code |= Warning_if_master("parsing
[%s:%d] : '%s' : '%s' unknown group.\n",
file, linenum, args[0],
args[cur_arg + 1 ]);
- err_code |= ERR_ALERT | ERR_FATAL;
- goto out;
- }
-
- curproxy->listen->perm.ux.gid = group->gr_gid;
+ if (!is_master)
+ goto out;
+ } else
+ curproxy->listen->perm.ux.gid =
group->gr_gid;
cur_arg += 2;
continue;
}
--
1.7.2.3