chiark / gitweb /
Import gnupg2_2.1.18-8~deb9u1.debian.tar.bz2
[gnupg2.git] / patches / 0069-dirmngr-Fix-alignment-of-ADDR.patch
1 From: NIIBE Yutaka <gniibe@fsij.org>
2 Date: Thu, 13 Apr 2017 14:33:33 +0900
3 Subject: dirmngr: Fix alignment of ADDR.
4
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.
11
12 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
13 (cherry picked from commit 892b33bb2c57785927ea6652091191da2deed464)
14 ---
15  dirmngr/dns-stuff.c | 31 +++++++++++++++++--------------
16  dirmngr/dns-stuff.h |  4 ++--
17  2 files changed, 19 insertions(+), 16 deletions(-)
18
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;
25          }
26  
27 -      dai = xtrymalloc (sizeof *dai + ent->ai_addrlen -1);
28 +      dai = xtrymalloc (sizeof *dai);
29        if (dai == NULL)
30          {
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)
34          continue;
35  
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,
42  #ifdef USE_LIBDNS
43  /* Resolve an address using libdns.  */
44  static gpg_error_t
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)
48  {
49    gpg_error_t err;
50 @@ -1032,13 +1032,13 @@ resolve_addr_libdns (const struct sockaddr *addr, int addrlen,
51  
52    /* First we turn ADDR into a DNS name (with ".arpa" suffix).  */
53    err = 0;
54 -  if (addr->sa_family == AF_INET6)
55 +  if (addr->ss_family == AF_INET6)
56      {
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);
60      }
61 -  else if (addr->sa_family == AF_INET)
62 +  else if (addr->ss_family == AF_INET)
63      {
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;
68  
69        p = buffer;
70 -      if (addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
71 +      if (addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
72          {
73            *p++ = '[';
74            buflen -= 2;
75          }
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);
79        if (ec)
80          {
81            err = map_eai_to_gpg_error (ec);
82            goto leave;
83          }
84 -      if (addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
85 +      if (addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
86          strcat (buffer, "]");
87      }
88  
89 @@ -1151,7 +1152,7 @@ resolve_addr_libdns (const struct sockaddr *addr, int addrlen,
90  
91  /* Resolve an address using the standard system function.  */
92  static gpg_error_t
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)
96  {
97    gpg_error_t err;
98 @@ -1169,20 +1170,22 @@ resolve_addr_standard (const struct sockaddr *addr, int addrlen,
99    if ((flags & DNS_NUMERICHOST) || tor_mode)
100      ec = EAI_NONAME;
101    else
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);
105  
106    if (!ec && *buffer == '[')
107      ec = EAI_FAIL;  /* A name may never start with a bracket.  */
108    else if (ec == EAI_NONAME)
109      {
110        p = buffer;
111 -      if (addr->sa_family == AF_INET6 && (flags & DNS_WITHBRACKET))
112 +      if (addr->ss_family == AF_INET6 && (flags & DNS_WITHBRACKET))
113          {
114            *p++ = '[';
115            buflen -= 2;
116          }
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, "]");
123      }
124  
125 @@ -1211,7 +1214,7 @@ resolve_addr_standard (const struct sockaddr *addr, int addrlen,
126  
127  /* A wrapper around getnameinfo.  */
128  gpg_error_t
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)
132  {
133    gpg_error_t err;
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
139    int socktype;
140    int protocol;
141    int addrlen;
142 -  struct sockaddr addr[1];
143 +  struct sockaddr_storage addr[1];
144  };
145  
146  
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);
149  
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);
154  
155  /* Return true if NAME is a numerical IP address.  */