]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Address theoretical buffer overrun in recent change
authorMark Andrews <marka@isc.org>
Thu, 28 Jan 2021 23:12:14 +0000 (10:12 +1100)
committerMatthijs Mekking <matthijs@isc.org>
Wed, 3 Mar 2021 09:55:38 +0000 (10:55 +0100)
The strlcat() call was wrong.

    *** CID 316608:  Memory - corruptions  (OVERRUN)
    /lib/dns/resolver.c: 5017 in fctx_create()
    5011       * Make fctx->info point to a copy of a formatted string
    5012       * "name/type".
    5013       */
    5014      dns_name_format(name, buf, sizeof(buf));
    5015      dns_rdatatype_format(type, typebuf, sizeof(typebuf));
    5016      p = strlcat(buf, "/", sizeof(buf));
    >>>     CID 316608:  Memory - corruptions  (OVERRUN)
    >>>     Calling "strlcat" with "buf + p" and "1036UL" is suspicious because "buf" points into a buffer of 1036 bytes and the function call may access "(char *)(buf + p) + 1035UL". [Note: The source code implementation of the function has been overridden by a builtin model.]
    5017      strlcat(buf + p, typebuf, sizeof(buf));
    5018      fctx->info = isc_mem_strdup(mctx, buf);
    5019
    5020      FCTXTRACE("create");
    5021      dns_name_init(&fctx->name, NULL);
    5022      dns_name_dup(name, mctx, &fctx->name);

(cherry picked from commit 59bf6e71e201f5d43771191b4f34a6052eadb582)

lib/dns/resolver.c

index b3b18eb57276bd235b1c30ee22d11eea38e85521..50fadc0c81f5c9a4c97d6baa3030ab6abb2cc691 100644 (file)
@@ -5069,7 +5069,6 @@ fctx_create(dns_resolver_t *res, const dns_name_t *name, dns_rdatatype_t type,
        isc_interval_t interval;
        unsigned int findoptions = 0;
        char buf[DNS_NAME_FORMATSIZE + DNS_RDATATYPE_FORMATSIZE + 1];
-       char typebuf[DNS_RDATATYPE_FORMATSIZE];
        isc_mem_t *mctx;
        size_t p;
        bool try_stale;
@@ -5098,9 +5097,9 @@ fctx_create(dns_resolver_t *res, const dns_name_t *name, dns_rdatatype_t type,
         * "name/type".
         */
        dns_name_format(name, buf, sizeof(buf));
-       dns_rdatatype_format(type, typebuf, sizeof(typebuf));
        p = strlcat(buf, "/", sizeof(buf));
-       strlcat(buf + p, typebuf, sizeof(buf));
+       INSIST(p + DNS_RDATATYPE_FORMATSIZE < sizeof(buf));
+       dns_rdatatype_format(type, buf + p, sizeof(buf) - p);
        fctx->info = isc_mem_strdup(mctx, buf);
 
        FCTXTRACE("create");