mirror of
https://github.com/cesanta/mongoose.git
synced 2024-11-27 20:59:00 +08:00
Add mg_dns_encode_name_s for non-NUL terminated strings
PUBLISHED_FROM=012e2939021d1b275a39632fd2982891d2c98c4e
This commit is contained in:
parent
cb602f178c
commit
10b11b03a8
24
mongoose.c
24
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) {
|
||||
|
24
src/mg_dns.c
24
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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user