]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3853. [cleanup] Refactor dns_rdataslab_fromrdataset to seperate out
authorMark Andrews <marka@isc.org>
Tue, 20 May 2014 01:36:03 +0000 (11:36 +1000)
committerMark Andrews <marka@isc.org>
Tue, 20 May 2014 01:37:28 +0000 (11:37 +1000)
                        the handling of a rdataset with no records. [RT #35968]

(cherry picked from commit 27b09ceb12ec95de461bd2780615d4064ccb1419)

CHANGES
lib/dns/rdataslab.c

diff --git a/CHANGES b/CHANGES
index 7973246bce07eb05a7bd2f4ef594dcd01df43a24..1c20eeb6273c8d0f88b2e073ff43720e2bdadc43 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3853.  [cleanup]       Refactor dns_rdataslab_fromrdataset to seperate out
+                       the handling of a rdataset with no records. [RT #35968]
+
 3850.  [bug]           Disabling forwarding could trigger a REQUIRE assertion.
                        [RT #35979]
 
index 1c02b60201b28fafd4f753e09f2848763b920b36..9367127d9eaf372bd10f175bdaf58fc57c368880 100644 (file)
@@ -148,21 +148,36 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
 
        buflen = reservelen + 2;
 
-       nalloc = dns_rdataset_count(rdataset);
-       nitems = nalloc;
-       if (nitems == 0 && rdataset->type != 0)
-               return (ISC_R_FAILURE);
+       nitems = dns_rdataset_count(rdataset);
 
-       if (nalloc > 0xffff)
-               return (ISC_R_NOSPACE);
+       /*
+        * If there are no rdata then we can just need to allocate a header
+        * with zero a record count.
+        */
+       if (nitems == 0) {
+               if (rdataset->type != 0)
+                       return (ISC_R_FAILURE);
+               rawbuf = isc_mem_get(mctx, buflen);
+               if (rawbuf == NULL)
+                       return (ISC_R_NOMEMORY);
+               region->base = rawbuf;
+               region->length = buflen;
+               rawbuf += reservelen;
+               *rawbuf++ = 0;
+               *rawbuf = 0;
+               return (ISC_R_SUCCESS);
+       }
 
+       if (nitems > 0xffff)
+               return (ISC_R_NOSPACE);
 
-       if (nalloc != 0) {
-               x = isc_mem_get(mctx, nalloc * sizeof(struct xrdata));
-               if (x == NULL)
-                       return (ISC_R_NOMEMORY);
-       } else
-               x = NULL;
+       /*
+        * Remember the original number of items.
+        */
+       nalloc = nitems;
+       x = isc_mem_get(mctx, nalloc * sizeof(struct xrdata));
+       if (x == NULL)
+               return (ISC_R_NOMEMORY);
 
        /*
         * Save all of the rdata members into an array.
@@ -180,12 +195,12 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
 #endif
                result = dns_rdataset_next(rdataset);
        }
-       if (result != ISC_R_NOMORE)
-               goto free_rdatas;
-       if (i != nalloc) {
+       if (i != nalloc || result != ISC_R_NOMORE) {
                /*
                 * Somehow we iterated over fewer rdatas than
-                * dns_rdataset_count() said there were!
+                * dns_rdataset_count() said there were or there
+                * were more items than dns_rdataset_count said
+                * there were.
                 */
                result = ISC_R_FAILURE;
                goto free_rdatas;
@@ -194,7 +209,8 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
        /*
         * Put into DNSSEC order.
         */
-       qsort(x, nalloc, sizeof(struct xrdata), compare_rdata);
+       if (nalloc > 1U)
+               qsort(x, nalloc, sizeof(struct xrdata), compare_rdata);
 
        /*
         * Remove duplicates and compute the total storage required.
@@ -230,17 +246,15 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
                                buflen++;
                }
        }
+
        /*
         * Don't forget the last item!
         */
-       if (nalloc != 0) {
 #if DNS_RDATASET_FIXED
-               buflen += (8 + x[i-1].rdata.length);
+       buflen += (8 + x[i-1].rdata.length);
 #else
-               buflen += (2 + x[i-1].rdata.length);
+       buflen += (2 + x[i-1].rdata.length);
 #endif
-       }
-
        /*
         * Provide space to store the per RR meta data.
         */
@@ -330,8 +344,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
        result = ISC_R_SUCCESS;
 
  free_rdatas:
-       if (x != NULL)
-               isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata));
+       isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata));
        return (result);
 }