From: W.C.A. Wijngaards Date: Wed, 13 Mar 2024 15:12:48 +0000 (+0100) Subject: - Fix to unify codepath for local alias for rpz cname action override. X-Git-Tag: release-1.20.0rc1~67 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=afe52595a915d4608b9fc7e5ade9763dde44d9c4;p=thirdparty%2Funbound.git - Fix to unify codepath for local alias for rpz cname action override. --- diff --git a/doc/Changelog b/doc/Changelog index 6a36adee3..6651612d8 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -5,6 +5,7 @@ Fix that the clientip passthru action is logged. Fix that the clientip localdata action is logged. Fix rpz override action cname for the clientip trigger. + - Fix to unify codepath for local alias for rpz cname action override. 12 March 2024: Yorgos - Merge #1028: Clearer documentation for tcp-idle-timeout and diff --git a/services/rpz.c b/services/rpz.c index 9b9e88687..fb9814335 100644 --- a/services/rpz.c +++ b/services/rpz.c @@ -1876,24 +1876,27 @@ nodata: rrset_count, rcode, rsoa); } -static void -rpz_apply_clientip_cname_override_action(struct rpz* r, +/** Apply the cname override action, during worker request callback. + * false on failure. */ +static int +rpz_apply_cname_override_action(struct rpz* r, struct query_info* qinfo, struct regional* temp) { if(!r) - return; + return 0; qinfo->local_alias = regional_alloc_zero(temp, sizeof(struct local_rrset)); if(qinfo->local_alias == NULL) - return; /* out of memory */ + return 0; /* out of memory */ qinfo->local_alias->rrset = regional_alloc_init(temp, r->cname_override, sizeof(*r->cname_override)); if(qinfo->local_alias->rrset == NULL) { qinfo->local_alias = NULL; - return; /* out of memory */ + return 0; /* out of memory */ } qinfo->local_alias->rrset->rk.dname = qinfo->qname; qinfo->local_alias->rrset->rk.dname_len = qinfo->qname_len; + return 1; } /** add additional section SOA record to the reply. @@ -2145,17 +2148,8 @@ rpz_synthesize_qname_localdata(struct module_env* env, struct rpz* r, struct local_data* ld = NULL; int ret = 0; if(r->action_override == RPZ_CNAME_OVERRIDE_ACTION) { - qinfo->local_alias = regional_alloc_zero(temp, sizeof(struct local_rrset)); - if(qinfo->local_alias == NULL) { - return 0; /* out of memory */ - } - qinfo->local_alias->rrset = regional_alloc_init(temp, r->cname_override, - sizeof(*r->cname_override)); - if(qinfo->local_alias->rrset == NULL) { - return 0; /* out of memory */ - } - qinfo->local_alias->rrset->rk.dname = qinfo->qname; - qinfo->local_alias->rrset->rk.dname_len = qinfo->qname_len; + if(!rpz_apply_cname_override_action(r, qinfo, temp)) + return 0; if(r->log) { log_rpz_apply("qname", z->name, NULL, RPZ_CNAME_OVERRIDE_ACTION, qinfo, repinfo, NULL, r->log_name); @@ -2576,8 +2570,11 @@ rpz_apply_maybe_clientip_trigger(struct auth_zones* az, struct module_env* env, edns, repinfo, buf, temp, *a_out); ret = 1; } else if(client_action == RPZ_CNAME_OVERRIDE_ACTION) { - rpz_apply_clientip_cname_override_action(*r_out, - qinfo, temp); + if(!rpz_apply_cname_override_action(*r_out, qinfo, + temp)) { + ret = 0; + goto done; + } ret = 0; } else { local_zones_zone_answer(*z_out /*likely NULL, no zone*/, env, qinfo, edns,