net, net-lwip: wget: suppress console output when called by EFI
Functions called from EFI applications should not do console output. Refactor the wget code to implement this requirement. The wget_http_info struct is used to hold the boolean that signifies whether the output is allowed or not. Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
@@ -141,9 +141,9 @@ https://cacerts.digicert.com/DigiCertTLSRSA4096RootG5.crt.
|
|||||||
Bytes transferred = 1864 (748 hex)
|
Bytes transferred = 1864 (748 hex)
|
||||||
# Another server not signed against Digicert will fail
|
# Another server not signed against Digicert will fail
|
||||||
=> wget https://www.google.com/
|
=> wget https://www.google.com/
|
||||||
Certificate verification failed
|
|
||||||
|
|
||||||
HTTP client error 4
|
HTTP client error 4
|
||||||
|
Certificate verification failed
|
||||||
# Disable authentication to allow the command to proceed anyways
|
# Disable authentication to allow the command to proceed anyways
|
||||||
=> wget cacert none
|
=> wget cacert none
|
||||||
=> wget https://www.google.com/
|
=> wget https://www.google.com/
|
||||||
|
@@ -570,6 +570,7 @@ enum wget_http_method {
|
|||||||
* Filled by client.
|
* Filled by client.
|
||||||
* @hdr_cont_len: content length according to headers. Filled by wget
|
* @hdr_cont_len: content length according to headers. Filled by wget
|
||||||
* @headers: buffer for headers. Filled by wget.
|
* @headers: buffer for headers. Filled by wget.
|
||||||
|
* @silent: do not print anything to the console. Filled by client.
|
||||||
*/
|
*/
|
||||||
struct wget_http_info {
|
struct wget_http_info {
|
||||||
enum wget_http_method method;
|
enum wget_http_method method;
|
||||||
@@ -580,6 +581,7 @@ struct wget_http_info {
|
|||||||
bool check_buffer_size;
|
bool check_buffer_size;
|
||||||
u32 hdr_cont_len;
|
u32 hdr_cont_len;
|
||||||
char *headers;
|
char *headers;
|
||||||
|
bool silent;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct wget_http_info default_wget_info;
|
extern struct wget_http_info default_wget_info;
|
||||||
|
@@ -51,7 +51,7 @@ static int next_dp_entry;
|
|||||||
static struct wget_http_info efi_wget_info = {
|
static struct wget_http_info efi_wget_info = {
|
||||||
.set_bootdev = false,
|
.set_bootdev = false,
|
||||||
.check_buffer_size = true,
|
.check_buffer_size = true,
|
||||||
|
.silent = true,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -60,6 +60,8 @@
|
|||||||
|
|
||||||
#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
|
#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
|
||||||
|
|
||||||
|
#include "lwip/errno.h"
|
||||||
|
|
||||||
#include "lwip/altcp.h"
|
#include "lwip/altcp.h"
|
||||||
#include "lwip/altcp_tls.h"
|
#include "lwip/altcp_tls.h"
|
||||||
#include "lwip/priv/altcp_priv.h"
|
#include "lwip/priv/altcp_priv.h"
|
||||||
@@ -299,7 +301,8 @@ altcp_mbedtls_lower_recv_process(struct altcp_pcb *conn, altcp_mbedtls_state_t *
|
|||||||
LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_handshake failed: %d\n", ret));
|
LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_handshake failed: %d\n", ret));
|
||||||
/* handshake failed, connection has to be closed */
|
/* handshake failed, connection has to be closed */
|
||||||
if (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) {
|
if (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) {
|
||||||
printf("Certificate verification failed\n");
|
/* provide a cause for why the connection is closed to the called */
|
||||||
|
errno = EPERM;
|
||||||
}
|
}
|
||||||
if (conn->err) {
|
if (conn->err) {
|
||||||
conn->err(conn->arg, ERR_CLSD);
|
conn->err(conn->arg, ERR_CLSD);
|
||||||
@@ -844,9 +847,6 @@ altcp_tls_create_config(int is_server, u8_t cert_count, u8_t pkey_count, int hav
|
|||||||
altcp_mbedtls_free_config(conf);
|
altcp_mbedtls_free_config(conf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (authmode == MBEDTLS_SSL_VERIFY_NONE) {
|
|
||||||
printf("WARNING: no CA certificates, HTTPS connections not authenticated\n");
|
|
||||||
}
|
|
||||||
mbedtls_ssl_conf_authmode(&conf->conf, authmode);
|
mbedtls_ssl_conf_authmode(&conf->conf, authmode);
|
||||||
|
|
||||||
mbedtls_ssl_conf_rng(&conf->conf, mbedtls_ctr_drbg_random, &altcp_tls_entropy_rng->ctr_drbg);
|
mbedtls_ssl_conf_rng(&conf->conf, mbedtls_ctr_drbg_random, &altcp_tls_entropy_rng->ctr_drbg);
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <lwip/apps/http_client.h>
|
#include <lwip/apps/http_client.h>
|
||||||
#include "lwip/altcp_tls.h"
|
#include "lwip/altcp_tls.h"
|
||||||
|
#include <lwip/errno.h>
|
||||||
#include <lwip/timeouts.h>
|
#include <lwip/timeouts.h>
|
||||||
#include <rng.h>
|
#include <rng.h>
|
||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
@@ -217,7 +218,8 @@ static err_t httpc_recv_cb(void *arg, struct altcp_pcb *pcb, struct pbuf *pbuf,
|
|||||||
memcpy((void *)ctx->daddr, buf->payload, buf->len);
|
memcpy((void *)ctx->daddr, buf->payload, buf->len);
|
||||||
ctx->daddr += buf->len;
|
ctx->daddr += buf->len;
|
||||||
ctx->size += buf->len;
|
ctx->size += buf->len;
|
||||||
if (ctx->size - ctx->prevsize > PROGRESS_PRINT_STEP_BYTES) {
|
if (!wget_info->silent &&
|
||||||
|
ctx->size - ctx->prevsize > PROGRESS_PRINT_STEP_BYTES) {
|
||||||
printf("#");
|
printf("#");
|
||||||
ctx->prevsize = ctx->size;
|
ctx->prevsize = ctx->size;
|
||||||
}
|
}
|
||||||
@@ -255,11 +257,15 @@ static void httpc_result_cb(void *arg, httpc_result_t httpc_result,
|
|||||||
elapsed = get_timer(ctx->start_time);
|
elapsed = get_timer(ctx->start_time);
|
||||||
if (!elapsed)
|
if (!elapsed)
|
||||||
elapsed = 1;
|
elapsed = 1;
|
||||||
if (rx_content_len > PROGRESS_PRINT_STEP_BYTES)
|
if (!wget_info->silent) {
|
||||||
printf("\n");
|
if (rx_content_len > PROGRESS_PRINT_STEP_BYTES)
|
||||||
printf("%u bytes transferred in %lu ms (", rx_content_len, elapsed);
|
printf("\n");
|
||||||
print_size(rx_content_len / elapsed * 1000, "/s)\n");
|
printf("%u bytes transferred in %lu ms (", rx_content_len,
|
||||||
printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
|
elapsed);
|
||||||
|
print_size(rx_content_len / elapsed * 1000, "/s)\n");
|
||||||
|
printf("Bytes transferred = %lu (%lx hex)\n", ctx->size,
|
||||||
|
ctx->size);
|
||||||
|
}
|
||||||
if (wget_info->set_bootdev)
|
if (wget_info->set_bootdev)
|
||||||
efi_set_bootdev("Http", ctx->server_name, ctx->path, map_sysmem(ctx->saved_daddr, 0),
|
efi_set_bootdev("Http", ctx->server_name, ctx->path, map_sysmem(ctx->saved_daddr, 0),
|
||||||
rx_content_len);
|
rx_content_len);
|
||||||
@@ -339,7 +345,8 @@ static int _set_cacert(const void *addr, size_t sz)
|
|||||||
mbedtls_x509_crt_init(&crt);
|
mbedtls_x509_crt_init(&crt);
|
||||||
ret = mbedtls_x509_crt_parse(&crt, cacert, cacert_size);
|
ret = mbedtls_x509_crt_parse(&crt, cacert, cacert_size);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printf("Could not parse certificates (%d)\n", ret);
|
if (!wget_info->silent)
|
||||||
|
printf("Could not parse certificates (%d)\n", ret);
|
||||||
free(cacert);
|
free(cacert);
|
||||||
cacert = NULL;
|
cacert = NULL;
|
||||||
cacert_size = 0;
|
cacert_size = 0;
|
||||||
@@ -422,9 +429,10 @@ int wget_do_request(ulong dst_addr, char *uri)
|
|||||||
|
|
||||||
if (cacert_auth_mode == AUTH_REQUIRED) {
|
if (cacert_auth_mode == AUTH_REQUIRED) {
|
||||||
if (!ca || !ca_sz) {
|
if (!ca || !ca_sz) {
|
||||||
printf("Error: cacert authentication mode is "
|
if (!wget_info->silent)
|
||||||
"'required' but no CA certificates "
|
printf("Error: cacert authentication "
|
||||||
"given\n");
|
"mode is 'required' but no CA "
|
||||||
|
"certificates given\n");
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
} else if (cacert_auth_mode == AUTH_NONE) {
|
} else if (cacert_auth_mode == AUTH_NONE) {
|
||||||
@@ -439,6 +447,10 @@ int wget_do_request(ulong dst_addr, char *uri)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ca && !wget_info->silent) {
|
||||||
|
printf("WARNING: no CA certificates, ");
|
||||||
|
printf("HTTPS connections not authenticated\n");
|
||||||
|
}
|
||||||
tls_allocator.alloc = &altcp_tls_alloc;
|
tls_allocator.alloc = &altcp_tls_alloc;
|
||||||
tls_allocator.arg =
|
tls_allocator.arg =
|
||||||
altcp_tls_create_config_client(ca, ca_sz,
|
altcp_tls_create_config_client(ca, ca_sz,
|
||||||
@@ -463,6 +475,8 @@ int wget_do_request(ulong dst_addr, char *uri)
|
|||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
while (!ctx.done) {
|
while (!ctx.done) {
|
||||||
net_lwip_rx(udev, netif);
|
net_lwip_rx(udev, netif);
|
||||||
sys_check_timeouts();
|
sys_check_timeouts();
|
||||||
@@ -475,6 +489,9 @@ int wget_do_request(ulong dst_addr, char *uri)
|
|||||||
if (ctx.done == SUCCESS)
|
if (ctx.done == SUCCESS)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (errno == EPERM && !wget_info->silent)
|
||||||
|
printf("Certificate verification failed\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
net/wget.c
23
net/wget.c
@@ -59,8 +59,10 @@ static inline int store_block(uchar *src, unsigned int offset, unsigned int len)
|
|||||||
if (CONFIG_IS_ENABLED(LMB) && wget_info->set_bootdev) {
|
if (CONFIG_IS_ENABLED(LMB) && wget_info->set_bootdev) {
|
||||||
if (store_addr < image_load_addr ||
|
if (store_addr < image_load_addr ||
|
||||||
lmb_read_check(store_addr, len)) {
|
lmb_read_check(store_addr, len)) {
|
||||||
printf("\nwget error: ");
|
if (!wget_info->silent) {
|
||||||
printf("trying to overwrite reserved memory...\n");
|
printf("\nwget error: ");
|
||||||
|
printf("trying to overwrite reserved memory\n");
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,6 +78,9 @@ static void show_block_marker(u32 packets)
|
|||||||
{
|
{
|
||||||
int cnt;
|
int cnt;
|
||||||
|
|
||||||
|
if (wget_info->silent)
|
||||||
|
return;
|
||||||
|
|
||||||
if (content_length != -1) {
|
if (content_length != -1) {
|
||||||
if (net_boot_file_size > content_length)
|
if (net_boot_file_size > content_length)
|
||||||
content_length = net_boot_file_size;
|
content_length = net_boot_file_size;
|
||||||
@@ -101,11 +106,15 @@ static void tcp_stream_on_closed(struct tcp_stream *tcp)
|
|||||||
net_set_state(wget_loop_state);
|
net_set_state(wget_loop_state);
|
||||||
if (wget_loop_state != NETLOOP_SUCCESS) {
|
if (wget_loop_state != NETLOOP_SUCCESS) {
|
||||||
net_boot_file_size = 0;
|
net_boot_file_size = 0;
|
||||||
printf("\nwget: Transfer Fail, TCP status - %d\n", tcp->status);
|
if (!wget_info->silent)
|
||||||
|
printf("\nwget: Transfer Fail, TCP status - %d\n",
|
||||||
|
tcp->status);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\nPackets received %d, Transfer Successful\n", tcp->rx_packets);
|
if (!wget_info->silent)
|
||||||
|
printf("\nPackets received %d, Transfer Successful\n",
|
||||||
|
tcp->rx_packets);
|
||||||
wget_info->file_size = net_boot_file_size;
|
wget_info->file_size = net_boot_file_size;
|
||||||
if (wget_info->method == WGET_HTTP_METHOD_GET && wget_info->set_bootdev) {
|
if (wget_info->method == WGET_HTTP_METHOD_GET && wget_info->set_bootdev) {
|
||||||
efi_set_bootdev("Http", NULL, image_url,
|
efi_set_bootdev("Http", NULL, image_url,
|
||||||
@@ -139,7 +148,8 @@ static void tcp_stream_on_rcv_nxt_update(struct tcp_stream *tcp, u32 rx_bytes)
|
|||||||
tcp->state == TCP_ESTABLISHED)
|
tcp->state == TCP_ESTABLISHED)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
printf("ERROR: misssed HTTP header\n");
|
if (!wget_info->silent)
|
||||||
|
printf("ERROR: misssed HTTP header\n");
|
||||||
tcp_stream_close(tcp);
|
tcp_stream_close(tcp);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
@@ -346,7 +356,8 @@ void wget_start(void)
|
|||||||
tcp_stream_set_on_create_handler(tcp_stream_on_create);
|
tcp_stream_set_on_create_handler(tcp_stream_on_create);
|
||||||
tcp = tcp_stream_connect(web_server_ip, server_port);
|
tcp = tcp_stream_connect(web_server_ip, server_port);
|
||||||
if (!tcp) {
|
if (!tcp) {
|
||||||
printf("No free tcp streams\n");
|
if (!wget_info->silent)
|
||||||
|
printf("No free tcp streams\n");
|
||||||
net_set_state(NETLOOP_FAIL);
|
net_set_state(NETLOOP_FAIL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user