]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib: do not use potentially large stack allocations
authorMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 8 Dec 2015 18:40:18 +0000 (19:40 +0100)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 8 Dec 2015 23:27:10 +0000 (00:27 +0100)
rdata may be <=64k + 8B on stack which may be source of various mystery
errors later, for example in bindings or stackspace-constricted env

lib/resolve.c
lib/utils.c
lib/utils.h
lib/zonecut.c
modules/hints/hints.c

index b665345ee082ad0be907ae750f70965619380c74..df7c91ff9d427e4cdd8f6fb59e0ae78df1850d56 100644 (file)
@@ -111,9 +111,10 @@ static int invalidate_ns(struct kr_rplan *rplan, struct kr_query *qry)
        if (qry->ns.addr[0].ip.sa_family != AF_UNSPEC) {
                uint8_t *addr = kr_nsrep_inaddr(qry->ns.addr[0]);
                size_t addr_len = kr_nsrep_inaddr_len(qry->ns.addr[0]);
-               knot_rdata_t rdata[knot_rdata_array_size(addr_len)];
-               knot_rdata_init(rdata, addr_len, addr, 0);
-               return kr_zonecut_del(&qry->zone_cut, qry->ns.name, rdata);
+               /* @warning _NOT_ thread-safe */
+               static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
+               knot_rdata_init(rdata_arr, addr_len, addr, 0);
+               return kr_zonecut_del(&qry->zone_cut, qry->ns.name, rdata_arr);
        } else {
                return kr_zonecut_del(&qry->zone_cut, qry->ns.name, NULL);
        }
index 75cd81a080613a2a79df45115936da4dc991ff55..d2715592a5e009b26088c11ccdf829ec86c77032 100644 (file)
@@ -205,8 +205,10 @@ int kr_pkt_put(knot_pkt_t *pkt, const knot_dname_t *name, uint32_t ttl,
        /* Create empty RR */
        knot_rrset_t rr;
        knot_rrset_init(&rr, knot_dname_copy(name, &pkt->mm), rtype, rclass);
-       /* Create RDATA */
-       knot_rdata_t rdata_arr[knot_rdata_array_size(rdlen)];
+       /* Create RDATA
+        * @warning _NOT_ thread safe.
+        */
+       static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
        knot_rdata_init(rdata_arr, rdlen, rdata, ttl);
        knot_rdataset_add(&rr.rrs, rdata_arr, &pkt->mm);
        /* Append RR */
index cfa789cedc6a44b01bf8bd4fee38113909a71857..a0f10bad8eb60ed00c4fec7137b1d575151bbc82 100644 (file)
@@ -77,6 +77,8 @@ struct kr_context;
 typedef array_t(knot_rrset_t *) rr_array_t;
 /* @endcond */
 
+/** @internal RDATA array maximum size. */
+#define RDATA_ARR_MAX (UINT16_MAX + sizeof(uint64_t))
 /** @internal Next RDATA shortcut. */
 #define kr_rdataset_next(rd) (rd + knot_rdata_array_size(knot_rdata_rdlen(rd)))
 
index ca120b7e52ac741b1b5e16481de115e7aab40a2f..ca22b561d92616bf5dad1bdc1eddf4b99eb31a30 100644 (file)
@@ -271,6 +271,8 @@ int kr_zonecut_set_sbelt(struct kr_context *ctx, struct kr_zonecut *cut)
        if (!ctx || !cut) {
                return kr_error(EINVAL);
        }
+       /* @warning _NOT_ thread-safe */
+       static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
 
        update_cut_name(cut, U8(""));
        map_walk(&cut->nsset, free_addr_set, cut->pool);
@@ -284,9 +286,8 @@ int kr_zonecut_set_sbelt(struct kr_context *ctx, struct kr_zonecut *cut)
                /* Copy compiled-in root hints */
                for (unsigned i = 0; i < HINT_COUNT; ++i) {
                        const struct hint_info *hint = &SBELT[i];
-                       knot_rdata_t rdata[knot_rdata_array_size(hint->len)];
-                       knot_rdata_init(rdata, hint->len, hint->addr, 0);
-                       ret = kr_zonecut_add(cut, hint->name, rdata);
+                       knot_rdata_init(rdata_arr, hint->len, hint->addr, 0);
+                       ret = kr_zonecut_add(cut, hint->name, rdata_arr);
                        if (ret != 0) {
                                break;
                        }
index 99667e9bfd2dbd91498c25fc9fcfb99624082ff3..776c8c6a173e20bb8946901bed3f2522453cb250 100644 (file)
@@ -230,13 +230,13 @@ static int add_pair(struct kr_zonecut *hints, const char *name, const char *addr
                return kr_error(EINVAL);
        }
 
-       /* Build rdata */
-       size_t addr_len = 0;
-       uint8_t *raw_addr = sockaddr_raw(&ss, &addr_len);
-       knot_rdata_t rdata[knot_rdata_array_size(addr_len)];
-       knot_rdata_init(rdata, addr_len, raw_addr, 0);
-
-       return kr_zonecut_add(hints, key, rdata);
+       /* Build RDATA */
+       size_t addr_len = kr_inaddr_len((struct sockaddr *)&ss);
+       const uint8_t *raw_addr = (const uint8_t *)kr_inaddr((struct sockaddr *)&ss);
+       /* @warning _NOT_ thread-safe */
+       static knot_rdata_t rdata_arr[RDATA_ARR_MAX];
+       knot_rdata_init(rdata_arr, addr_len, raw_addr, 0);
+       return kr_zonecut_add(hints, key, rdata_arr);
 }
 
 static int load_map(struct kr_zonecut *hints, FILE *fp)