From 1132d2731999721c6a2e74f8ef63f984164d7b86 Mon Sep 17 00:00:00 2001 From: Ilya Bakulin Date: Wed, 12 Nov 2014 16:30:19 +0100 Subject: [PATCH] GRUB2: Fix http IO handler to report protocol level errors Although the code that processes the HTTP headers is able to detect "file not found" and other types of HTTP-level errors, GRUB doesn't check if there was an error and loads the server's error page as a file instead. Change-Id: I94ab517d3f465765cb11b5f71c6423bf381887f1 Signed-off-by: Ilya Bakulin --- contrib/grub2/grub-core/net/http.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/contrib/grub2/grub-core/net/http.c b/contrib/grub2/grub-core/net/http.c index 4684f8b..48779f8 100644 --- a/contrib/grub2/grub-core/net/http.c +++ b/contrib/grub2/grub-core/net/http.c @@ -226,6 +226,14 @@ http_receive (grub_net_tcp_socket_t sock __attribute__ ((unused)), grub_netbuff_free (nb); return err; } + + if (data->err) { + grub_printf("%s: Data error after processing headers\n", __func__); + grub_net_tcp_close (data->sock, GRUB_NET_TCP_ABORT); + grub_netbuff_free (nb); + return GRUB_ERR_IO; + } + } while (ptr < (char *) nb->tail && (!data->headers_recv @@ -254,6 +262,13 @@ http_receive (grub_net_tcp_socket_t sock __attribute__ ((unused)), grub_netbuff_free (nb); return err; } + if (data->err) { + grub_printf("%s: error after processing headers\n", __func__); + grub_net_tcp_close (data->sock, GRUB_NET_TCP_ABORT); + grub_netbuff_free (nb); + return GRUB_ERR_IO; + } + ptr = ptr2 + 1; } @@ -410,23 +425,25 @@ 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->err && !data->headers_recv && i < 100; i++) { grub_net_tcp_retransmit (); grub_net_poll_cards (300, &data->headers_recv); } + if (data->err) + { + grub_net_tcp_close (data->sock, GRUB_NET_TCP_ABORT); + char *str = data->errmsg; + err = grub_error (data->err, "%s", str); + grub_free (str); + data->errmsg = 0; + return data->err; + } + if (!data->headers_recv) { grub_net_tcp_close (data->sock, GRUB_NET_TCP_ABORT); - if (data->err) - { - char *str = data->errmsg; - err = grub_error (data->err, "%s", str); - grub_free (str); - data->errmsg = 0; - return data->err; - } return grub_error (GRUB_ERR_TIMEOUT, N_("time out opening `%s'"), data->filename); } return GRUB_ERR_NONE; -- 1.7.10.4