aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Axtens <dja@axtens.net>2022-03-01 23:14:15 +1100
committerDaniel Kiper <daniel.kiper@oracle.com>2022-06-07 16:39:33 +0200
commitdad94fffe14be476df5f34a8e5a90ea62a41fe12 (patch)
tree328320ff659b5a2088f5ca044aceed70c2b2f007
parent8f287c3e13da2bf82049e2e464eca7ca4fef0a85 (diff)
downloadgrub-dad94fffe14be476df5f34a8e5a90ea62a41fe12.tar.gz
net/http: Do not tear down socket if it's already been torn down
It's possible for data->sock to get torn down in tcp error handling. If we unconditionally tear it down again we will end up doing writes to an offset of the NULL pointer when we go to tear it down again. Detect if it has been torn down and don't do it again. Signed-off-by: Daniel Axtens <dja@axtens.net> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
-rw-r--r--grub-core/net/http.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/grub-core/net/http.c b/grub-core/net/http.c
index 8d6c62c76..f8d7bf0cd 100644
--- a/grub-core/net/http.c
+++ b/grub-core/net/http.c
@@ -445,7 +445,7 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
return err;
}
- for (i = 0; !data->headers_recv && i < 100; i++)
+ for (i = 0; data->sock && !data->headers_recv && i < 100; i++)
{
grub_net_tcp_retransmit ();
grub_net_poll_cards (300, &data->headers_recv);
@@ -453,7 +453,8 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
if (!data->headers_recv)
{
- grub_net_tcp_close (data->sock, GRUB_NET_TCP_ABORT);
+ if (data->sock)
+ grub_net_tcp_close (data->sock, GRUB_NET_TCP_ABORT);
if (data->err)
{
char *str = data->errmsg;