1 From: NIIBE Yutaka <gniibe@fsij.org>
2 Date: Thu, 13 Apr 2017 14:33:33 +0900
3 Subject: dirmngr: Fix alignment of ADDR.
5 * dirmngr/dns-stuff.h (dns_addrinfo_s): Use struct sockaddr_storage
6 for size and alignment.
7 * dirmngr/dns-stuff.c (resolve_name_libdns): Follow the change.
8 (resolve_dns_name): Use struct sockaddr_storage.
9 (resolve_addr_standard, resolve_dns_addr): Likewise.
10 (resolve_dns_addr): Likewise.
12 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
13 (cherry picked from commit 892b33bb2c57785927ea6652091191da2deed464)
15 dirmngr/dns-stuff.c | 31 +++++++++++++++++--------------
16 dirmngr/dns-stuff.h | 4 ++--
17 2 files changed, 19 insertions(+), 16 deletions(-)
19 diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c
20 index ed77742..c63d958 100644
21 --- a/dirmngr/dns-stuff.c
22 +++ b/dirmngr/dns-stuff.c
23 @@ -827,7 +827,7 @@ resolve_name_libdns (const char *name, unsigned short port,
24 (*r_canonname)[strlen (*r_canonname)-1] = 0;
27 - dai = xtrymalloc (sizeof *dai + ent->ai_addrlen -1);
28 + dai = xtrymalloc (sizeof *dai);
31 err = gpg_error_from_syserror ();
32 @@ -950,7 +950,7 @@ resolve_name_standard (const char *name, unsigned short port,
33 if (opt_disable_ipv6 && ai->ai_family == AF_INET6)
36 - dai = xtrymalloc (sizeof *dai + ai->ai_addrlen - 1);
37 + dai = xtrymalloc (sizeof *dai);
38 dai->family = ai->ai_family;
39 dai->socktype = ai->ai_socktype;
40 dai->protocol = ai->ai_protocol;
41 @@ -1018,7 +1018,7 @@ resolve_dns_name (const char *name, unsigned short port,
43 /* Resolve an address using libdns. */
45 -resolve_addr_libdns (const struct sockaddr *addr, int addrlen,
46 +resolve_addr_libdns (const struct sockaddr_storage *addr, int addrlen,
47 unsigned int flags, char **r_name)
50 @@ -1032,13 +1032,13 @@ resolve_addr_libdns (const struct sockaddr *addr, int addrlen,
52 /* First we turn ADDR into a DNS name (with ".arpa" suffix). */
54 - if (addr->sa_family == AF_INET6)
55 + if (addr->ss_family == AF_INET6)
57 const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)addr;
58 if (!dns_aaaa_arpa (host, sizeof host, (void*)&a6->sin6_addr))
59 err = gpg_error (GPG_ERR_INV_OBJ);
61 - else if (addr->sa_family == AF_INET)
62 + else if (addr->ss_family == AF_INET)
64 const struct sockaddr_in *a4 = (const struct sockaddr_in *)addr;
65 if (!dns_a_arpa (host, sizeof host, (void*)&a4->sin_addr))
66 @@ -1126,18 +1126,19 @@ resolve_addr_libdns (const struct sockaddr *addr, int addrlen,
67 buflen = sizeof ptr.host;
70 - if (addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
71 + if (addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
76 - ec = getnameinfo (addr, addrlen, p, buflen, NULL, 0, NI_NUMERICHOST);
77 + ec = getnameinfo ((const struct sockaddr *)addr,
78 + addrlen, p, buflen, NULL, 0, NI_NUMERICHOST);
81 err = map_eai_to_gpg_error (ec);
84 - if (addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
85 + if (addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
89 @@ -1151,7 +1152,7 @@ resolve_addr_libdns (const struct sockaddr *addr, int addrlen,
91 /* Resolve an address using the standard system function. */
93 -resolve_addr_standard (const struct sockaddr *addr, int addrlen,
94 +resolve_addr_standard (const struct sockaddr_storage *addr, int addrlen,
95 unsigned int flags, char **r_name)
98 @@ -1169,20 +1170,22 @@ resolve_addr_standard (const struct sockaddr *addr, int addrlen,
99 if ((flags & DNS_NUMERICHOST) || tor_mode)
102 - ec = getnameinfo (addr, addrlen, buffer, buflen, NULL, 0, NI_NAMEREQD);
103 + ec = getnameinfo ((const struct sockaddr *)addr,
104 + addrlen, buffer, buflen, NULL, 0, NI_NAMEREQD);
106 if (!ec && *buffer == '[')
107 ec = EAI_FAIL; /* A name may never start with a bracket. */
108 else if (ec == EAI_NONAME)
111 - if (addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
112 + if (addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
117 - ec = getnameinfo (addr, addrlen, p, buflen, NULL, 0, NI_NUMERICHOST);
118 - if (!ec && addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
119 + ec = getnameinfo ((const struct sockaddr *)addr,
120 + addrlen, p, buflen, NULL, 0, NI_NUMERICHOST);
121 + if (!ec && addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
122 strcat (buffer, "]");
125 @@ -1211,7 +1214,7 @@ resolve_addr_standard (const struct sockaddr *addr, int addrlen,
127 /* A wrapper around getnameinfo. */
129 -resolve_dns_addr (const struct sockaddr *addr, int addrlen,
130 +resolve_dns_addr (const struct sockaddr_storage *addr, int addrlen,
131 unsigned int flags, char **r_name)
134 diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h
135 index 71605b7..adb0b80 100644
136 --- a/dirmngr/dns-stuff.h
137 +++ b/dirmngr/dns-stuff.h
138 @@ -78,7 +78,7 @@ struct dns_addrinfo_s
142 - struct sockaddr addr[1];
143 + struct sockaddr_storage addr[1];
147 @@ -142,7 +142,7 @@ gpg_error_t resolve_dns_name (const char *name, unsigned short port,
148 dns_addrinfo_t *r_dai, char **r_canonname);
150 /* Function similar to getnameinfo. */
151 -gpg_error_t resolve_dns_addr (const struct sockaddr *addr, int addrlen,
152 +gpg_error_t resolve_dns_addr (const struct sockaddr_storage *addr, int addrlen,
153 unsigned int flags, char **r_name);
155 /* Return true if NAME is a numerical IP address. */