On 11/6/24 13:04, Adriano Cordova wrote:
> Each wget request now fills the struct wget_info. Also, the
> efi bootdevice is now set conditionally to the set_bootdevice
> variable in wget_info and a buffer size check is performed if
> check_buffer_size is set.
> 
> Signed-off-by: Adriano Cordova <adria...@gmail.com>
> ---
>  net/lwip/wget.c | 39 +++++++++++++++++++++++++++++++++++++--
>  1 file changed, 37 insertions(+), 2 deletions(-)
> 
> diff --git a/net/lwip/wget.c b/net/lwip/wget.c
> index 4add520045..bc0ecfe5b7 100644
> --- a/net/lwip/wget.c
> +++ b/net/lwip/wget.c
> @@ -34,6 +34,19 @@ struct wget_ctx {
>       enum done_state done;
>  };
>  
> +static void wget_lwip_fill_info(struct pbuf *hdr, u16_t hdr_len,
> +                             struct wget_http_info *info, u32_t hdr_cont_len)
> +{
> +     if (info->headers && hdr_len < MAX_HTTP_HEADERS_SIZE)
> +             pbuf_copy_partial(hdr, (void *)info->headers, hdr_len, 0);
> +     info->hdr_cont_len = (u32)hdr_cont_len;
> +}
> +
> +static void wget_lwip_set_file_size(u32_t rx_content_len, struct 
> wget_http_info *info)
> +{
> +     info->file_size = (ulong)rx_content_len;
> +}
> +
>  static int parse_url(char *url, char *host, u16 *port, char **path)
>  {
>       char *p, *pp;
> @@ -178,6 +191,13 @@ static void httpc_result_cb(void *arg, httpc_result_t 
> httpc_result,
>       struct wget_ctx *ctx = arg;
>       ulong elapsed;
>  
> +     wget_info.status_code = (ulong)srv_res;
> +
> +     if (err == ERR_BUF) {
> +             ctx->done = FAILURE;
> +             return;
> +     }
> +
>       if (httpc_result != HTTPC_RESULT_OK) {
>               log_err("\nHTTP client error %d\n", httpc_result);
>               ctx->done = FAILURE;
> @@ -197,8 +217,11 @@ static void httpc_result_cb(void *arg, httpc_result_t 
> httpc_result,
>       printf("%u bytes transferred in %lu ms (", rx_content_len, elapsed);
>       print_size(rx_content_len / elapsed * 1000, "/s)\n");
>       printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
> -     efi_set_bootdev("Net", "", ctx->path, map_sysmem(ctx->saved_daddr, 0),
> -                     rx_content_len);
> +     if (wget_info.set_bootdev) {
> +             efi_set_bootdev("Net", "", ctx->path, 
> map_sysmem(ctx->saved_daddr, 0),
> +                             rx_content_len);
> +     }
> +     wget_lwip_set_file_size(rx_content_len, &wget_info);
>       if (env_set_hex("filesize", rx_content_len) ||
>           env_set_hex("fileaddr", ctx->saved_daddr)) {
>               log_err("Could not set filesize or fileaddr\n");
> @@ -209,6 +232,17 @@ static void httpc_result_cb(void *arg, httpc_result_t 
> httpc_result,
>       ctx->done = SUCCESS;
>  }
>  
> +static err_t httpc_headers_done_cb(httpc_state_t *connection, void *arg, 
> struct pbuf *hdr,
> +                                u16_t hdr_len, u32_t content_len)
> +{
> +     wget_lwip_fill_info(hdr, hdr_len, &wget_info, content_len);
> +
> +     if (wget_info.check_buffer_size && (ulong)content_len > 
> wget_info.buffer_size)
> +             return ERR_BUF;
> +
> +     return ERR_OK;
> +}
> +
>  static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri)
>  {
>       httpc_connection_t conn;
> @@ -233,6 +267,7 @@ static int wget_loop(struct udevice *udev, ulong 
> dst_addr, char *uri)
>  
>       memset(&conn, 0, sizeof(conn));
>       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)) {

Reviewed-by: Jerome Forissier <jerome.foriss...@linaro.org>

Thanks,
-- 
Jerome

Reply via email to