mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-22 11:36:21 +00:00
Add mg_dns_encode_name_s for non-NUL terminated strings
PUBLISHED_FROM=012e2939021d1b275a39632fd2982891d2c98c4e
This commit is contained in:
1 parent
cb602f178c
commit
10b11b03a8
4 files changed
+39
-20
No files matched your search
+14
-10
@@ -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) {
|
||||
|
||||
+14
-10
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user