chiark / gitweb /
util: don't consider tabs special in string_has_cc() anymore
authorLennart Poettering <lennart@poettering.net>
Mon, 7 Jul 2014 10:04:55 +0000 (12:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 7 Jul 2014 13:25:55 +0000 (15:25 +0200)
Instead, take a list of exceptions to our usual CC check

src/hostname/hostnamed.c
src/shared/env-util.c
src/shared/fileio.c
src/shared/util.c
src/shared/util.h

index 14629dd3a9d53a36107fb92f562f97bba422a531..514554d575c32010e301753e5e7dbcfc5b10d78b 100644 (file)
@@ -550,8 +550,7 @@ static int set_machine_info(Context *c, sd_bus *bus, sd_bus_message *m, int prop
 
                 if (prop == PROP_ICON_NAME && !filename_is_safe(name))
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid icon name '%s'", name);
-                if (prop == PROP_PRETTY_HOSTNAME &&
-                    (string_has_cc(name) || chars_intersect(name, "\t")))
+                if (prop == PROP_PRETTY_HOSTNAME && string_has_cc(name, NULL))
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid pretty host name '%s'", name);
                 if (prop == PROP_CHASSIS && !valid_chassis(name))
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid chassis '%s'", name);
index b2e45531ab7ec0131e102075bc9b09397dfe0fb1..20b208f63c6a8bb0b0bf0647e0b2f5a76efd8d1f 100644 (file)
@@ -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
index fb1c1bcf9f8c05ba245bddb30e28d4c83922f5fc..b1de5908c538c32e792c093c4daeb34f58812852 100644 (file)
@@ -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++) {
index d25ee6652f93a81006f354b48dedc404e4fd92bc..d223ecf7114ddd809d65d954e1367f04551fe725 100644 (file)
@@ -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)
index e23069c016837ea1cde76d01dbd60cf3d0c8e382..8544940eabdb17743d0aafa23421798065854350 100644 (file)
@@ -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.