summaryrefslogtreecommitdiff
path: root/sldns/str2wire.c
diff options
context:
space:
mode:
Diffstat (limited to 'sldns/str2wire.c')
-rw-r--r--sldns/str2wire.c54
1 files changed, 46 insertions, 8 deletions
diff --git a/sldns/str2wire.c b/sldns/str2wire.c
index fdd40e0f2238..becd6d3855c9 100644
--- a/sldns/str2wire.c
+++ b/sldns/str2wire.c
@@ -365,7 +365,8 @@ static int
sldns_rdf_type_maybe_quoted(sldns_rdf_type rdf_type)
{
return rdf_type == LDNS_RDF_TYPE_STR ||
- rdf_type == LDNS_RDF_TYPE_LONG_STR;
+ rdf_type == LDNS_RDF_TYPE_LONG_STR ||
+ rdf_type == LDNS_RDF_TYPE_UNQUOTED;
}
/** see if rdata is quoted */
@@ -1719,6 +1720,8 @@ int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len,
return sldns_str2wire_eui48_buf(str, rd, len);
case LDNS_RDF_TYPE_EUI64:
return sldns_str2wire_eui64_buf(str, rd, len);
+ case LDNS_RDF_TYPE_UNQUOTED:
+ return sldns_str2wire_unquoted_buf(str, rd, len);
case LDNS_RDF_TYPE_TAG:
return sldns_str2wire_tag_buf(str, rd, len);
case LDNS_RDF_TYPE_LONG_STR:
@@ -2554,12 +2557,42 @@ int sldns_str2wire_atma_buf(const char* str, uint8_t* rd, size_t* len)
{
const char* s = str;
size_t slen = strlen(str);
- size_t dlen = 0; /* number of hexdigits parsed */
+ size_t dlen = 0; /* number of hexdigits parsed for hex,
+ digits for E.164 */
- /* just a hex string with optional dots? */
- /* notimpl e.164 format */
if(slen > LDNS_MAX_RDFLEN*2)
return LDNS_WIREPARSE_ERR_LABEL_OVERFLOW;
+ if(*len < 1)
+ return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+ if(*s == 0) {
+ /* empty string */
+ rd[0] = 0;
+ *len = 1;
+ return LDNS_WIREPARSE_ERR_OK;
+ }
+ if(s[0] == '+') {
+ rd[0] = 1; /* E.164 format */
+ /* digits '0'..'9', with skipped dots. */
+ s++;
+ while(*s) {
+ if(isspace((unsigned char)*s) || *s == '.') {
+ s++;
+ continue;
+ }
+ if(*s < '0' || *s > '9')
+ return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX, s-str);
+ if(*len < dlen + 2)
+ return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL,
+ s-str);
+ rd[dlen+1] = *s++;
+ dlen++;
+ }
+ *len = dlen+1;
+ return LDNS_WIREPARSE_ERR_OK;
+ }
+
+ rd[0] = 0; /* AESA format */
+ /* hex, with skipped dots. */
while(*s) {
if(isspace((unsigned char)*s) || *s == '.') {
s++;
@@ -2567,17 +2600,17 @@ int sldns_str2wire_atma_buf(const char* str, uint8_t* rd, size_t* len)
}
if(!isxdigit((unsigned char)*s))
return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str);
- if(*len < dlen/2 + 1)
+ if(*len < dlen/2 + 2)
return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL,
s-str);
if((dlen&1)==0)
- rd[dlen/2] = (uint8_t)sldns_hexdigit_to_int(*s++) * 16;
- else rd[dlen/2] += sldns_hexdigit_to_int(*s++);
+ rd[dlen/2 + 1] = (uint8_t)sldns_hexdigit_to_int(*s++) * 16;
+ else rd[dlen/2 + 1] += sldns_hexdigit_to_int(*s++);
dlen++;
}
if((dlen&1)!=0)
return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str);
- *len = dlen/2;
+ *len = dlen/2 + 1;
return LDNS_WIREPARSE_ERR_OK;
}
@@ -2746,6 +2779,11 @@ int sldns_str2wire_eui64_buf(const char* str, uint8_t* rd, size_t* len)
return LDNS_WIREPARSE_ERR_OK;
}
+int sldns_str2wire_unquoted_buf(const char* str, uint8_t* rd, size_t* len)
+{
+ return sldns_str2wire_str_buf(str, rd, len);
+}
+
int sldns_str2wire_tag_buf(const char* str, uint8_t* rd, size_t* len)
{
size_t slen = strlen(str);