/* POSIX says the overall size of the environment block cannot
* be > ARG_MAX, hence the individual variable assignments
- * cannot be either, but let's room for one trailing NUL
+ * cannot be either, but let's leave room for one trailing NUL
* byte. */
if (strlen(e) > ARG_MAX - 1)
return false;
/* Check if there are duplicate assginments */
k = strcspn(*p, "=");
STRV_FOREACH(q, p + 1)
- if (strncmp(*p, *q, k) == 0 && (*q)[k] == '=')
+ if (strneq(*p, *q, k) && (*q)[k] == '=')
+ return false;
+ }
+
+ return true;
+}
+
+bool strv_env_name_or_assignment_is_valid(char **l) {
+ char **p, **q;
+
+ STRV_FOREACH(p, l) {
+ if (!env_assignment_is_valid(*p) && !env_name_is_valid(*p))
+ return false;
+
+ STRV_FOREACH(q, p + 1)
+ if (streq(*p, *q))
return false;
}
n++;
for (j = r; j < *k; j++)
- if (strncmp(*j, *a, n) == 0)
+ if (strneq(*j, *a, n))
break;
if (j >= *k)
return NULL;
}
-static bool env_match(const char *t, const char *pattern) {
+_pure_ static bool env_match(const char *t, const char *pattern) {
assert(t);
assert(pattern);
if (!strchr(pattern, '=')) {
size_t l = strlen(pattern);
- return strncmp(t, pattern, l) == 0 && t[l] == '=';
+ return strneq(t, pattern, l) && t[l] == '=';
}
return false;
return NULL;
STRV_FOREACH(i, l)
- if (strncmp(*i, name, k) == 0 &&
+ if (strneq(*i, name, k) &&
(*i)[k] == '=')
return *i + k + 1;
return strv_env_get_n(l, name, strlen(name));
}
-char **strv_env_clean(char **e) {
+char **strv_env_clean_log(char **e, const char *message) {
char **p, **q;
int k = 0;
bool duplicate = false;
if (!env_assignment_is_valid(*p)) {
+ if (message)
+ log_error("Ignoring invalid environment '%s': %s", *p, message);
free(*p);
continue;
}
n = strcspn(*p, "=");
STRV_FOREACH(q, p + 1)
- if (strncmp(*p, *q, n) == 0 && (*q)[n] == '=') {
+ if (strneq(*p, *q, n) && (*q)[n] == '=') {
duplicate = true;
break;
}
e[k] = NULL;
return e;
}
+
+char **strv_env_clean(char **e) {
+ return strv_env_clean_log(e, NULL);
+}