mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-11 12:10:00 -04:00
[v9_9] fix relative/absolute errors in sample DLZ module
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] (cherry picked from commit d4c735ca6b80c93634c937998c2a78f0d72999e0)
This commit is contained in:
parent
7e86c88942
commit
caf29fa0f7
3 changed files with 40 additions and 12 deletions
4
CHANGES
4
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.)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue