Attempt to address issue #46

This commit is contained in:
Neel Goyal 2014-01-27 19:32:54 -05:00
parent af5e716d6d
commit 4c0e13ac76
5 changed files with 69 additions and 6 deletions

View File

@ -31,6 +31,9 @@ uninstall:
doc:
cd doc && $(MAKE) $@
example:
cd src && $(MAKE) $@
test:
cd src && $(MAKE) $@

View File

@ -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;

View File

@ -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,

View File

@ -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 */

View File

@ -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