diff --git a/mongoose.c b/mongoose.c index 4dfa76d8..aebd74f8 100644 --- a/mongoose.c +++ b/mongoose.c @@ -11616,35 +11616,39 @@ int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg) { return mbuf_append(io, begin, end - begin); } -int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) { +int mg_dns_encode_name_s(struct mbuf *io, struct mg_str name) { const char *s; unsigned char n; size_t pos = io->len; do { - if ((s = strchr(name, '.')) == NULL) { - s = name + len; + if ((s = mg_strchr(name, '.')) == NULL) { + s = name.p + name.len; } - if (s - name > 127) { + if (s - name.p > 127) { return -1; /* TODO(mkm) cover */ } - n = s - name; /* chunk length */ + n = s - name.p; /* chunk length */ mbuf_append(io, &n, 1); /* send length */ - mbuf_append(io, name, n); + mbuf_append(io, name.p, n); - if (*s == '.') { + if (n < name.len && *s == '.') { n++; } - name += n; - len -= n; - } while (*s != '\0'); + name.p += n; + name.len -= n; + } while (name.len > 0); mbuf_append(io, "\0", 1); /* Mark end of host name */ return io->len - pos; } +int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) { + return mg_dns_encode_name_s(io, mg_mk_str_n(name, len)); +} + int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr, const char *name, size_t nlen, const void *rdata, size_t rlen) { diff --git a/src/mg_dns.c b/src/mg_dns.c index 21bc8c23..0db0cb70 100644 --- a/src/mg_dns.c +++ b/src/mg_dns.c @@ -85,35 +85,39 @@ int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg) { return mbuf_append(io, begin, end - begin); } -int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) { +int mg_dns_encode_name_s(struct mbuf *io, struct mg_str name) { const char *s; unsigned char n; size_t pos = io->len; do { - if ((s = strchr(name, '.')) == NULL) { - s = name + len; + if ((s = mg_strchr(name, '.')) == NULL) { + s = name.p + name.len; } - if (s - name > 127) { + if (s - name.p > 127) { return -1; /* TODO(mkm) cover */ } - n = s - name; /* chunk length */ + n = s - name.p; /* chunk length */ mbuf_append(io, &n, 1); /* send length */ - mbuf_append(io, name, n); + mbuf_append(io, name.p, n); - if (*s == '.') { + if (n < name.len && *s == '.') { n++; } - name += n; - len -= n; - } while (*s != '\0'); + name.p += n; + name.len -= n; + } while (name.len > 0); mbuf_append(io, "\0", 1); /* Mark end of host name */ return io->len - pos; } +int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) { + return mg_dns_encode_name_s(io, mg_mk_str_n(name, len)); +} + int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr, const char *name, size_t nlen, const void *rdata, size_t rlen) { diff --git a/src/mg_dns.h b/src/mg_dns.h index 8a76f58c..88d3c398 100644 --- a/src/mg_dns.h +++ b/src/mg_dns.h @@ -124,6 +124,7 @@ int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr, * Encodes a DNS name. */ int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len); +int mg_dns_encode_name_s(struct mbuf *io, struct mg_str name); /* Low-level: parses a DNS response. */ int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg); diff --git a/test/unit_test.c b/test/unit_test.c index 5eb919ca..43dd3eb7 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -4590,6 +4590,15 @@ static const char *test_dns_encode(void) { return NULL; } +static const char *test_dns_encode_name(void) { + struct mbuf mb; + mbuf_init(&mb, 0); + ASSERT_EQ(mg_dns_encode_name(&mb, "www.cesanta.com.net.org", 15), 17); + ASSERT_STREQ_NZ(mb.buf, "\x03" "www" "\x07" "cesanta" "\x03" "com"); + mbuf_free(&mb); + return NULL; +} + static const char *test_dns_uncompress(void) { /* * Order or string constants is important. Names being uncompressed @@ -5781,6 +5790,7 @@ const char *tests_run(const char *filter) { RUN_TEST(test_mqtt_broker); #endif RUN_TEST(test_dns_encode); + RUN_TEST(test_dns_encode_name); RUN_TEST(test_dns_uncompress); RUN_TEST(test_dns_decode); RUN_TEST(test_dns_decode_truncated);