]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix that after malloc failure in RPZ load a half built
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 16 Jun 2026 08:35:41 +0000 (10:35 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 16 Jun 2026 08:35:41 +0000 (10:35 +0200)
  list does not crash later. The newly created RRset is
  linked after creation has succeeded. Thanks to Qifan Zhang,
  Palo Alto Networks, for the report.

doc/Changelog
services/rpz.c

index 6b52d4166d805ac9749781819ae041d63e71b369..9cb8c1fb50a39f00afbc491f22b0002e4c9d0da8 100644 (file)
          exist on server start, the server continues to start with
          a warning log message. Thanks to Qifan Zhang, Palo Alto
          Networks, for the report.
+       - Fix that after malloc failure in RPZ load a half built
+         list does not crash later. The newly created RRset is
+         linked after creation has succeeded. Thanks to Qifan Zhang,
+         Palo Alto Networks, for the report.
+
 
 15 June 2026: Wouter
        - Fix to add `max-transfer-size` and `max-transfer-time` that
index 5121e46b54578ddee207ddfaf2382259f069e1d1..46c23adf04bcad2fb0626ab6c3d33882451e4996 100644 (file)
@@ -904,8 +904,8 @@ rpz_report_rrset_error(const char* msg, uint8_t* rr, size_t rr_len) {
 
 /* from localzone.c; difference is we don't have a dname */
 static struct local_rrset*
-rpz_clientip_new_rrset(struct regional* region,
-       struct clientip_synthesized_rr* raddr, uint16_t rrtype, uint16_t rrclass)
+rpz_clientip_new_rrset(struct regional* region, uint16_t rrtype,
+       uint16_t rrclass)
 {
        struct packed_rrset_data* pd;
        struct local_rrset* rrset = (struct local_rrset*)
@@ -914,8 +914,6 @@ rpz_clientip_new_rrset(struct regional* region,
                log_err("out of memory");
                return NULL;
        }
-       rrset->next = raddr->data;
-       raddr->data = rrset;
        rrset->rrset = (struct ub_packed_rrset_key*)
                regional_alloc_zero(region, sizeof(*rrset->rrset));
        if(rrset->rrset == NULL) {
@@ -954,12 +952,18 @@ rpz_clientip_enter_rr(struct regional* region, struct clientip_synthesized_rr* r
                return 0;
        }
 
-       rrset = rpz_clientip_new_rrset(region, raddr, rrtype, rrclass);
-       if(raddr->data == NULL) {
+       rrset = rpz_clientip_new_rrset(region, rrtype, rrclass);
+       if(rrset == NULL) {
                return 0;
        }
 
-       return rrset_insert_rr(region, rrset->rrset->entry.data, rdata, rdata_len, ttl, "");
+       if(!rrset_insert_rr(region, rrset->rrset->entry.data, rdata, rdata_len, ttl, ""))
+               return 0;
+
+       /* Link in now that the allocations have succeeded. */
+       rrset->next = raddr->data;
+       raddr->data = rrset;
+       return 1;
 }
 
 static int
@@ -982,7 +986,6 @@ rpz_clientip_insert_trigger_rr(struct clientip_synthesized_rrset* set, struct so
        lock_rw_wrlock(&node->lock);
        lock_rw_unlock(&set->lock);
 
-       node->action = a;
        if(a == RPZ_LOCAL_DATA_ACTION) {
                if(!rpz_clientip_enter_rr(set->region, node, rrtype,
                        rrclass, ttl, rdata, rdata_len)) {
@@ -992,6 +995,7 @@ rpz_clientip_insert_trigger_rr(struct clientip_synthesized_rrset* set, struct so
                }
 
        }
+       node->action = a;
 
        lock_rw_unlock(&node->lock);