resolve: packet - fix append_types()
authorTom Gundersen <teg@jklm.no>
Tue, 28 Jul 2015 21:09:23 +0000 (23:09 +0200)
committerTom Gundersen <teg@jklm.no>
Tue, 28 Jul 2015 21:25:52 +0000 (23:25 +0200)
We were counting the number of bits set rather than the number of bytes they occupied.

src/resolve/resolved-dns-packet.c

index 649e8b7..8c5306c 100644 (file)
@@ -508,23 +508,21 @@ static int dns_packet_append_type_window(DnsPacket *p, uint8_t window, uint8_t l
 
         assert(p);
         assert(types);
+        assert(length > 0);
 
         saved_size = p->size;
 
-        if (length != 0) {
-
-                r = dns_packet_append_uint8(p, window, NULL);
-                if (r < 0)
-                        goto fail;
+        r = dns_packet_append_uint8(p, window, NULL);
+        if (r < 0)
+                goto fail;
 
-                r = dns_packet_append_uint8(p, length, NULL);
-                if (r < 0)
-                        goto fail;
+        r = dns_packet_append_uint8(p, length, NULL);
+        if (r < 0)
+                goto fail;
 
-                r = dns_packet_append_blob(p, types, length, NULL);
-                if (r < 0)
-                        goto fail;
-        }
+        r = dns_packet_append_blob(p, types, length, NULL);
+        if (r < 0)
+                goto fail;
 
         if (start)
                 *start = saved_size;
@@ -538,7 +536,7 @@ fail:
 static int dns_packet_append_types(DnsPacket *p, Bitmap *types, size_t *start) {
         Iterator i;
         uint8_t window = 0;
-        uint8_t len = 0;
+        uint8_t entry = 0;
         uint8_t bitmaps[32] = {};
         unsigned n;
         size_t saved_size;
@@ -550,30 +548,24 @@ static int dns_packet_append_types(DnsPacket *p, Bitmap *types, size_t *start) {
         saved_size = p->size;
 
         BITMAP_FOREACH(n, types, i) {
-                uint8_t entry;
-
                 assert(n <= 0xffff);
 
-                if ((n << 8) != window) {
-                        r = dns_packet_append_type_window(p, window, len, bitmaps, NULL);
+                if ((n >> 8) != window && bitmaps[entry / 8] != 0) {
+                        r = dns_packet_append_type_window(p, window, entry / 8 + 1, bitmaps, NULL);
                         if (r < 0)
                                 goto fail;
 
-                        if (len > 0) {
-                                len = 0;
-                                zero(bitmaps);
-                        }
+                        zero(bitmaps);
                 }
 
-                window = n << 8;
-                len ++;
+                window = n >> 8;
 
                 entry = n & 255;
 
                 bitmaps[entry / 8] |= 1 << (7 - (entry % 8));
         }
 
-        r = dns_packet_append_type_window(p, window, len, bitmaps, NULL);
+        r = dns_packet_append_type_window(p, window, entry / 8 + 1, bitmaps, NULL);
         if (r < 0)
                 goto fail;