summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2018-10-04 11:57:29 +0200
committerDaniel Stenberg <daniel@haxx.se>2018-10-05 08:54:57 +0200
commit3df2f2ebc27f2b9f0dc81cbbd491082272b6ca46 (patch)
tree73959116231f7fe368cb6ee300a39a65dbff2cb9
parent8f2bb0e3779a7a6fe20ce4b892569d7565e6ac08 (diff)
downloadcurl-3df2f2ebc27f2b9f0dc81cbbd491082272b6ca46.tar.gz
doh: keep the IPv4 address in (original) network byte order
Ideally this will fix the reversed order shown in SPARC tests: resp 8: Expected 127.0.0.1 got 1.0.0.127
-rw-r--r--lib/doh.c19
-rw-r--r--lib/doh.h8
-rw-r--r--tests/unit/unit1650.c16
3 files changed, 19 insertions, 24 deletions
diff --git a/lib/doh.c b/lib/doh.c
index 178e474aa..019ac789c 100644
--- a/lib/doh.c
+++ b/lib/doh.c
@@ -358,7 +358,7 @@ static DOHcode store_a(unsigned char *doh, int index, struct dohentry *d)
if(d->numaddr < DOH_MAX_ADDR) {
struct dohaddr *a = &d->addr[d->numaddr];
a->type = DNS_TYPE_A;
- a->ip.v4 = ntohl(get32bit(doh, index));
+ memcpy(&a->ip.v4, &doh[index], 4);
d->numaddr++;
}
return DOH_OK;
@@ -369,9 +369,8 @@ static DOHcode store_aaaa(unsigned char *doh, int index, struct dohentry *d)
/* silently ignore addresses over the limit */
if(d->numaddr < DOH_MAX_ADDR) {
struct dohaddr *a = &d->addr[d->numaddr];
- struct addr6 *inet6p = &a->ip.v6;
a->type = DNS_TYPE_AAAA;
- memcpy(inet6p, &doh[index], 16);
+ memcpy(&a->ip.v6, &doh[index], 16);
d->numaddr++;
}
return DOH_OK;
@@ -649,9 +648,9 @@ static void showdoh(struct Curl_easy *data,
for(i = 0; i < d->numaddr; i++) {
struct dohaddr *a = &d->addr[i];
if(a->type == DNS_TYPE_A) {
- infof(data, "DOH A: %d.%d.%d.%d\n",
- a->ip.v4 & 0xff, (a->ip.v4>>8) & 0xff,
- (a->ip.v4>>16) & 0xff, a->ip.v4 >>24);
+ infof(data, "DOH A: %u.%u.%u.%u\n",
+ a->ip.v4[0], a->ip.v4[1],
+ a->ip.v4[2], a->ip.v4[3]);
}
else if(a->type == DNS_TYPE_AAAA) {
int j;
@@ -663,8 +662,8 @@ static void showdoh(struct Curl_easy *data,
len = 118;
for(j = 0; j < 16; j += 2) {
size_t l;
- snprintf(ptr, len, "%s%02x%02x", j?":":"", d->addr[i].ip.v6.byte[j],
- d->addr[i].ip.v6.byte[j + 1]);
+ snprintf(ptr, len, "%s%02x%02x", j?":":"", d->addr[i].ip.v6[j],
+ d->addr[i].ip.v6[j + 1]);
l = strlen(ptr);
len -= l;
ptr += l;
@@ -764,7 +763,7 @@ doh2ai(const struct dohentry *de, const char *hostname, int port)
switch(ai->ai_family) {
case AF_INET:
addr = (void *)ai->ai_addr; /* storage area for this info */
-
+ DEBUGASSERT(sizeof(struct in_addr) == sizeof(de->addr[i].ip.v4));
memcpy(&addr->sin_addr, &de->addr[i].ip.v4, sizeof(struct in_addr));
addr->sin_family = (CURL_SA_FAMILY_T)addrtype;
addr->sin_port = htons((unsigned short)port);
@@ -773,7 +772,7 @@ doh2ai(const struct dohentry *de, const char *hostname, int port)
#ifdef ENABLE_IPV6
case AF_INET6:
addr6 = (void *)ai->ai_addr; /* storage area for this info */
-
+ DEBUGASSERT(sizeof(struct in6_addr) == sizeof(de->addr[i].ip.v6));
memcpy(&addr6->sin6_addr, &de->addr[i].ip.v6, sizeof(struct in6_addr));
addr6->sin6_family = (CURL_SA_FAMILY_T)addrtype;
addr6->sin6_port = htons((unsigned short)port);
diff --git a/lib/doh.h b/lib/doh.h
index 96c1fa7c1..5f879e50e 100644
--- a/lib/doh.h
+++ b/lib/doh.h
@@ -67,10 +67,6 @@ typedef enum {
#define DOH_MAX_ADDR 24
#define DOH_MAX_CNAME 4
-struct addr6 {
- unsigned char byte[16];
-};
-
struct cnamestore {
size_t len; /* length of cname */
char *alloc; /* allocated pointer */
@@ -80,8 +76,8 @@ struct cnamestore {
struct dohaddr {
int type;
union {
- unsigned int v4;
- struct addr6 v6;
+ unsigned char v4[4]; /* network byte order */
+ unsigned char v6[16];
} ip;
};
diff --git a/tests/unit/unit1650.c b/tests/unit/unit1650.c
index 05024f9b2..c4a72b063 100644
--- a/tests/unit/unit1650.c
+++ b/tests/unit/unit1650.c
@@ -198,9 +198,8 @@ UNITTEST_START
struct dohaddr *a;
a = &d.addr[u];
if(resp[i].type == DNS_TYPE_A) {
- snprintf(ptr, len, "%d.%d.%d.%d ",
- a->ip.v4 & 0xff, (a->ip.v4>>8) & 0xff,
- (a->ip.v4>>16) & 0xff, a->ip.v4 >>24);
+ char *p = (char *)&a->ip.v4;
+ snprintf(ptr, len, "%u.%u.%u.%u ", p[0], p[1], p[2], p[3]);
o = strlen(ptr);
len -= o;
ptr += o;
@@ -209,8 +208,8 @@ UNITTEST_START
int j;
for(j = 0; j < 16; j += 2) {
size_t l;
- snprintf(ptr, len, "%s%02x%02x", j?":":"", a->ip.v6.byte[j],
- a->ip.v6.byte[j + 1]);
+ snprintf(ptr, len, "%s%02x%02x", j?":":"", a->ip.v6[j],
+ a->ip.v6[j + 1]);
l = strlen(ptr);
len -= l;
ptr += l;
@@ -265,14 +264,15 @@ UNITTEST_START
int rc;
struct dohentry d;
struct dohaddr *a;
+ char *p;
memset(&d, 0, sizeof(d));
rc = doh_decode((unsigned char *)full49, sizeof(full49)-1,
DNS_TYPE_A, &d);
fail_if(d.numaddr != 1, "missing address");
a = &d.addr[0];
- snprintf((char *)buffer, sizeof(buffer), "%d.%d.%d.%d",
- a->ip.v4 & 0xff, (a->ip.v4>>8) & 0xff,
- (a->ip.v4>>16) & 0xff, a->ip.v4 >>24);
+ p = (char *)&a->ip.v4;
+ snprintf((char *)buffer, sizeof(buffer),
+ "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
if(rc || strcmp((char *)buffer, "127.0.0.1")) {
fprintf(stderr, "bad address decoded: %s, rc == %d\n", buffer, rc);
return 7;