chiark / gitweb /
util: be more picky when validating hostnames
authorLennart Poettering <lennart@poettering.net>
Fri, 22 Mar 2013 16:59:49 +0000 (17:59 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 22 Mar 2013 16:59:49 +0000 (17:59 +0100)
No longer allow dots at the beginning or end of host names, Or double
dots.

https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1152187/comments/14

src/shared/util.c
src/test/test-util.c

index 020b75d0f2857b8604093754977a6a9917ea3334..bc6e035c60d756ee7a06095ffe59b259114c4bcb 100644 (file)
@@ -3773,13 +3773,27 @@ static bool hostname_valid_char(char c) {
 
 bool hostname_is_valid(const char *s) {
         const char *p;
+        bool dot;
 
         if (isempty(s))
                 return false;
 
-        for (p = s; *p; p++)
-                if (!hostname_valid_char(*p))
-                        return false;
+        for (p = s, dot = true; *p; p++) {
+                if (*p == '.') {
+                        if (dot)
+                                return false;
+
+                        dot = true;
+                } else {
+                        if (!hostname_valid_char(*p))
+                                return false;
+
+                        dot = false;
+                }
+        }
+
+        if (dot)
+                return false;
 
         if (p-s > HOST_NAME_MAX)
                 return false;
index cd017ef6fc299bf435d9ac4b05d76c4c66c56d51..08310c83ca4a754cd06df49a0df154a8e1506d07 100644 (file)
@@ -325,6 +325,19 @@ static void test_bus_path_escape(void) {
         test_bus_path_escape_one(":1", "_3a1");
 }
 
+static void test_hostname_is_valid(void) {
+        assert(hostname_is_valid("foobar"));
+        assert(hostname_is_valid("foobar.com"));
+        assert(!hostname_is_valid("fööbar"));
+        assert(!hostname_is_valid(""));
+        assert(!hostname_is_valid("."));
+        assert(!hostname_is_valid(".."));
+        assert(!hostname_is_valid("foobar."));
+        assert(!hostname_is_valid(".foobar"));
+        assert(!hostname_is_valid("foo..bar"));
+        assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
+}
+
 int main(int argc, char *argv[]) {
         test_streq_ptr();
         test_first_word();
@@ -349,6 +362,7 @@ int main(int argc, char *argv[]) {
         test_default_term_for_tty();
         test_memdup_multiply();
         test_bus_path_escape();
+        test_hostname_is_valid();
 
         return 0;
 }