diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/env-util.c | 4 | ||||
-rw-r--r-- | src/shared/fileio.c | 2 | ||||
-rw-r--r-- | src/shared/util.c | 19 | ||||
-rw-r--r-- | src/shared/util.h | 5 |
4 files changed, 17 insertions, 13 deletions
diff --git a/src/shared/env-util.c b/src/shared/env-util.c index b2e45531ab..20b208f63c 100644 --- a/src/shared/env-util.c +++ b/src/shared/env-util.c @@ -78,7 +78,9 @@ bool env_value_is_valid(const char *e) { if (!utf8_is_valid(e)) return false; - if (string_has_cc(e)) + /* bash allows tabs in environment variables, and so should + * we */ + if (string_has_cc(e, "\t")) return false; /* POSIX says the overall size of the environment block cannot diff --git a/src/shared/fileio.c b/src/shared/fileio.c index fb1c1bcf9f..b1de5908c5 100644 --- a/src/shared/fileio.c +++ b/src/shared/fileio.c @@ -738,7 +738,7 @@ static void write_env_var(FILE *f, const char *v) { p++; fwrite(v, 1, p-v, f); - if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\`$")) { + if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE "\'\"\\`$")) { fputc('\"', f); for (; *p; p++) { diff --git a/src/shared/util.c b/src/shared/util.c index d25ee6652f..d223ecf711 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -5350,16 +5350,14 @@ bool filename_is_safe(const char *p) { bool string_is_safe(const char *p) { const char *t; - assert(p); + if (!p) + return false; for (t = p; *t; t++) { if (*t > 0 && *t < ' ') return false; - if (*t == 127) - return false; - - if (strchr("\\\"\'", *t)) + if (strchr("\\\"\'\0x7f", *t)) return false; } @@ -5367,16 +5365,19 @@ bool string_is_safe(const char *p) { } /** - * Check if a string contains control characters. - * Spaces and tabs are not considered control characters. + * Check if a string contains control characters. If 'ok' is non-NULL + * it may be a string containing additional CCs to be considered OK. */ -bool string_has_cc(const char *p) { +bool string_has_cc(const char *p, const char *ok) { const char *t; assert(p); for (t = p; *t; t++) { - if (*t > 0 && *t < ' ' && *t != '\t') + if (ok && strchr(ok, *t)) + return false; + + if (*t > 0 && *t < ' ') return true; if (*t == 127) diff --git a/src/shared/util.h b/src/shared/util.h index e23069c016..8544940eab 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -382,7 +382,8 @@ bool fstype_is_network(const char *fstype); int chvt(int vt); int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl); -int ask(char *ret, const char *replies, const char *text, ...) _printf_(3, 4); +int ask_char(char *ret, const char *replies, const char *text, ...) _printf_(3, 4); +int ask_string(char **ret, const char *text, ...) _printf_(2, 3); int reset_terminal_fd(int fd, bool switch_to_text); int reset_terminal(const char *name); @@ -692,7 +693,7 @@ _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_ bool filename_is_safe(const char *p) _pure_; bool path_is_safe(const char *p) _pure_; bool string_is_safe(const char *p) _pure_; -bool string_has_cc(const char *p) _pure_; +bool string_has_cc(const char *p, const char *ok) _pure_; /** * Check if a string contains any glob patterns. |