Zero sized gateways with IPSECKEY gateway_type 0

This commit is contained in:
Willem Toorop 2017-05-02 11:44:47 +02:00
parent e9183386f1
commit dbc1719206
2 changed files with 18 additions and 7 deletions

View File

@ -263,13 +263,9 @@ static getdns_return_t
ipseckey_gateway_2wire(
const getdns_bindata *value, uint8_t *rdata, uint8_t *rdf, size_t *rdf_len)
{
if (rdf - 2 < rdata)
return GETDNS_RETURN_GENERIC_ERROR;
assert(rdf - 2 >= rdata && rdf[-2] > 0);
switch (rdf[-2]) {
case 0: if (value && value->size > 0)
return GETDNS_RETURN_INVALID_PARAMETER;
break;
case 1: if (!value || value->size != 4)
return GETDNS_RETURN_INVALID_PARAMETER;
if (*rdf_len < 4) {
@ -310,7 +306,14 @@ ipseckey_gateway_dict2wire(
getdns_return_t r;
getdns_bindata *value;
if ((r = getdns_dict_get_bindata(dict, "gateway", &value)))
if (rdf - 2 < rdata)
return GETDNS_RETURN_GENERIC_ERROR;
else if (rdf[-2] == 0) {
*rdf_len = 0;
return GETDNS_RETURN_GOOD;
}
else if ((r = getdns_dict_get_bindata(dict, "gateway", &value)))
return r;
else
return ipseckey_gateway_2wire(value, rdata, rdf, rdf_len);

View File

@ -518,8 +518,16 @@ rdf_iter_find_nxt(_getdns_rdf_iter *i)
/* Empty rdata fields are only allowed in case of non-repeating
* remaining data. So only the GETDNS_RDF_BINDATA bit is set.
*
* There is one exception, the IPSECKEY has an empty special rdata
* field "gateway" when another rdata field, "gateway_type" is 0.
* In general, the special wire2dict or list functions should
* handle this case themselves, so allow for 0 sized RDF_SPECIAL
* typed rdata fields too.
*/
(i->nxt > i->pos || (i->rdd_pos->type == GETDNS_RDF_BINDATA)))
( i->nxt > i->pos
|| i->rdd_pos->type == GETDNS_RDF_BINDATA
|| i->rdd_pos->type == GETDNS_RDF_SPECIAL))
return i;
done:
i->pos = NULL;