chiark / gitweb /
Import gnupg2_2.1.18-8~deb9u1.debian.tar.bz2
[gnupg2.git] / patches / 0015-dirmngr-Simplify-error-returning-inside-http.c.patch
1 From: Werner Koch <wk@gnupg.org>
2 Date: Tue, 24 Jan 2017 18:41:43 +0100
3 Subject: dirmngr: Simplify error returning inside http.c.
4
5 * dirmngr/http.c (connect_server): Change to return an gpg_error_t
6 and to store socket at the passed address.
7 (http_raw_connect, send_request): Adjust accordingly.
8 --
9
10 This change removes cruft from the code and allows to return the error
11 code from the name lookup.
12
13 Signed-off-by: Werner Koch <wk@gnupg.org>
14 (cherry picked from commit 51e5a5e5a46279809848b4ab4419f35045336010)
15 ---
16  dirmngr/http.c | 101 ++++++++++++++++++++++++++++-----------------------------
17  1 file changed, 50 insertions(+), 51 deletions(-)
18
19 diff --git a/dirmngr/http.c b/dirmngr/http.c
20 index 35877d241..fe9c3c734 100644
21 --- a/dirmngr/http.c
22 +++ b/dirmngr/http.c
23 @@ -155,9 +155,9 @@ static gpg_error_t send_request (http_t hd, const char *httphost,
24  static char *build_rel_path (parsed_uri_t uri);
25  static gpg_error_t parse_response (http_t hd);
26  
27 -static assuan_fd_t connect_server (const char *server, unsigned short port,
28 +static gpg_error_t connect_server (const char *server, unsigned short port,
29                                     unsigned int flags, const char *srvtag,
30 -                                   int *r_host_not_found);
31 +                                   assuan_fd_t *r_sock);
32  static gpg_error_t write_server (int sock, const char *data, size_t length);
33  
34  static gpgrt_ssize_t cookie_read (void *cookie, void *buffer, size_t size);
35 @@ -924,7 +924,6 @@ http_raw_connect (http_t *r_hd, const char *server, unsigned short port,
36    gpg_error_t err = 0;
37    http_t hd;
38    cookie_t cookie;
39 -  int hnf;
40  
41    *r_hd = NULL;
42  
43 @@ -950,12 +949,9 @@ http_raw_connect (http_t *r_hd, const char *server, unsigned short port,
44    {
45      assuan_fd_t sock;
46  
47 -    sock = connect_server (server, port, hd->flags, srvtag, &hnf);
48 -    if (sock == ASSUAN_INVALID_FD)
49 +    err = connect_server (server, port, hd->flags, srvtag, &sock);
50 +    if (err)
51        {
52 -        err = gpg_err_make (default_errsource,
53 -                            (hnf? GPG_ERR_UNKNOWN_HOST
54 -                             : gpg_err_code_from_syserror ()));
55          xfree (hd);
56          return err;
57        }
58 @@ -1643,7 +1639,6 @@ send_request (http_t hd, const char *httphost, const char *auth,
59    char *proxy_authstr = NULL;
60    char *authstr = NULL;
61    int sock;
62 -  int hnf;
63  
64    if (hd->uri->use_tls && !hd->session)
65      {
66 @@ -1713,7 +1708,6 @@ send_request (http_t hd, const char *httphost, const char *auth,
67              && *http_proxy ))
68      {
69        parsed_uri_t uri;
70 -      int save_errno;
71  
72        if (proxy)
73         http_proxy = proxy;
74 @@ -1760,25 +1754,20 @@ send_request (http_t hd, const char *httphost, const char *auth,
75              }
76          }
77  
78 -      sock = connect_server (*uri->host ? uri->host : "localhost",
79 -                             uri->port ? uri->port : 80,
80 -                             hd->flags, srvtag, &hnf);
81 -      save_errno = errno;
82 +      err = connect_server (*uri->host ? uri->host : "localhost",
83 +                            uri->port ? uri->port : 80,
84 +                            hd->flags, srvtag, &sock);
85        http_release_parsed_uri (uri);
86 -      if (sock == ASSUAN_INVALID_FD)
87 -        gpg_err_set_errno (save_errno);
88      }
89    else
90      {
91 -      sock = connect_server (server, port, hd->flags, srvtag, &hnf);
92 +      err = connect_server (server, port, hd->flags, srvtag, &sock);
93      }
94  
95 -  if (sock == ASSUAN_INVALID_FD)
96 +  if (err)
97      {
98        xfree (proxy_authstr);
99 -      return gpg_err_make (default_errsource,
100 -                           (hnf? GPG_ERR_UNKNOWN_HOST
101 -                               : gpg_err_code_from_syserror ()));
102 +      return err;
103      }
104    hd->sock = my_socket_new (sock);
105    if (!hd->sock)
106 @@ -1788,7 +1777,6 @@ send_request (http_t hd, const char *httphost, const char *auth,
107      }
108  
109  
110 -
111  #if HTTP_USE_NTBTLS
112    if (hd->uri->use_tls)
113      {
114 @@ -2476,11 +2464,13 @@ my_sock_new_for_addr (struct sockaddr *addr, int type, int proto)
115  }
116  
117  
118 -/* Actually connect to a server.  Returns the file descriptor or -1 on
119 -   error.  ERRNO is set on error. */
120 -static assuan_fd_t
121 +/* Actually connect to a server.  On success 0 is returned and the
122 + * file descriptor for the socket is stored at R_SOCK; on error an
123 + * error code is returned and ASSUAN_INVALID_FD is stored at
124 + * R_SOCK.  */
125 +static gpg_error_t
126  connect_server (const char *server, unsigned short port,
127 -                unsigned int flags, const char *srvtag, int *r_host_not_found)
128 +                unsigned int flags, const char *srvtag, assuan_fd_t *r_sock)
129  {
130    gpg_error_t err;
131    assuan_fd_t sock = ASSUAN_INVALID_FD;
132 @@ -2488,11 +2478,11 @@ connect_server (const char *server, unsigned short port,
133    int hostfound = 0;
134    int anyhostaddr = 0;
135    int srv, connected;
136 -  int last_errno = 0;
137 +  gpg_error_t last_err = 0;
138    struct srventry *serverlist = NULL;
139 -  int ret;
140  
141 -  *r_host_not_found = 0;
142 +  *r_sock = ASSUAN_INVALID_FD;
143 +
144  #if defined(HAVE_W32_SYSTEM) && !defined(HTTP_NO_WSASTARTUP)
145    init_sockets ();
146  #endif /*Windows*/
147 @@ -2509,18 +2499,21 @@ connect_server (const char *server, unsigned short port,
148                                           ASSUAN_SOCK_TOR);
149        if (sock == ASSUAN_INVALID_FD)
150          {
151 -          if (errno == EHOSTUNREACH)
152 -            *r_host_not_found = 1;
153 -          log_error ("can't connect to '%s': %s\n", server, strerror (errno));
154 +          err = gpg_err_make (default_errsource,
155 +                              (errno == EHOSTUNREACH)? GPG_ERR_UNKNOWN_HOST
156 +                              : gpg_err_code_from_syserror ());
157 +          log_error ("can't connect to '%s': %s\n", server, gpg_strerror (err));
158 +          return err;
159          }
160 -      else
161 -        notify_netactivity ();
162 -      return sock;
163 +
164 +      notify_netactivity ();
165 +      *r_sock = sock;
166 +      return 0;
167  
168  #else /*!ASSUAN_SOCK_TOR*/
169  
170 -      gpg_err_set_errno (ENETUNREACH);
171 -      return -1; /* Out of core.  */
172 +      err = gpg_err_make (default_errsource, GPG_ERR_ENETUNREACH);
173 +      return ASSUAN_INVALID_FD;
174  
175  #endif /*!HASSUAN_SOCK_TOR*/
176      }
177 @@ -2533,6 +2526,7 @@ connect_server (const char *server, unsigned short port,
178          log_info ("getting '%s' SRV for '%s' failed: %s\n",
179                    srvtag, server, gpg_strerror (err));
180        /* Note that on error SRVCOUNT is zero.  */
181 +      err = 0;
182      }
183  
184    if (!serverlist)
185 @@ -2541,7 +2535,8 @@ connect_server (const char *server, unsigned short port,
186          up a fake SRV record. */
187        serverlist = xtrycalloc (1, sizeof *serverlist);
188        if (!serverlist)
189 -        return -1; /* Out of core.  */
190 +        return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
191 +
192        serverlist->port = port;
193        strncpy (serverlist->target, server, DIMof (struct srventry, target));
194        serverlist->target[DIMof (struct srventry, target)-1] = '\0';
195 @@ -2562,6 +2557,7 @@ connect_server (const char *server, unsigned short port,
196          {
197            log_info ("resolving '%s' failed: %s\n",
198                      serverlist[srv].target, gpg_strerror (err));
199 +          last_err = err;
200            continue; /* Not found - try next one. */
201          }
202        hostfound = 1;
203 @@ -2578,18 +2574,20 @@ connect_server (const char *server, unsigned short port,
204            sock = my_sock_new_for_addr (ai->addr, ai->socktype, ai->protocol);
205            if (sock == ASSUAN_INVALID_FD)
206              {
207 -              int save_errno = errno;
208 -              log_error ("error creating socket: %s\n", strerror (errno));
209 +              err = gpg_err_make (default_errsource,
210 +                                  gpg_err_code_from_syserror ());
211 +              log_error ("error creating socket: %s\n", gpg_strerror (err));
212                free_dns_addrinfo (aibuf);
213                xfree (serverlist);
214 -              errno = save_errno;
215 -              return ASSUAN_INVALID_FD;
216 +              return err;
217              }
218  
219            anyhostaddr = 1;
220 -          ret = assuan_sock_connect (sock, ai->addr, ai->addrlen);
221 -          if (ret)
222 -            last_errno = errno;
223 +          if (assuan_sock_connect (sock, ai->addr, ai->addrlen))
224 +            {
225 +              last_err = gpg_err_make (default_errsource,
226 +                                       gpg_err_code_from_syserror ());
227 +            }
228            else
229              {
230                connected = 1;
231 @@ -2616,17 +2614,18 @@ connect_server (const char *server, unsigned short port,
232                     server, (int)WSAGetLastError());
233  #else
234          log_error ("can't connect to '%s': %s\n",
235 -                   server, strerror (last_errno));
236 +                   server, gpg_strerror (last_err));
237  #endif
238          }
239 -      if (!hostfound || (hostfound && !anyhostaddr))
240 -        *r_host_not_found = 1;
241 +      err = last_err? last_err : gpg_err_make (default_errsource,
242 +                                               GPG_ERR_UNKNOWN_HOST);
243        if (sock != ASSUAN_INVALID_FD)
244         assuan_sock_close (sock);
245 -      gpg_err_set_errno (last_errno);
246 -      return ASSUAN_INVALID_FD;
247 +      return err;
248      }
249 -  return sock;
250 +
251 +  *r_sock = sock;
252 +  return 0;
253  }
254  
255