From 7f30ad05024525ec22036ac53c50df10eda08b1d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 22:31:24 +0200 Subject: [PATCH 01/10] s4:rpc_server/common: turn lpcfg_dcerpc_server_info() into an inline function This makes it easier to use without linking problems. While there fix talloc problems. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 8f17d9a89e22d074e6894cc1530ea626d60a080f) --- lib/param/param.h | 1 - source4/rpc_server/common/common.h | 26 ++++++++++++++++ source4/rpc_server/common/loadparm.c | 45 ---------------------------- source4/rpc_server/wscript_build | 1 - 4 files changed, 26 insertions(+), 47 deletions(-) delete mode 100644 source4/rpc_server/common/loadparm.c diff --git a/lib/param/param.h b/lib/param/param.h index ed10fa9e90da..6cf27c245971 100644 --- a/lib/param/param.h +++ b/lib/param/param.h @@ -188,7 +188,6 @@ void lpcfg_smbcli_options(struct loadparm_context *lp_ctx, void lpcfg_smbcli_session_options(struct loadparm_context *lp_ctx, struct smbcli_session_options *options); const char *lpcfg_socket_options(struct loadparm_context *); -struct dcerpc_server_info *lpcfg_dcerpc_server_info(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx); struct gensec_settings *lpcfg_gensec_settings(TALLOC_CTX *, struct loadparm_context *); /* The following definitions come from param/util.c */ diff --git a/source4/rpc_server/common/common.h b/source4/rpc_server/common/common.h index b57ddf20db57..a002e5ffea52 100644 --- a/source4/rpc_server/common/common.h +++ b/source4/rpc_server/common/common.h @@ -39,6 +39,32 @@ struct dcerpc_server_info { uint32_t version_build; }; +#ifdef AD_DC_BUILD_IS_ENABLED #include "rpc_server/common/proto.h" +#endif /* AD_DC_BUILD_IS_ENABLED */ +#include "lib/param/param.h" + +static inline +struct dcerpc_server_info *lpcfg_dcerpc_server_info(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx) +{ + struct dcerpc_server_info *ret = NULL; + + ret = talloc_zero(mem_ctx, struct dcerpc_server_info); + if (ret == NULL) { + return NULL; + } + + ret->domain_name = talloc_strdup(ret, lpcfg_workgroup(lp_ctx)); + if (ret->domain_name == NULL) { + TALLOC_FREE(ret); + return NULL; + } + ret->version_major = lpcfg_parm_int(lp_ctx, NULL, "server_info", "version_major", 5); + ret->version_minor = lpcfg_parm_int(lp_ctx, NULL, "server_info", "version_minor", 2); + ret->version_build = lpcfg_parm_int(lp_ctx, NULL, "server_info", "version_build", 3790); + + return ret; +} #endif /* _DCERPC_SERVER_COMMON_H_ */ diff --git a/source4/rpc_server/common/loadparm.c b/source4/rpc_server/common/loadparm.c deleted file mode 100644 index 174063e48021..000000000000 --- a/source4/rpc_server/common/loadparm.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - Unix SMB/CIFS implementation. - DCERPC server info param function - Moved into rpc_server/common to break dependencies to rpc_server from param - Copyright (C) Karl Auer 1993-1998 - - Largely re-written by Andrew Tridgell, September 1994 - - Copyright (C) Simo Sorce 2001 - Copyright (C) Alexander Bokovoy 2002 - Copyright (C) Stefan (metze) Metzmacher 2002 - Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003. - Copyright (C) James Myers 2003 - Copyright (C) Jelmer Vernooij 2007 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "includes.h" -#include "lib/param/param.h" -#include "rpc_server/common/common.h" - -_PUBLIC_ struct dcerpc_server_info *lpcfg_dcerpc_server_info(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx) -{ - struct dcerpc_server_info *ret = talloc_zero(mem_ctx, struct dcerpc_server_info); - - ret->domain_name = talloc_reference(mem_ctx, lpcfg_workgroup(lp_ctx)); - ret->version_major = lpcfg_parm_int(lp_ctx, NULL, "server_info", "version_major", 5); - ret->version_minor = lpcfg_parm_int(lp_ctx, NULL, "server_info", "version_minor", 2); - ret->version_build = lpcfg_parm_int(lp_ctx, NULL, "server_info", "version_build", 3790); - - return ret; -} - diff --git a/source4/rpc_server/wscript_build b/source4/rpc_server/wscript_build index a3cc44a3e87d..54a10f2ba003 100644 --- a/source4/rpc_server/wscript_build +++ b/source4/rpc_server/wscript_build @@ -11,7 +11,6 @@ bld.SAMBA_SUBSYSTEM('DCERPC_COMMON', source=''' common/server_info.c common/forward.c - common/loadparm.c ''', autoproto='common/proto.h', deps='ldb DCERPC_SHARE', -- 2.43.0 From e4b6868ae62204eb8d6075684a65337507ee4497 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 20:04:35 +0200 Subject: [PATCH 02/10] s4:dns_server: add dns_server_scavenging_interval() We currently have two options used in different locations: dnsserver:scavenging_interval => the value is in seconds and is used in kccsrv_dns_zone_scavenging() dnsserver:ScavengingInterval => the value is in hours and is used in dnsserver_init_serverinfo() In order to have this just once with a consistent default, we have dns_server_scavenging_interval() now. The value of dnsserver:ScavengingInterval was only ever used to fill the response of 'samba-tool dns serverinfo', so we prefer dnsserver:scavenging_interval is set. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit c239af3b4d55705b96cf371cc1c34910249b2379) --- source4/dns_server/dnsserver_common.c | 38 +++++++++++++++++++++++++++ source4/dns_server/dnsserver_common.h | 5 ++++ 2 files changed, 43 insertions(+) diff --git a/source4/dns_server/dnsserver_common.c b/source4/dns_server/dnsserver_common.c index 88aed2eba8d5..52475204877d 100644 --- a/source4/dns_server/dnsserver_common.c +++ b/source4/dns_server/dnsserver_common.c @@ -75,6 +75,44 @@ uint8_t werr_to_dns_err(WERROR werr) return DNS_RCODE_SERVFAIL; } +void dns_server_scavenging_interval(struct loadparm_context *lp_ctx, + uint32_t *_si_hours, + time_t *_si_secs) +{ + uint32_t si_hours = 0; + time_t si_secs = 0; + + if (lpcfg_dns_zone_scavenging(lp_ctx)) { + int i_hours; + + i_hours = lpcfg_parm_int(lp_ctx, + NULL, + "dnsserver", + "ScavengingInterval", + 2); + i_hours = MAX(i_hours, 0); + i_hours = MIN(i_hours, (365*24)); + + si_secs = i_hours * (60 * 60); + si_secs = lpcfg_parm_int(lp_ctx, + NULL, + "dnsserver", + "scavenging_interval", + si_secs); + if (si_secs > 0) { + si_hours = si_secs / (60 * 60); + si_hours = MAX(si_hours, 1); + } + } + + if (_si_hours != NULL) { + *_si_hours = si_hours; + } + if (_si_secs != NULL) { + *_si_secs = si_secs; + } +} + WERROR dns_common_extract(struct ldb_context *samdb, const struct ldb_message_element *el, TALLOC_CTX *mem_ctx, diff --git a/source4/dns_server/dnsserver_common.h b/source4/dns_server/dnsserver_common.h index a0c1065ae581..6c30bef57fc1 100644 --- a/source4/dns_server/dnsserver_common.h +++ b/source4/dns_server/dnsserver_common.h @@ -27,6 +27,7 @@ uint8_t werr_to_dns_err(WERROR werr); #define DNS_ERR(err_str) WERR_DNS_ERROR_RCODE_##err_str +struct loadparm_context; struct ldb_message_element; struct ldb_context; struct dnsp_DnssrvRpcRecord; @@ -37,6 +38,10 @@ struct dns_server_zone { struct ldb_dn *dn; }; +void dns_server_scavenging_interval(struct loadparm_context *lp_ctx, + uint32_t *_si_hours, + time_t *_si_secs); + WERROR dns_common_extract(struct ldb_context *samdb, const struct ldb_message_element *el, TALLOC_CTX *mem_ctx, -- 2.43.0 From 6747bd5dab9aa129aa119d44db835718bef4fc0a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 20:23:43 +0200 Subject: [PATCH 03/10] s4:kcc: let kccsrv_dns_zone_scavenging() use dns_server_scavenging_interval() It means we have the parameter logic just once and a value of 0 means scavenging is disabled. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 03caa23a6d98fb7c252590de9ffc909407b8bdc8) --- source4/dsdb/kcc/kcc_periodic.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source4/dsdb/kcc/kcc_periodic.c b/source4/dsdb/kcc/kcc_periodic.c index df38f00e7763..42056d5bd2ab 100644 --- a/source4/dsdb/kcc/kcc_periodic.c +++ b/source4/dsdb/kcc/kcc_periodic.c @@ -606,7 +606,7 @@ static NTSTATUS kccsrv_dns_zone_scavenging( { time_t current_time = time(NULL); - time_t dns_scavenge_interval; + time_t dns_scavenge_interval = 0; NTSTATUS status; char *error_string = NULL; @@ -614,16 +614,14 @@ static NTSTATUS kccsrv_dns_zone_scavenging( * Only perform zone scavenging if it's been enabled. * (it still might be disabled on all zones). */ - if (!lpcfg_dns_zone_scavenging(s->task->lp_ctx)) { + dns_server_scavenging_interval(s->task->lp_ctx, + NULL, /* _si_hours */ + &dns_scavenge_interval); + if (dns_scavenge_interval == 0) { DBG_INFO("DNS scavenging not enabled\n"); return NT_STATUS_OK; } - dns_scavenge_interval = lpcfg_parm_int(s->task->lp_ctx, - NULL, - "dnsserver", - "scavenging_interval", - 2 * 60 * 60); if ((current_time - s->last_dns_scavenge) > dns_scavenge_interval) { s->last_dns_scavenge = current_time; status = dns_tombstone_records(mem_ctx, s->samdb, -- 2.43.0 From 8258e501b14257522c11ee7363e3ab57365ce9c4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 20:27:04 +0200 Subject: [PATCH 04/10] s4:rpc_server/dnsserver: let dnsserver_init_serverinfo() use dns_server_scavenging_interval() It means we have the parameter logic just once. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 312da01ed1d9c0d0b30bc4db8262e6d01b307252) --- source4/rpc_server/dnsserver/dnsutils.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source4/rpc_server/dnsserver/dnsutils.c b/source4/rpc_server/dnsserver/dnsutils.c index bf3225c3e47b..e7ea282e3eb4 100644 --- a/source4/rpc_server/dnsserver/dnsutils.c +++ b/source4/rpc_server/dnsserver/dnsutils.c @@ -192,8 +192,9 @@ struct dnsserver_serverinfo *dnsserver_init_serverinfo(TALLOC_CTX *mem_ctx, serverinfo->dwDsPollingInterval = 0xB4; /* 3 minutes (default) */ serverinfo->dwLocalNetPriorityNetMask = 0x000000FF; - serverinfo->dwScavengingInterval = lpcfg_parm_int( - lp_ctx, NULL, "dnsserver", "ScavengingInterval", 24 * 7); + dns_server_scavenging_interval(lp_ctx, + &serverinfo->dwScavengingInterval, + NULL); /* _si_secs */ serverinfo->dwDefaultRefreshInterval = lpcfg_parm_int( lp_ctx, NULL, "dnsserver", "DefaultRefreshInterval", 24 * 3); serverinfo->dwDefaultNoRefreshInterval = lpcfg_parm_int( -- 2.43.0 From 1f6774c14530cb4882a0753d2f70ec824a957714 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 21:08:30 +0200 Subject: [PATCH 05/10] s4:rpc_server/dnsserver: define DNS_SERVER_DEFAULT_[NO_]REFRESH_INTERVAL as 24 * 7 These are the defaults Windows is also using... BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 9919ae52ef611423205a140e32900d84242fc01d) --- source4/rpc_server/dnsserver/dnsserver.h | 16 ++++++++++++++++ source4/rpc_server/dnsserver/dnsutils.c | 6 ++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/source4/rpc_server/dnsserver/dnsserver.h b/source4/rpc_server/dnsserver/dnsserver.h index 2e46e7c66a43..97e952a6aa64 100644 --- a/source4/rpc_server/dnsserver/dnsserver.h +++ b/source4/rpc_server/dnsserver/dnsserver.h @@ -27,6 +27,22 @@ #include "param/param.h" #include "ldb.h" +/* + * See [MS-DNSP] 2.3.2.1.1 Property Id + * + * DSPROPERTY_ZONE_NOREFRESH_INTERVAL: + * The zone no refresh interval. See + * dwNoRefreshInterval (section 2.2.5.2.4.1). + * Default: 168 hours/7 days. + * + * DSPROPERTY_ZONE_REFRESH_INTERVAL: + * The zone refresh interval. See + * dwRefreshInterval (section 2.2.5.2.4.1). + * Default: 168 hours/7 days. + */ +#define DNS_SERVER_DEFAULT_NO_REFRESH_INTERVAL (24 * 7) +#define DNS_SERVER_DEFAULT_REFRESH_INTERVAL (24 * 7) + struct dnsserver_serverinfo { uint32_t dwVersion; uint8_t fBootMethod; diff --git a/source4/rpc_server/dnsserver/dnsutils.c b/source4/rpc_server/dnsserver/dnsutils.c index e7ea282e3eb4..aae8efc9d784 100644 --- a/source4/rpc_server/dnsserver/dnsutils.c +++ b/source4/rpc_server/dnsserver/dnsutils.c @@ -196,9 +196,11 @@ struct dnsserver_serverinfo *dnsserver_init_serverinfo(TALLOC_CTX *mem_ctx, &serverinfo->dwScavengingInterval, NULL); /* _si_secs */ serverinfo->dwDefaultRefreshInterval = lpcfg_parm_int( - lp_ctx, NULL, "dnsserver", "DefaultRefreshInterval", 24 * 3); + lp_ctx, NULL, "dnsserver", "DefaultRefreshInterval", + DNS_SERVER_DEFAULT_REFRESH_INTERVAL); serverinfo->dwDefaultNoRefreshInterval = lpcfg_parm_int( - lp_ctx, NULL, "dnsserver", "DefaultNoRefreshInterval", 24 * 3); + lp_ctx, NULL, "dnsserver", "DefaultNoRefreshInterval", + DNS_SERVER_DEFAULT_NO_REFRESH_INTERVAL); serverinfo->dwLastScavengeTime = 0; -- 2.43.0 From 57520a6fa81d4c9d865dbcb61298553da74c2976 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 21:42:55 +0200 Subject: [PATCH 06/10] s4:rpc_server/dnsserver: let dnsserver_init_zoneinfo() fallback to serverinfo->dwDefault[No]RefreshInterval And disable fAging if the values are still 0. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit fdcda85ac611e2e12ab895674fed76347b5ed6d0) --- python/samba/tests/samba_tool/dnscmd.py | 3 ++- source4/rpc_server/dnsserver/dnsutils.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/python/samba/tests/samba_tool/dnscmd.py b/python/samba/tests/samba_tool/dnscmd.py index aa475fb84ac1..4f144c17c166 100644 --- a/python/samba/tests/samba_tool/dnscmd.py +++ b/python/samba/tests/samba_tool/dnscmd.py @@ -956,8 +956,9 @@ class DnsCmdTestCase(SambaToolCmdTest): (['--aging=2', '--norefreshinterval=1'], {}, True), (['--aging=1', '--norefreshinterval=1'], {'fAging': 'TRUE', 'dwNoRefreshInterval': '1'}, False), + # setting --norefreshinterval=0 results in the server default (['--aging=1', '--norefreshinterval=0'], - {'fAging': 'TRUE', 'dwNoRefreshInterval': '0'}, False), + {'fAging': 'TRUE', 'dwNoRefreshInterval': '168'}, False), (['--aging=0', '--norefreshinterval=99', '--refreshinterval=99'], {'fAging': 'FALSE', 'dwNoRefreshInterval': '99', diff --git a/source4/rpc_server/dnsserver/dnsutils.c b/source4/rpc_server/dnsserver/dnsutils.c index aae8efc9d784..c90e1e15106a 100644 --- a/source4/rpc_server/dnsserver/dnsutils.c +++ b/source4/rpc_server/dnsserver/dnsutils.c @@ -310,6 +310,27 @@ struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone, } } + if (strcmp(zone->name, ".") != 0) { + if (zoneinfo->dwRefreshInterval == 0) { + zoneinfo->dwRefreshInterval = + serverinfo->dwDefaultRefreshInterval; + } + if (zoneinfo->dwNoRefreshInterval == 0) { + zoneinfo->dwNoRefreshInterval = + serverinfo->dwDefaultNoRefreshInterval; + } + } + + /* + * If any value is still 0 we disable aging + */ + if (zoneinfo->dwRefreshInterval == 0) { + zoneinfo->fAging = 0; + } + if (zoneinfo->dwNoRefreshInterval == 0) { + zoneinfo->fAging = 0; + } + return zoneinfo; } -- 2.43.0 From 62ff94fef94e4c3395cbe723bf0250a81dd7432d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 21:42:01 +0200 Subject: [PATCH 07/10] s4:dns_server: let dns_get_zone_properties() initialize zoneinfo completely. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 9fe99c5760a1dc22a57e7bf6338a1b2244e4da6d) --- source4/dns_server/dnsserver_common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source4/dns_server/dnsserver_common.c b/source4/dns_server/dnsserver_common.c index 52475204877d..ca87666b5cfb 100644 --- a/source4/dns_server/dnsserver_common.c +++ b/source4/dns_server/dnsserver_common.c @@ -919,6 +919,8 @@ WERROR dns_get_zone_properties(struct ldb_context *samdb, struct ldb_result *res = NULL; enum ndr_err_code err; + *zoneinfo = (struct dnsserver_zoneinfo) {}; + ret = ldb_search(samdb, mem_ctx, &res, -- 2.43.0 From 0bdeb8eea7268fb0eb4e234436462ecf0a4a0db6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 22:37:20 +0200 Subject: [PATCH 08/10] s4:dns_server: move rpc_server/dnsserver/dnsutils.c to dns_server/dnsserver_utils.c This will avoid linking problems in the following commits. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 3f97ac62727137a2b56555a821a2f1ab5113fac2) --- .../dnsserver/dnsutils.c => dns_server/dnsserver_utils.c} | 3 +-- source4/dns_server/wscript_build | 4 ++-- source4/rpc_server/tests/rpc_dns_server_dnsutils_test.c | 2 +- source4/rpc_server/wscript_build | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) rename source4/{rpc_server/dnsserver/dnsutils.c => dns_server/dnsserver_utils.c} (99%) diff --git a/source4/rpc_server/dnsserver/dnsutils.c b/source4/dns_server/dnsserver_utils.c similarity index 99% rename from source4/rpc_server/dnsserver/dnsutils.c rename to source4/dns_server/dnsserver_utils.c index c90e1e15106a..31aa4ad1442c 100644 --- a/source4/rpc_server/dnsserver/dnsutils.c +++ b/source4/dns_server/dnsserver_utils.c @@ -20,13 +20,12 @@ */ #include "includes.h" -#include "dnsserver.h" +#include "rpc_server/dnsserver/dnsserver.h" #include "rpc_server/common/common.h" #include "dns_server/dnsserver_common.h" #include "dsdb/samdb/samdb.h" #include "lib/socket/netif.h" #include "lib/util/util_net.h" -#include "dnsserver_common.h" #undef strcasecmp diff --git a/source4/dns_server/wscript_build b/source4/dns_server/wscript_build index ab0a241b937d..104135ed12cf 100644 --- a/source4/dns_server/wscript_build +++ b/source4/dns_server/wscript_build @@ -4,8 +4,8 @@ # when samba-tool is called where the ad-dc was not built. The server-side dns # code is used in the client when we do direct LDAP modification of DNS records. bld.SAMBA_LIBRARY('dnsserver_common', - source='dnsserver_common.c', - deps='samba-util samba-errors ldbsamba clidns', + source='dnsserver_common.c dnsserver_utils.c', + deps='samba-util samba-errors ldbsamba clidns netif', private_library=True ) diff --git a/source4/rpc_server/tests/rpc_dns_server_dnsutils_test.c b/source4/rpc_server/tests/rpc_dns_server_dnsutils_test.c index 46ede51aac86..ab73bbdd2f10 100644 --- a/source4/rpc_server/tests/rpc_dns_server_dnsutils_test.c +++ b/source4/rpc_server/tests/rpc_dns_server_dnsutils_test.c @@ -40,7 +40,7 @@ #include -#include "../dnsserver/dnsutils.c" +#include "../../dns_server/dnsserver_utils.c" /* diff --git a/source4/rpc_server/wscript_build b/source4/rpc_server/wscript_build index 54a10f2ba003..d8e7a014b87e 100644 --- a/source4/rpc_server/wscript_build +++ b/source4/rpc_server/wscript_build @@ -180,7 +180,6 @@ bld.SAMBA_MODULE('dcerpc_eventlog', bld.SAMBA_MODULE('dcerpc_dnsserver', source=''' dnsserver/dcerpc_dnsserver.c - dnsserver/dnsutils.c dnsserver/dnsdata.c dnsserver/dnsdb.c ''', -- 2.43.0 From 27fd6ef4e62e5398c4f2c2ad14034873ef31bc3d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 21:47:56 +0200 Subject: [PATCH 09/10] s4:dns_server: let dns_get_zone_properties() fallback to serverinfo->dwDefault[No]RefreshInterval And disable fAging if the values are still 0. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke (cherry picked from commit 1146df4c532834481a67cbcf5c7bc8142dfe9875) --- source4/dns_server/dnsserver_common.c | 33 ++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/source4/dns_server/dnsserver_common.c b/source4/dns_server/dnsserver_common.c index ca87666b5cfb..bf22ebf28311 100644 --- a/source4/dns_server/dnsserver_common.c +++ b/source4/dns_server/dnsserver_common.c @@ -911,7 +911,10 @@ WERROR dns_get_zone_properties(struct ldb_context *samdb, struct ldb_dn *zone_dn, struct dnsserver_zoneinfo *zoneinfo) { - + struct loadparm_context *lp_ctx = + talloc_get_type_abort(ldb_get_opaque(samdb, "loadparm"), + struct loadparm_context); + struct dnsserver_serverinfo *serverinfo = NULL; int ret, i; struct dnsp_DnsProperty *prop = NULL; struct ldb_message_element *element = NULL; @@ -921,6 +924,12 @@ WERROR dns_get_zone_properties(struct ldb_context *samdb, *zoneinfo = (struct dnsserver_zoneinfo) {}; + serverinfo = dnsserver_init_serverinfo(mem_ctx, lp_ctx, samdb); + if (serverinfo == NULL) { + DBG_ERR("dnsserver_init_serverinfo() failed\n"); + return DNS_ERR(SERVER_FAILURE); + } + ret = ldb_search(samdb, mem_ctx, &res, @@ -968,6 +977,28 @@ WERROR dns_get_zone_properties(struct ldb_context *samdb, } } + /* + * Fallback to the defaults + */ + if (zoneinfo->dwRefreshInterval == 0) { + zoneinfo->dwRefreshInterval = + serverinfo->dwDefaultRefreshInterval; + } + if (zoneinfo->dwNoRefreshInterval == 0) { + zoneinfo->dwNoRefreshInterval = + serverinfo->dwDefaultNoRefreshInterval; + } + + /* + * If any value is still 0 we disable aging + */ + if (zoneinfo->dwRefreshInterval == 0) { + zoneinfo->fAging = 0; + } + if (zoneinfo->dwNoRefreshInterval == 0) { + zoneinfo->fAging = 0; + } + return WERR_OK; } -- 2.43.0 From af6738b08aa043a8b0003ae649da6a85efe46d51 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 19 Aug 2026 23:34:53 +0200 Subject: [PATCH 10/10] s4:kcc: let dns_tombstone_records_zone() skip if fAging is not 1 This means we only do scavenging if the dw[No]RefreshInterval related logic in dns_common_replace() is triggered and dwTimeStamp has a chance to be updated before. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16223 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke Autobuild-User(master): Stefan Metzmacher Autobuild-Date(master): Tue Aug 25 12:14:04 UTC 2026 on atb-devel-224 (cherry picked from commit 2cf29c3c95aa4c6bdd645e34fdf521f9bcb91538) --- source4/dsdb/kcc/scavenge_dns_records.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source4/dsdb/kcc/scavenge_dns_records.c b/source4/dsdb/kcc/scavenge_dns_records.c index 0a5016fa62bc..3882cb566553 100644 --- a/source4/dsdb/kcc/scavenge_dns_records.c +++ b/source4/dsdb/kcc/scavenge_dns_records.c @@ -143,6 +143,22 @@ static NTSTATUS dns_tombstone_records_zone(TALLOC_CTX *mem_ctx, return NT_STATUS_INTERNAL_ERROR; } + if (zi->fAging != 1) { + /* + * Don't do scavenging if aging is not enabled + * zi->dwNoRefreshInterval + zi->dwRefreshInterval + * might be zero... + */ + DBG_INFO("ZONE[%s] fAging=%"PRIu32" " + "dwNoRefreshInterval=%"PRIu32" " + "dwRefreshInterval=%"PRIu32" - skipping\n", + zone->name, + zi->fAging, + zi->dwNoRefreshInterval, + zi->dwRefreshInterval); + return NT_STATUS_PROPSET_NOT_FOUND; + } + /* Subtract them from current time to get the earliest possible. * timestamp allowed for a non-expired DNS record. */ dns_timestamp -= zi->dwNoRefreshInterval + zi->dwRefreshInterval; -- 2.43.0