chg: dev: Enforce type checking for dns_dbversion_t

Originally, the dns_dbversion_t was typedef'ed to void type.  This
allowed some flexibility, but using (void *) just removes any
type-checking that C might have.  Instead of using:

    typedef void dns_dbversion_t;

use a trick to define the type to non-existing structure:

    typedef struct dns_dbversion dns_dbversion_t;

This allows the C compilers to employ the type-checking while the
structure itself doesn't have to be ever defined because the actual
'storage' is never accessed using dns_dbversion_t type.

Merge branch 'ondrej/non-void-dns_dbversion_t' into 'main'

See merge request isc-projects/bind9!9724
This commit is contained in:
Ondřej Surý 2024-11-07 07:23:02 +00:00
commit 4b47c96a89
7 changed files with 54 additions and 61 deletions

View file

@ -925,7 +925,7 @@ find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
REQUIRE(VALID_BDB(bdb));
REQUIRE(nodep == NULL || *nodep == NULL);
REQUIRE(version == NULL || version == (void *)&dummy);
REQUIRE(version == NULL || version == (dns_dbversion_t *)&dummy);
if (!dns_name_issubdomain(name, &db->origin)) {
return (DNS_R_NXDOMAIN);
@ -1142,7 +1142,7 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
bdb_rdatasetiter_t *iterator = NULL;
REQUIRE(version == NULL || version == &dummy);
REQUIRE(version == NULL || version == (dns_dbversion_t *)&dummy);
iterator = isc_mem_get(db->mctx, sizeof(bdb_rdatasetiter_t));
*iterator = (bdb_rdatasetiter_t){

View file

@ -64,7 +64,7 @@ typedef void dns_dbload_t;
typedef struct dns_dbnode dns_dbnode_t; /* this is dummy struct for proper type
checking */
typedef struct dns_dbonupdatelistener dns_dbonupdatelistener_t;
typedef void dns_dbversion_t;
typedef struct dns_dbversion dns_dbversion_t;
typedef struct dns_dlzimplementation dns_dlzimplementation_t;
typedef struct dns_dlzdb dns_dlzdb_t;
typedef ISC_LIST(dns_dlzdb_t) dns_dlzdblist_t;

View file

@ -1095,8 +1095,8 @@ setsecure(dns_db_t *db, qpz_version_t *version, dns_dbnode_t *origin) {
isc_result_t result;
dns_rdataset_init(&keyset);
result = dns_db_findrdataset(db, origin, version, dns_rdatatype_dnskey,
0, 0, &keyset, NULL);
result = dns_db_findrdataset(db, origin, (dns_dbversion_t *)version,
dns_rdatatype_dnskey, 0, 0, &keyset, NULL);
if (result == ISC_R_SUCCESS) {
result = dns_rdataset_first(&keyset);
while (result == ISC_R_SUCCESS) {
@ -1118,8 +1118,9 @@ setsecure(dns_db_t *db, qpz_version_t *version, dns_dbnode_t *origin) {
dns_rdataset_init(&nsecset);
dns_rdataset_init(&signsecset);
result = dns_db_findrdataset(db, origin, version, dns_rdatatype_nsec, 0,
0, &nsecset, &signsecset);
result = dns_db_findrdataset(db, origin, (dns_dbversion_t *)version,
dns_rdatatype_nsec, 0, 0, &nsecset,
&signsecset);
if (result == ISC_R_SUCCESS) {
if (dns_rdataset_isassociated(&signsecset)) {
hasnsec = true;
@ -1159,14 +1160,14 @@ static void
attachversion(dns_db_t *db, dns_dbversion_t *source,
dns_dbversion_t **targetp) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpz_version_t *version = source;
qpz_version_t *version = (qpz_version_t *)source;
REQUIRE(VALID_QPZONE(qpdb));
INSIST(version != NULL && version->qpdb == qpdb);
isc_refcount_increment(&version->references);
*targetp = version;
*targetp = source;
}
static isc_result_t
@ -1201,7 +1202,7 @@ newversion(dns_db_t *db, dns_dbversion_t **versionp) {
qpdb->future_version = version;
RWUNLOCK(&qpdb->lock, isc_rwlocktype_write);
*versionp = version;
*versionp = (dns_dbversion_t *)version;
return (ISC_R_SUCCESS);
}
@ -1511,7 +1512,7 @@ findrdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion,
dns_slabheader_t *header = NULL, *header_next = NULL;
dns_slabheader_t *found = NULL, *foundsig = NULL;
uint32_t serial;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
bool close_version = false;
dns_typepair_t matchtype, sigmatchtype;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
@ -2224,7 +2225,7 @@ endload(dns_db_t *db, dns_rdatacallbacks_t *callbacks) {
qpdb->attributes |= QPDB_ATTR_LOADED;
if (qpdb->origin != NULL) {
dns_dbversion_t *version = qpdb->current_version;
qpz_version_t *version = qpdb->current_version;
RWUNLOCK(&qpdb->lock, isc_rwlocktype_write);
setsecure(db, version, (dns_dbnode_t *)qpdb->origin);
} else {
@ -2263,7 +2264,7 @@ getnsec3parameters(dns_db_t *db, dns_dbversion_t *dbversion, dns_hash_t *hash,
size_t *salt_length) {
qpzonedb_t *qpdb = NULL;
isc_result_t result = ISC_R_NOTFOUND;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
qpdb = (qpzonedb_t *)db;
@ -2303,7 +2304,7 @@ static isc_result_t
getsize(dns_db_t *db, dns_dbversion_t *dbversion, uint64_t *records,
uint64_t *xfrsize) {
qpzonedb_t *qpdb = NULL;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
isc_result_t result = ISC_R_SUCCESS;
qpdb = (qpzonedb_t *)db;
@ -3311,7 +3312,7 @@ find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
search = (qpz_search_t){
.qpdb = (qpzonedb_t *)db,
.version = version,
.version = (qpz_version_t *)version,
.serial = ((qpz_version_t *)version)->serial,
.options = options,
};
@ -3798,7 +3799,7 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion,
dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *node = (qpznode_t *)dbnode;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
qpdb_rdatasetiter_t *iterator = NULL;
REQUIRE(VALID_QPZONE(qpdb));
@ -4004,7 +4005,7 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator DNS__DB_FLARG) {
qpdb_rdatasetiter_t *qrditer = (qpdb_rdatasetiter_t *)iterator;
qpzonedb_t *qpdb = (qpzonedb_t *)(qrditer->common.db);
qpznode_t *node = (qpznode_t *)qrditer->common.node;
qpz_version_t *version = qrditer->common.version;
qpz_version_t *version = (qpz_version_t *)qrditer->common.version;
dns_slabheader_t *header = NULL, *top_next = NULL;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
@ -4045,7 +4046,7 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator DNS__DB_FLARG) {
qpdb_rdatasetiter_t *qrditer = (qpdb_rdatasetiter_t *)iterator;
qpzonedb_t *qpdb = (qpzonedb_t *)(qrditer->common.db);
qpznode_t *node = (qpznode_t *)qrditer->common.node;
qpz_version_t *version = qrditer->common.version;
qpz_version_t *version = (qpz_version_t *)qrditer->common.version;
dns_slabheader_t *header = NULL, *top_next = NULL;
dns_typepair_t type, negtype;
dns_rdatatype_t rdtype;
@ -4574,7 +4575,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion,
isc_result_t result;
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *node = (qpznode_t *)dbnode;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
isc_region_t region;
dns_slabheader_t *newheader = NULL;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
@ -4697,7 +4698,7 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion,
dns_rdataset_t *newrdataset DNS__DB_FLARG) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *node = (qpznode_t *)dbnode;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
dns_fixedname_t fname;
dns_name_t *nodename = dns_fixedname_initname(&fname);
dns_slabheader_t *topheader = NULL, *topheader_prev = NULL;
@ -4887,7 +4888,7 @@ deleterdataset(dns_db_t *db, dns_dbnode_t *dbnode, dns_dbversion_t *dbversion,
dns_rdatatype_t type, dns_rdatatype_t covers DNS__DB_FLARG) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpznode_t *node = (qpznode_t *)dbnode;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
dns_fixedname_t fname;
dns_name_t *nodename = dns_fixedname_initname(&fname);
isc_result_t result;
@ -5269,7 +5270,7 @@ static void
addglue(dns_db_t *db, dns_dbversion_t *dbversion, dns_rdataset_t *rdataset,
dns_message_t *msg) {
qpzonedb_t *qpdb = (qpzonedb_t *)db;
qpz_version_t *version = dbversion;
qpz_version_t *version = (qpz_version_t *)dbversion;
qpznode_t *node = (qpznode_t *)rdataset->slab.node;
dns_gluenode_t *gluenode = NULL;

View file

@ -1021,7 +1021,7 @@ zone_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
search = (rbtdb_search_t){
.rbtdb = (dns_rbtdb_t *)db,
.rbtversion = version,
.rbtversion = (dns_rbtdb_version_t *)version,
.serial = ((dns_rbtdb_version_t *)version)->serial,
.options = options,
};
@ -1505,7 +1505,7 @@ zone_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_slabheader_t *header = NULL, *header_next = NULL;
dns_slabheader_t *found = NULL, *foundsig = NULL;
uint32_t serial;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
bool close_version = false;
dns_typepair_t matchtype, sigmatchtype;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
@ -1843,9 +1843,9 @@ endload(dns_db_t *db, dns_rdatacallbacks_t *callbacks) {
* zone key, we consider the zone secure.
*/
if (rbtdb->origin_node != NULL) {
dns_dbversion_t *version = rbtdb->current_version;
dns_rbtdb_version_t *rbtversion = rbtdb->current_version;
RWUNLOCK(&rbtdb->lock, isc_rwlocktype_write);
dns__rbtdb_setsecure(db, version,
dns__rbtdb_setsecure(db, rbtversion,
(dns_dbnode_t *)rbtdb->origin_node);
} else {
RWUNLOCK(&rbtdb->lock, isc_rwlocktype_write);
@ -1879,7 +1879,7 @@ getnsec3parameters(dns_db_t *db, dns_dbversion_t *version, dns_hash_t *hash,
size_t *salt_length) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
isc_result_t result = ISC_R_NOTFOUND;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
REQUIRE(VALID_RBTDB(rbtdb));
INSIST(rbtversion == NULL || rbtversion->rbtdb == rbtdb);
@ -1919,7 +1919,7 @@ getsize(dns_db_t *db, dns_dbversion_t *version, uint64_t *records,
uint64_t *xfrsize) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
isc_result_t result = ISC_R_SUCCESS;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
REQUIRE(VALID_RBTDB(rbtdb));
INSIST(rbtversion == NULL || rbtversion->rbtdb == rbtdb);
@ -2381,7 +2381,7 @@ static void
addglue(dns_db_t *db, dns_dbversion_t *dbversion, dns_rdataset_t *rdataset,
dns_message_t *msg) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtdb_version_t *version = dbversion;
dns_rbtdb_version_t *version = (dns_rbtdb_version_t *)dbversion;
dns_rbtnode_t *node = (dns_rbtnode_t *)rdataset->slab.node;
dns_gluenode_t *gluenode = NULL;
@ -2413,7 +2413,7 @@ addglue(dns_db_t *db, dns_dbversion_t *dbversion, dns_rdataset_t *rdataset,
ht_node);
if (gluenode == NULL) {
/* No cached glue was found in the table. Get new glue. */
gluenode = new_gluenode(db, version, node, rdataset);
gluenode = new_gluenode(db, dbversion, node, rdataset);
struct cds_lfht_node *ht_node = cds_lfht_add_unique(
version->glue_table, gluenode_hash(gluenode),

View file

@ -736,7 +736,7 @@ dns__rbtdb_newversion(dns_db_t *db, dns_dbversion_t **versionp) {
rbtdb->future_version = version;
RWUNLOCK(&rbtdb->lock, isc_rwlocktype_write);
*versionp = version;
*versionp = (dns_dbversion_t *)version;
return (ISC_R_SUCCESS);
}
@ -745,14 +745,14 @@ void
dns__rbtdb_attachversion(dns_db_t *db, dns_dbversion_t *source,
dns_dbversion_t **targetp) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtdb_version_t *rbtversion = source;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)source;
REQUIRE(VALID_RBTDB(rbtdb));
INSIST(rbtversion != NULL && rbtversion->rbtdb == rbtdb);
isc_refcount_increment(&rbtversion->references);
*targetp = rbtversion;
*targetp = source;
}
static rbtdb_changed_t *
@ -1604,8 +1604,8 @@ dns__rbtdb_setsecure(dns_db_t *db, dns_rbtdb_version_t *version,
REQUIRE(version != NULL);
dns_rdataset_init(&keyset);
result = dns_db_findrdataset(db, origin, version, dns_rdatatype_dnskey,
0, 0, &keyset, NULL);
result = dns_db_findrdataset(db, origin, (dns_dbversion_t *)version,
dns_rdatatype_dnskey, 0, 0, &keyset, NULL);
if (result == ISC_R_SUCCESS) {
result = dns_rdataset_first(&keyset);
while (result == ISC_R_SUCCESS) {
@ -1627,8 +1627,9 @@ dns__rbtdb_setsecure(dns_db_t *db, dns_rbtdb_version_t *version,
dns_rdataset_init(&nsecset);
dns_rdataset_init(&signsecset);
result = dns_db_findrdataset(db, origin, version, dns_rdatatype_nsec, 0,
0, &nsecset, &signsecset);
result = dns_db_findrdataset(db, origin, (dns_dbversion_t *)version,
dns_rdatatype_nsec, 0, 0, &nsecset,
&signsecset);
if (result == ISC_R_SUCCESS) {
if (dns_rdataset_isassociated(&signsecset)) {
hasnsec = true;
@ -2359,7 +2360,7 @@ dns__rbtdb_allrdatasets(dns_db_t *db, dns_dbnode_t *node,
dns_rdatasetiter_t **iteratorp DNS__DB_FLARG) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
rbtdb_rdatasetiter_t *iterator = NULL;
uint_fast32_t refs;
@ -3258,7 +3259,7 @@ dns__rbtdb_addrdataset(dns_db_t *db, dns_dbnode_t *node,
dns_rdataset_t *addedrdataset DNS__DB_FLARG) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
isc_region_t region;
dns_slabheader_t *newheader = NULL;
isc_result_t result;
@ -3488,7 +3489,7 @@ dns__rbtdb_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
dns_rdataset_t *newrdataset DNS__DB_FLARG) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
dns_fixedname_t fname;
dns_name_t *nodename = dns_fixedname_initname(&fname);
dns_slabheader_t *topheader = NULL, *topheader_prev = NULL;
@ -3687,18 +3688,6 @@ dns__rbtdb_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
unlock:
NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, &nlocktype);
/*
* Update the zone's secure status. If version is non-NULL
* this is deferred until dns__rbtdb_closeversion() is called.
*/
if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) {
RWLOCK(&rbtdb->lock, isc_rwlocktype_read);
version = rbtdb->current_version;
RWUNLOCK(&rbtdb->lock, isc_rwlocktype_read);
dns__rbtdb_setsecure(db, version,
(dns_dbnode_t *)rbtdb->origin_node);
}
return (result);
}
@ -3708,7 +3697,7 @@ dns__rbtdb_deleterdataset(dns_db_t *db, dns_dbnode_t *node,
dns_rdatatype_t covers DNS__DB_FLARG) {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
dns_rbtdb_version_t *rbtversion = version;
dns_rbtdb_version_t *rbtversion = (dns_rbtdb_version_t *)version;
dns_fixedname_t fname;
dns_name_t *nodename = dns_fixedname_initname(&fname);
isc_result_t result;
@ -3745,11 +3734,11 @@ dns__rbtdb_deleterdataset(dns_db_t *db, dns_dbnode_t *node,
* Update the zone's secure status. If version is non-NULL
* this is deferred until dns__rbtdb_closeversion() is called.
*/
if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) {
if (result == ISC_R_SUCCESS && rbtversion == NULL && !IS_CACHE(rbtdb)) {
RWLOCK(&rbtdb->lock, isc_rwlocktype_read);
version = rbtdb->current_version;
rbtversion = rbtdb->current_version;
RWUNLOCK(&rbtdb->lock, isc_rwlocktype_read);
dns__rbtdb_setsecure(db, version,
dns__rbtdb_setsecure(db, rbtversion,
(dns_dbnode_t *)rbtdb->origin_node);
}
@ -4150,7 +4139,8 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator DNS__DB_FLARG) {
rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator;
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db);
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)rbtiterator->common.node;
dns_rbtdb_version_t *rbtversion = rbtiterator->common.version;
dns_rbtdb_version_t *rbtversion =
(dns_rbtdb_version_t *)rbtiterator->common.version;
dns_slabheader_t *header = NULL, *top_next = NULL;
uint32_t serial = IS_CACHE(rbtdb) ? 1 : rbtversion->serial;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
@ -4198,7 +4188,8 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator DNS__DB_FLARG) {
rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator;
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db);
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)rbtiterator->common.node;
dns_rbtdb_version_t *rbtversion = rbtiterator->common.version;
dns_rbtdb_version_t *rbtversion =
(dns_rbtdb_version_t *)rbtiterator->common.version;
dns_slabheader_t *header = NULL, *top_next = NULL;
uint32_t serial = IS_CACHE(rbtdb) ? 1 : rbtversion->serial;
dns_typepair_t type, negtype;

View file

@ -336,7 +336,8 @@ newversion(dns_db_t *db, dns_dbversion_t **versionp) {
dns_name_format(&sdlz->common.origin, origin, sizeof(origin));
result = sdlz->dlzimp->methods->newversion(
origin, sdlz->dlzimp->driverarg, sdlz->dbdata, versionp);
origin, sdlz->dlzimp->driverarg, sdlz->dbdata,
(void **)versionp);
if (result != ISC_R_SUCCESS) {
sdlz_log(ISC_LOG_ERROR,
"sdlz newversion on origin %s failed : %s", origin,
@ -380,7 +381,7 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp,
sdlz->dlzimp->methods->closeversion(origin, commit,
sdlz->dlzimp->driverarg,
sdlz->dbdata, versionp);
sdlz->dbdata, (void **)versionp);
if (*versionp != NULL) {
sdlz_log(ISC_LOG_ERROR, "sdlz closeversion on origin %s failed",
origin);

View file

@ -17285,7 +17285,7 @@ restore_nsec3param(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
}
static isc_result_t
copy_non_dnssec_records(dns_db_t *db, dns_db_t *version, dns_db_t *rawdb,
copy_non_dnssec_records(dns_db_t *db, dns_dbversion_t *version, dns_db_t *rawdb,
dns_dbiterator_t *dbiterator, unsigned int *oldserial) {
dns_dbnode_t *rawnode = NULL, *node = NULL;
dns_fixedname_t fixed;