lib/addns: don't depend on the order in resp->answers[]
[metze/samba/wip.git] / lib / addns / dnsgss.c
index 4f7571f87d31d0cfffa21f2ad125b9adf0f1cd44..52f1298e01e24e28fe9a2394afc32efd6fa95b4b 100644 (file)
@@ -125,7 +125,7 @@ static DNS_ERROR dns_negotiate_gss_ctx_int( TALLOC_CTX *mem_ctx,
                        err = dns_create_tkey_record(
                                req, keyname, "gss.microsoft.com", t,
                                t + 86400, DNS_TKEY_MODE_GSSAPI, 0,
-                               output_desc.length, (uint8 *)output_desc.value,
+                               output_desc.length, (uint8_t *)output_desc.value,
                                &rec );
                        if (!ERR_DNS_IS_OK(err)) goto error;
 
@@ -164,6 +164,8 @@ static DNS_ERROR dns_negotiate_gss_ctx_int( TALLOC_CTX *mem_ctx,
                        struct dns_request *resp;
                        struct dns_buffer *buf;
                        struct dns_tkey_record *tkey;
+                       struct dns_rrec *tkey_answer = NULL;
+                       uint16_t i;
 
                        err = dns_receive(mem_ctx, conn, &buf);
                        if (!ERR_DNS_IS_OK(err)) goto error;
@@ -174,10 +176,16 @@ static DNS_ERROR dns_negotiate_gss_ctx_int( TALLOC_CTX *mem_ctx,
                        /*
                         * TODO: Compare id and keyname
                         */
-                       
-                       if ((resp->num_additionals != 1) ||
-                           (resp->num_answers == 0) ||
-                           (resp->answers[0]->type != QTYPE_TKEY)) {
+
+                       for (i=0; i < resp->num_answers; i++) {
+                               if (resp->answers[i]->type != QTYPE_TKEY) {
+                                       continue;
+                               }
+
+                               tkey_answer = resp->answers[i];
+                       }
+
+                       if (tkey_answer == NULL) {
                                err = ERROR_DNS_INVALID_MESSAGE;
                                goto error;
                        }
@@ -272,7 +280,7 @@ DNS_ERROR dns_sign_update(struct dns_update_request *req,
                          gss_ctx_id_t gss_ctx,
                          const char *keyname,
                          const char *algorithmname,
-                         time_t time_signed, uint16 fudge)
+                         time_t time_signed, uint16_t fudge)
 {
        struct dns_buffer *buf;
        DNS_ERROR err;
@@ -319,7 +327,7 @@ DNS_ERROR dns_sign_update(struct dns_update_request *req,
        }
 
        err = dns_create_tsig_record(buf, keyname, algorithmname, time_signed,
-                                    fudge, mic.length, (uint8 *)mic.value,
+                                    fudge, mic.length, (uint8_t *)mic.value,
                                     req->id, 0, &rec);
        gss_release_buffer(&minor, &mic);
        if (!ERR_DNS_IS_OK(err)) goto error;