dns-domain: make sure dns_name_to_wire_format() may properly encode the root domain
authorLennart Poettering <lennart@poettering.net>
Sun, 29 Nov 2015 13:29:31 +0000 (14:29 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 30 Nov 2015 18:42:35 +0000 (19:42 +0100)
The root domain consists of zero labels, and we should be able to encode
that.

src/shared/dns-domain.c
src/test/test-dns-domain.c

index ab61eb3..ba6eff8 100644 (file)
@@ -866,19 +866,17 @@ bool dns_name_is_single_label(const char *name) {
 
 /* Encode a domain name according to RFC 1035 Section 3.1 */
 int dns_name_to_wire_format(const char *domain, uint8_t *buffer, size_t len) {
-        uint8_t *label_length;
-        uint8_t *out;
+        uint8_t *label_length, *out;
         int r;
 
-        assert_return(buffer, -EINVAL);
-        assert_return(domain, -EINVAL);
-        assert_return(domain[0], -EINVAL);
+        assert(domain);
+        assert(buffer);
 
         out = buffer;
 
         do {
                 /* reserve a byte for label length */
-                if (len == 0)
+                if (len <= 0)
                         return -ENOBUFS;
                 len--;
                 label_length = out;
index 3e470c0..0762faa 100644 (file)
@@ -66,11 +66,12 @@ static void test_dns_name_to_wire_format_one(const char *what, const char *expec
 }
 
 static void test_dns_name_to_wire_format(void) {
+        const char out0[] = { 0 };
         const char out1[] = { 3, 'f', 'o', 'o', 0 };
         const char out2[] = { 5, 'h', 'a', 'l', 'l', 'o', 3, 'f', 'o', 'o', 3, 'b', 'a', 'r', 0 };
         const char out3[] = { 4, ' ', 'f', 'o', 'o', 3, 'b', 'a', 'r', 0 };
 
-        test_dns_name_to_wire_format_one("", NULL, 0, -EINVAL);
+        test_dns_name_to_wire_format_one("", out0, sizeof(out0), sizeof(out0));
 
         test_dns_name_to_wire_format_one("foo", out1, sizeof(out1), sizeof(out1));
         test_dns_name_to_wire_format_one("foo", out1, sizeof(out1) + 1, sizeof(out1));