[PATCH v2 1/3] net: lwip: wget: fix error handling in wget_do_request()
Ilias Apalodimas
ilias.apalodimas at linaro.org
Wed May 13 09:58:02 CEST 2026
Hi David,
On Wed, 13 May 2026 at 00:48, David Lechner <dlechner at baylibre.com> wrote:
>
> Split wget_do_request() into two functions to make error handling less
> error-prone.
>
> After a successful call to net_lwip_new_netif(), net_lwip_remove_netif()
> must always be called to leaks.
prevent leaks*
> This was missed in the HTTPS section of
> the code where we returned on error without cleaning up.
I'd prefer making this a bit more explicit. net_lwip_remove_netif()
was called in case of a failure afaict. The only place that wasn's
called is when checking the cacert_auth_mode, right?
Anyway, I think Jerome can fix them up during the PR
Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Thanks
/Ilias
>
> Instead of adding more calls to net_lwip_remove_netif(), refactor the
> code into two functions. The outer function handles managing the netif
> lifecycle. The inner function no longer has to worry about cleaning up
> before returning on error.
>
> To keep things simple, the `path` local variable is removed during the
> refactoring. Instead, ctx.path is used directly everywhere.
>
> Fixes: 3c656c928bd7 ("net: lwip: add wget command")
> Signed-off-by: David Lechner <dlechner at baylibre.com>
> ---
> net/lwip/wget.c | 88 ++++++++++++++++++++++++++++++---------------------------
> 1 file changed, 47 insertions(+), 41 deletions(-)
>
> diff --git a/net/lwip/wget.c b/net/lwip/wget.c
> index 502c0faebb2..f89a6580b41 100644
> --- a/net/lwip/wget.c
> +++ b/net/lwip/wget.c
> @@ -292,45 +292,17 @@ static err_t httpc_headers_done_cb(httpc_state_t *connection, void *arg, struct
> #if CONFIG_IS_ENABLED(WGET_CACERT)
> #endif
>
> -int wget_do_request(ulong dst_addr, char *uri)
> +static int wget_handle_request(struct wget_ctx *ctx, bool is_https,
> + struct udevice *udev, struct netif *netif)
> {
> #if CONFIG_IS_ENABLED(WGET_HTTPS)
> altcp_allocator_t tls_allocator;
> #endif
> httpc_connection_t conn;
> httpc_state_t *state;
> - struct udevice *udev;
> - struct netif *netif;
> - struct wget_ctx ctx;
> - char *path;
> - bool is_https;
> -
> - ctx.daddr = dst_addr;
> - ctx.saved_daddr = dst_addr;
> - ctx.done = NOT_DONE;
> - ctx.size = 0;
> - ctx.prevsize = 0;
> - ctx.start_time = 0;
> - ctx.content_len = 0;
> - ctx.hash_count = 0;
> -
> - if (parse_url(uri, ctx.server_name, &ctx.port, &path, &is_https))
> - return CMD_RET_USAGE;
> -
> - if (net_lwip_eth_start() < 0)
> - return CMD_RET_FAILURE;
> -
> - if (!wget_info)
> - wget_info = &default_wget_info;
> -
> - udev = eth_get_dev();
> -
> - netif = net_lwip_new_netif(udev);
> - if (!netif)
> - return -1;
>
> /* if URL with hostname init dns */
> - if (!ipaddr_aton(ctx.server_name, NULL) && net_lwip_dns_init())
> + if (!ipaddr_aton(ctx->server_name, NULL) && net_lwip_dns_init())
> return CMD_RET_FAILURE;
>
> memset(&conn, 0, sizeof(conn));
> @@ -374,11 +346,10 @@ int wget_do_request(ulong dst_addr, char *uri)
> tls_allocator.alloc = &altcp_tls_alloc;
> tls_allocator.arg =
> altcp_tls_create_config_client(ca, ca_sz,
> - ctx.server_name);
> + ctx->server_name);
>
> if (!tls_allocator.arg) {
> log_err("error: Cannot create a TLS connection\n");
> - net_lwip_remove_netif(netif);
> return -1;
> }
>
> @@ -388,24 +359,20 @@ int wget_do_request(ulong dst_addr, char *uri)
>
> conn.result_fn = httpc_result_cb;
> conn.headers_done_fn = httpc_headers_done_cb;
> - ctx.path = path;
> - if (httpc_get_file_dns(ctx.server_name, ctx.port, path, &conn, httpc_recv_cb,
> - &ctx, &state)) {
> - net_lwip_remove_netif(netif);
> + if (httpc_get_file_dns(ctx->server_name, ctx->port, ctx->path, &conn,
> + httpc_recv_cb, ctx, &state)) {
> return CMD_RET_FAILURE;
> }
>
> errno = 0;
>
> - while (!ctx.done) {
> + while (!ctx->done) {
> net_lwip_rx(udev, netif);
> if (ctrlc())
> break;
> }
>
> - net_lwip_remove_netif(netif);
> -
> - if (ctx.done == SUCCESS)
> + if (ctx->done == SUCCESS)
> return 0;
>
> if (errno == EPERM && !wget_info->silent)
> @@ -414,6 +381,45 @@ int wget_do_request(ulong dst_addr, char *uri)
> return -1;
> }
>
> +int wget_do_request(ulong dst_addr, char *uri)
> +{
> + struct udevice *udev;
> + struct wget_ctx ctx;
> + struct netif *netif;
> + bool is_https;
> + int ret;
> +
> + ctx.daddr = dst_addr;
> + ctx.saved_daddr = dst_addr;
> + ctx.done = NOT_DONE;
> + ctx.size = 0;
> + ctx.prevsize = 0;
> + ctx.start_time = 0;
> + ctx.content_len = 0;
> + ctx.hash_count = 0;
> +
> + if (parse_url(uri, ctx.server_name, &ctx.port, &ctx.path, &is_https))
> + return CMD_RET_USAGE;
> +
> + if (net_lwip_eth_start() < 0)
> + return CMD_RET_FAILURE;
> +
> + if (!wget_info)
> + wget_info = &default_wget_info;
> +
> + udev = eth_get_dev();
> +
> + netif = net_lwip_new_netif(udev);
> + if (!netif)
> + return -1;
> +
> + ret = wget_handle_request(&ctx, is_https, udev, netif);
> +
> + net_lwip_remove_netif(netif);
> +
> + return ret;
> +}
> +
> /**
> * wget_validate_uri() - validate the uri for wget
> *
>
> --
> 2.43.0
>
More information about the U-Boot
mailing list