summaryrefslogtreecommitdiff
path: root/sldns/str2wire.c
diff options
context:
space:
mode:
Diffstat (limited to 'sldns/str2wire.c')
-rw-r--r--sldns/str2wire.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sldns/str2wire.c b/sldns/str2wire.c
index b4f84faf9b3b9..f84d7d6b823b9 100644
--- a/sldns/str2wire.c
+++ b/sldns/str2wire.c
@@ -1190,6 +1190,10 @@ int sldns_str2wire_b64_buf(const char* str, uint8_t* rd, size_t* len)
{
size_t sz = sldns_b64_pton_calculate_size(strlen(str));
int n;
+ if(strcmp(str, "0") == 0) {
+ *len = 0;
+ return LDNS_WIREPARSE_ERR_OK;
+ }
if(*len < sz)
return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
n = sldns_b64_pton(str, rd, *len);
@@ -1223,6 +1227,10 @@ int sldns_str2wire_hex_buf(const char* str, uint8_t* rd, size_t* len)
s++;
continue;
}
+ if(dlen == 0 && *s == '0' && *(s+1) == 0) {
+ *len = 0;
+ return LDNS_WIREPARSE_ERR_OK;
+ }
if(!isxdigit((unsigned char)*s))
return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str);
if(*len < dlen/2 + 1)
@@ -1685,12 +1693,15 @@ int sldns_str2wire_wks_buf(const char* str, uint8_t* rd, size_t* len)
struct protoent *p = getprotobyname(token);
have_proto = 1;
if(p) rd[0] = (uint8_t)p->p_proto;
+ else if(strcasecmp(token, "tcp")==0) rd[0]=6;
+ else if(strcasecmp(token, "udp")==0) rd[0]=17;
else rd[0] = (uint8_t)atoi(token);
(void)strlcpy(proto_str, token, sizeof(proto_str));
} else {
int serv_port;
struct servent *serv = getservbyname(token, proto_str);
if(serv) serv_port=(int)ntohs((uint16_t)serv->s_port);
+ else if(strcasecmp(token, "domain")==0) serv_port=53;
else {
serv_port = atoi(token);
if(serv_port == 0 && strcmp(token, "0") != 0) {