diff --git a/CHANGES b/CHANGES index 81f12e37d5..bf5e9818b6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +3827. [contrib] The example DLZ driver (a version of which is + also used in the dlzexternal system test) could + use absolute names as relative. [RT #35802] + 3826. [bug] Corrected a use-after-free in isc_radix_remove(). (This function is not used in BIND, but could have caused problems in programs linking to libisc.) diff --git a/bin/tests/system/dlzexternal/driver.c b/bin/tests/system/dlzexternal/driver.c index d1c356eba8..0cd3960751 100644 --- a/bin/tests/system/dlzexternal/driver.c +++ b/bin/tests/system/dlzexternal/driver.c @@ -14,8 +14,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id$ */ - /* * This provides a very simple example of an external loadable DLZ * driver, with update support. @@ -250,7 +248,7 @@ dlz_create(const char *dlzname, unsigned int argc, char *argv[], } va_end(ap); - if (argc < 2) { + if (argc < 2 || argv[1][0] == '\0') { if (state->log != NULL) state->log(ISC_LOG_ERROR, "dlz_example: please specify a zone name"); @@ -258,11 +256,16 @@ dlz_create(const char *dlzname, unsigned int argc, char *argv[], return (ISC_R_FAILURE); } - state->zone_name = strdup(argv[1]); + /* Ensure zone name is absolute */ + state->zone_name = malloc(strlen(argv[1]) + 2); if (state->zone_name == NULL) { free(state); return (ISC_R_NOMEMORY); } + if (argv[1][strlen(argv[1]) - 1] == '.') + strcpy(state->zone_name, argv[1]); + else + sprintf(state->zone_name, "%s.", argv[1]); n = snprintf(soa_data, sizeof(soa_data), "%s hostmaster.%s 123 900 600 86400 3600", @@ -307,17 +310,21 @@ dlz_destroy(void *dbdata) { free(state); } - /* * See if we handle a given zone */ isc_result_t dlz_findzonedb(void *dbdata, const char *name) { struct dlz_example_data *state = (struct dlz_example_data *)dbdata; + char absolute[1024]; if (strcasecmp(state->zone_name, name) == 0) return (ISC_R_SUCCESS); + snprintf(absolute, sizeof(absolute), "%s.", name); + if (strcasecmp(state->zone_name, absolute) == 0) + return (ISC_R_SUCCESS); + return (ISC_R_NOTFOUND); } @@ -568,6 +575,7 @@ modrdataset(struct dlz_example_data *state, const char *name, const char *rdatastr, struct record *list) { char *full_name, *dclass, *type, *data, *ttlstr, *buf; + char absolute[1024]; isc_result_t result; #if defined(WIN32) || defined(_REENTRANT) char *saveptr = NULL; @@ -605,6 +613,11 @@ modrdataset(struct dlz_example_data *state, const char *name, if (data == NULL) goto error; + if (name[strlen(name) - 1] != '.') { + snprintf(absolute, sizeof(absolute), "%s.", name); + name = absolute; + } + result = add_name(state, list, name, type, strtoul(ttlstr, NULL, 10), data); free(buf); @@ -648,7 +661,6 @@ dlz_subrdataset(const char *name, const char *rdatastr, return (modrdataset(state, name, rdatastr, &state->deletes[0])); } - isc_result_t dlz_delrdataset(const char *name, const char *type, void *dbdata, void *version) diff --git a/contrib/dlz/example/dlz_example.c b/contrib/dlz/example/dlz_example.c index 0ebc18e27d..2b2359d5ce 100644 --- a/contrib/dlz/example/dlz_example.c +++ b/contrib/dlz/example/dlz_example.c @@ -14,8 +14,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id$ */ - /* * This provides a very simple example of an external loadable DLZ * driver, with update support. @@ -239,7 +237,7 @@ dlz_create(const char *dlzname, unsigned int argc, char *argv[], } va_end(ap); - if (argc < 2) { + if (argc < 2 || argv[1][0] == '\0') { if (state->log != NULL) state->log(ISC_LOG_ERROR, "dlz_example: please specify a zone name"); @@ -247,11 +245,16 @@ dlz_create(const char *dlzname, unsigned int argc, char *argv[], return (ISC_R_FAILURE); } - state->zone_name = strdup(argv[1]); + /* Ensure zone name is absolute */ + state->zone_name = malloc(strlen(argv[1]) + 2); if (state->zone_name == NULL) { free(state); return (ISC_R_NOMEMORY); } + if (argv[1][strlen(argv[1]) - 1] == '.') + strcpy(state->zone_name, argv[1]); + else + sprintf(state->zone_name, "%s.", argv[1]); if (strcmp(state->zone_name, ".") == 0) extra = ".root"; @@ -301,17 +304,21 @@ dlz_destroy(void *dbdata) { free(state); } - /* * See if we handle a given zone */ isc_result_t dlz_findzonedb(void *dbdata, const char *name) { struct dlz_example_data *state = (struct dlz_example_data *)dbdata; + char absolute[1024]; if (strcasecmp(state->zone_name, name) == 0) return (ISC_R_SUCCESS); + snprintf(absolute, sizeof(absolute), "%s.", name); + if (strcasecmp(state->zone_name, absolute) == 0) + return (ISC_R_SUCCESS); + return (ISC_R_NOTFOUND); } @@ -565,6 +572,7 @@ modrdataset(struct dlz_example_data *state, const char *name, const char *rdatastr, struct record *list) { char *full_name, *dclass, *type, *data, *ttlstr, *buf; + char absolute[1024]; isc_result_t result; #if defined(WIN32) || defined(_REENTRANT) char *saveptr = NULL; @@ -602,6 +610,11 @@ modrdataset(struct dlz_example_data *state, const char *name, if (data == NULL) goto error; + if (name[strlen(name) - 1] != '.') { + snprintf(absolute, sizeof(absolute), "%s.", name); + name = absolute; + } + result = add_name(state, list, name, type, strtoul(ttlstr, NULL, 10), data); free(buf); @@ -645,7 +658,6 @@ dlz_subrdataset(const char *name, const char *rdatastr, return (modrdataset(state, name, rdatastr, &state->deletes[0])); } - isc_result_t dlz_delrdataset(const char *name, const char *type, void *dbdata, void *version)