s4-dns: Fix handling of TXT DNS Record
authorAmitay Isaacs <amitay@gmail.com>
Tue, 28 Feb 2012 06:01:27 +0000 (17:01 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Thu, 1 Mar 2012 13:24:50 +0000 (00:24 +1100)
source4/dns_server/dns_update.c
source4/dns_server/dns_utils.c

index 3fd612cfabcadea7be2495677b33006aa5184200..62cf9e555a348bd8630bd8f1495be8c1b5c7376f 100644 (file)
@@ -334,8 +334,15 @@ static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx,
                W_ERROR_HAVE_NO_MEMORY(r->data.mx.nameTarget);
                break;
        case DNS_QTYPE_TXT:
-               r->data.txt = talloc_strdup(mem_ctx, rrec->rdata.txt_record.txt);
-               W_ERROR_HAVE_NO_MEMORY(r->data.txt);
+               /* FIXME: This converts the TXT rr data into a single string.
+                *        Since dns server does not reply to qtype TXT,
+                *        this is not yet relevant.
+                */
+               r->data.txt.count = 1;
+               r->data.txt.str = talloc_array(mem_ctx, const char *, 1);
+               W_ERROR_HAVE_NO_MEMORY(r->data.txt.str);
+               r->data.txt.str[0] = talloc_strdup(mem_ctx, rrec->rdata.txt_record.txt);
+               W_ERROR_HAVE_NO_MEMORY(r->data.txt.str[0]);
                break;
        default:
                DEBUG(0, ("Got a qytpe of %d\n", rrec->rr_type));
index 4649e5ffcac7b72dcb5254f6c7eaf766d5f0e189..1f7648cd5b418c140db771b2c2b554dc7215f1aa 100644 (file)
@@ -115,6 +115,9 @@ bool dns_name_equal(const char *name1, const char *name2)
 bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1,
                       struct dnsp_DnssrvRpcRecord *rec2)
 {
+       bool status;
+       int i;
+
        if (rec1->wType != rec2->wType) {
                return false;
        }
@@ -128,7 +131,15 @@ bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1,
        case DNS_TYPE_CNAME:
                return dns_name_equal(rec1->data.cname, rec2->data.cname);
        case DNS_TYPE_TXT:
-               return strcmp(rec1->data.txt, rec2->data.txt) == 0;
+               if (rec1->data.txt.count != rec2->data.txt.count) {
+                       return false;
+               }
+               status = true;
+               for (i=0; i<rec1->data.txt.count; i++) {
+                       status = status && (strcmp(rec1->data.txt.str[i],
+                                               rec2->data.txt.str[i]) == 0);
+               }
+               return status;
        case DNS_TYPE_PTR:
                return strcmp(rec1->data.ptr, rec2->data.ptr) == 0;
        case DNS_TYPE_NS: