On Tue, Nov 01, 2022 at 02:45:58PM +0000, Job Snijders wrote:
> It can be useful to see a little bit more detail on what exactly isn't
> working.
> 
> OK?
> 
> Index: http.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/http.c,v
> retrieving revision 1.70
> diff -u -p -r1.70 http.c
> --- http.c    18 Oct 2022 14:03:39 -0000      1.70
> +++ http.c    1 Nov 2022 14:36:44 -0000
> @@ -210,6 +210,21 @@ http_info(const char *uri)
>  }
>  
>  /*
> + * Return IP address in presentation format.
> + */
> +static const char *
> +ip_info(const struct http_connection *conn)
> +{
> +     static char     buf[NI_MAXHOST];
> +
> +     if (getnameinfo(conn->res0->ai_addr, conn->res0->ai_addrlen,
> +         buf, sizeof(buf), NULL, 0, NI_NUMERICHOST))

This can not be right. conn->res is the address which was use by the last
connect call. Also conn->res / conn->res0 are only valid in STATE_CONNECT.
In http_connect_done() conn->res0 is freed and both res and res0 are set
to NULL.

> +             return ("unknown");
> +
> +     return buf;
> +}
> +
> +/*
>   * Determine whether the character needs encoding, per RFC2396.
>   */
>  static int
> @@ -870,7 +885,8 @@ http_connect(struct http_connection *con
>  
>       if (conn->fd == -1) {
>               if (cause != NULL)
> -                     warn("%s: %s", http_info(conn->req->uri), cause);
> +                     warn("%s (%s): %s", http_info(conn->req->uri),
> +                         ip_info(conn), cause);
>               return http_failed(conn);
>       }
>  
> @@ -1930,12 +1946,14 @@ proc_http(char *bind_addr, int fd)
>                               http_do(conn, http_handle);
>                       else if (conn->io_time <= now) {
>                               if (conn->state == STATE_CONNECT) {
> -                                     warnx("%s: connect timeout",
> -                                         http_info(conn->host));
> +                                     warnx("%s (%s): connect timeout",
> +                                         http_info(conn->host),
> +                                         ip_info(conn));
>                                       http_do(conn, http_connect_failed);
>                               } else {
> -                                     warnx("%s: timeout, connection closed",
> -                                         http_info(conn->host));
> +                                     warnx("%s (%s): timeout, connection "
> +                                         "closed", http_info(conn->host),
> +                                         ip_info(conn));

This will not work since conn->res is most probably not available anymore.
An option is to keep conn->res0 around and not free it in
http_connect_done().

>                                       http_do(conn, http_failed);
>                               }
>                       }
> 

-- 
:wq Claudio

Reply via email to