[PATCH] Fix ptr resolving with cname

DannyAAM danny at saru.moe
Wed Dec 16 03:59:29 UTC 2015


# HG changeset patch
# User DannyAAM <danny at saru.moe>
# Date 1449696194 -28800
#      Thu Dec 10 05:23:14 2015 +0800
# Branch fix-ptr-cname
# Node ID 9d8c7332b7300908414e3bec78a90d9d14b30af8
# Parent  dfe68c41f34f865bc7b45cbe6b7d0f639de283fc
Fix ptr resolving with cname

Make ptr process aware of cname & follow it.
(This depends on resolver's recursive answer.)

diff -r dfe68c41f34f -r 9d8c7332b730 src/core/ngx_resolver.c
--- a/src/core/ngx_resolver.c	Wed Dec 09 17:47:21 2015 +0300
+++ b/src/core/ngx_resolver.c	Thu Dec 10 05:23:14 2015 +0800
@@ -2032,7 +2032,7 @@
     int32_t               ttl;
     ngx_int_t             octet;
     ngx_str_t             name;
-    ngx_uint_t            i, mask, qident, class;
+    ngx_uint_t            i, mask, qident, type, class;
     ngx_queue_t          *expire_queue;
     ngx_rbtree_t         *tree;
     ngx_resolver_an_t    *an;
@@ -2196,9 +2196,14 @@
         goto invalid;
     }
 
+
+
     an = (ngx_resolver_an_t *) &buf[i + 2];
 
+cname_continue:
+
     class = (an->class_hi << 8) + an->class_lo;
+    type = (an->type_hi << 8) + an->type_lo;
     len = (an->len_hi << 8) + an->len_lo;
     ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)
         + (an->ttl[2] << 8) + (an->ttl[3]);
@@ -2213,6 +2218,34 @@
         ttl = 0;
     }
 
+    /* CNAME processing */
+    if (type == NGX_RESOLVE_CNAME) {
+        do {
+            if (buf[i] == 0xc0) {
+                i += 2;
+                break;
+            } else {
+                i += 1 + buf[i];
+            }
+        } while (buf[i] != 0);
+        an = (ngx_resolver_an_t *) &buf[i];
+        len = (an->len_hi << 8) + an->len_lo;
+        i += sizeof(ngx_resolver_an_t) + len;
+
+        ngx_uint_t nameidx = i;
+        do {
+            if (buf[nameidx] == 0xc0) {
+                nameidx += 2;
+                break;
+            } else {
+                nameidx += 1 + buf[nameidx];
+            }
+        } while (buf[nameidx] != 0);
+        an = (ngx_resolver_an_t *) &buf[nameidx];
+
+        goto cname_continue;
+    }
+
     ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
                   "resolver qt:%ui cl:%ui len:%uz",
                   (an->type_hi << 8) + an->type_lo,



More information about the nginx-devel mailing list