mirror of https://github.com/getdnsapi/getdns.git
Attempt to address issue #46
This commit is contained in:
parent
af5e716d6d
commit
4c0e13ac76
|
@ -31,6 +31,9 @@ uninstall:
|
|||
doc:
|
||||
cd doc && $(MAKE) $@
|
||||
|
||||
example:
|
||||
cd src && $(MAKE) $@
|
||||
|
||||
test:
|
||||
cd src && $(MAKE) $@
|
||||
|
||||
|
|
|
@ -341,6 +341,11 @@ getdns_general(struct getdns_context *context,
|
|||
return GETDNS_RETURN_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
extcheck = validate_dname(name);
|
||||
if (extcheck != GETDNS_RETURN_GOOD) {
|
||||
return extcheck;
|
||||
}
|
||||
|
||||
extcheck = validate_extensions(extensions);
|
||||
if (extcheck != GETDNS_RETURN_GOOD)
|
||||
return extcheck;
|
||||
|
|
|
@ -71,6 +71,11 @@ getdns_general_sync(struct getdns_context *context,
|
|||
getdns_return_t response_status;
|
||||
RETURN_IF_NULL(context, GETDNS_RETURN_BAD_CONTEXT);
|
||||
RETURN_IF_NULL(response, GETDNS_RETURN_INVALID_PARAMETER);
|
||||
RETURN_IF_NULL(name, GETDNS_RETURN_INVALID_PARAMETER);
|
||||
response_status = validate_dname(name);
|
||||
if (response_status != GETDNS_RETURN_GOOD) {
|
||||
return response_status;
|
||||
}
|
||||
response_status = validate_extensions(extensions);
|
||||
if (response_status == GETDNS_RETURN_GOOD) {
|
||||
response_status = getdns_general_ub(context->unbound_sync,
|
||||
|
|
|
@ -677,4 +677,49 @@ validate_extensions(struct getdns_dict * extensions)
|
|||
return GETDNS_RETURN_GOOD;
|
||||
} /* validate_extensions */
|
||||
|
||||
getdns_return_t
|
||||
validate_dname(const char* dname) {
|
||||
int len;
|
||||
int label_len;
|
||||
const char* s;
|
||||
if (dname == NULL) {
|
||||
return GETDNS_RETURN_INVALID_PARAMETER;
|
||||
}
|
||||
len = strlen(dname);
|
||||
if (len >= GETDNS_MAX_DNAME_LEN || len == 0) {
|
||||
return GETDNS_RETURN_BAD_DOMAIN_NAME;
|
||||
}
|
||||
if (len == 1 && dname[0] == '.') {
|
||||
/* root is ok */
|
||||
return GETDNS_RETURN_GOOD;
|
||||
}
|
||||
label_len = 0;
|
||||
for (s = dname; *s; ++s) {
|
||||
switch (*s) {
|
||||
case '.':
|
||||
if (label_len > GETDNS_MAX_LABEL_LEN ||
|
||||
label_len == 0) {
|
||||
return GETDNS_RETURN_BAD_DOMAIN_NAME;
|
||||
}
|
||||
label_len = 0;
|
||||
break;
|
||||
default:
|
||||
if ((*s >= 'a' && *s <= 'z') ||
|
||||
(*s >= 'A' && *s <= 'Z') ||
|
||||
(*s >= '0' && *s <= '9')) {
|
||||
label_len++;
|
||||
} else if (*s == '-' && label_len != 0) {
|
||||
label_len++;
|
||||
} else {
|
||||
return GETDNS_RETURN_BAD_DOMAIN_NAME;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (label_len > GETDNS_MAX_LABEL_LEN) {
|
||||
return GETDNS_RETURN_BAD_DOMAIN_NAME;
|
||||
}
|
||||
return GETDNS_RETURN_GOOD;
|
||||
}
|
||||
|
||||
/* util-internal.c */
|
||||
|
|
|
@ -41,6 +41,9 @@
|
|||
#include <ldns/ldns.h>
|
||||
#include "context.h"
|
||||
|
||||
#define GETDNS_MAX_DNAME_LEN 255
|
||||
#define GETDNS_MAX_LABEL_LEN 63
|
||||
|
||||
/**
|
||||
* add an item to the tail of a list - note that this was not in the getdns API
|
||||
* description but the list_set functions seem to be designed to modify an existing
|
||||
|
@ -96,6 +99,8 @@ getdns_return_t getdns_dict_util_get_string(struct getdns_dict * dict, char *nam
|
|||
char **result);
|
||||
char *reverse_address(struct getdns_bindata *address_data);
|
||||
|
||||
getdns_return_t validate_dname(const char* dname);
|
||||
|
||||
/**
|
||||
* detect unrecognized extension strings or invalid extension formats
|
||||
* TODO: this could be optimized by searching a sorted list
|
||||
|
|
Loading…
Reference in New Issue