1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
From: Stephen Benjamin <stephen@redhat.com>
Date: Mon, 9 Jan 2023 18:30:41 -0500
Subject: Prepend prefix when HTTP path is relative
This sets a couple of variables. With the url http://www.example.com/foo/bar :
http_path: /foo/bar
http_url: http://www.example.com/foo/bar
Resolves: rhbz#1616395
Co-authored-by: Javier Martinez Canillas <javierm@redhat.com>
Co-authored-by: Robbie Harwood <rharwood@redhat.com>
Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Stephen Benjamin <stephen@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
---
grub-core/kern/main.c | 10 +++++-
grub-core/net/efi/http.c | 85 ++++++++++++++++++++++++++++++++++++------------
2 files changed, 73 insertions(+), 22 deletions(-)
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
index 99fa13f..402572c 100644
--- a/grub-core/kern/main.c
+++ b/grub-core/kern/main.c
@@ -136,12 +136,20 @@ grub_set_prefix_and_root (void)
if (fwdevice && fwpath)
{
char *fw_path;
+ char separator[3] = ")";
- fw_path = grub_xasprintf ("(%s)/%s", fwdevice, fwpath);
+ grub_dprintf ("fw_path", "\n");
+ grub_dprintf ("fw_path", "fwdevice:\"%s\" fwpath:\"%s\"\n", fwdevice, fwpath);
+
+ if (!grub_strncmp(fwdevice, "http", 4) && fwpath[0] != '/')
+ grub_strcpy(separator, ")/");
+
+ fw_path = grub_xasprintf ("(%s%s%s", fwdevice, separator, fwpath);
if (fw_path)
{
grub_env_set ("fw_path", fw_path);
grub_env_export ("fw_path");
+ grub_dprintf ("fw_path", "fw_path:\"%s\"\n", fw_path);
grub_free (fw_path);
}
}
diff --git a/grub-core/net/efi/http.c b/grub-core/net/efi/http.c
index 2ec458b..c739392 100644
--- a/grub-core/net/efi/http.c
+++ b/grub-core/net/efi/http.c
@@ -8,10 +8,53 @@
static void
http_configure (struct grub_efi_net_device *dev, int prefer_ip6)
{
+ grub_efi_ipv6_address_t address;
grub_efi_http_config_data_t http_config;
grub_efi_httpv4_access_point_t httpv4_node;
grub_efi_httpv6_access_point_t httpv6_node;
grub_efi_status_t status;
+ int https;
+ char *http_url;
+ const char *rest, *http_server, *http_path = NULL;
+
+ http_server = grub_env_get ("root");
+ https = (grub_strncmp (http_server, "https", 5) == 0) ? 1 : 0;
+
+ /* extract http server + port */
+ if (http_server)
+ {
+ http_server = grub_strchr (http_server, ',');
+ if (http_server)
+ http_server++;
+ }
+
+ /* fw_path is like (http,192.168.1.1:8000)/httpboot, extract path part */
+ http_path = grub_env_get ("fw_path");
+ if (http_path)
+ {
+ http_path = grub_strchr (http_path, ')');
+ if (http_path)
+ {
+ http_path++;
+ grub_env_unset ("http_path");
+ grub_env_set ("http_path", http_path);
+ grub_env_export ("http_path");
+ }
+ }
+
+ if (http_server && http_path)
+ {
+ if (grub_efi_string_to_ip6_address (http_server, &address, &rest) && *rest == 0)
+ http_url = grub_xasprintf ("%s://[%s]%s", https ? "https" : "http", http_server, http_path);
+ else
+ http_url = grub_xasprintf ("%s://%s%s", https ? "https" : "http", http_server, http_path);
+ if (http_url)
+ {
+ grub_env_unset ("http_url");
+ grub_env_set ("http_url", http_url);
+ grub_free (http_url);
+ }
+ }
grub_efi_http_t *http = dev->http;
@@ -336,32 +379,32 @@ grub_efihttp_open (struct grub_efi_net_device *dev,
grub_err_t err;
grub_off_t size = 0;
char *buf = NULL;
- char *root_url;
- grub_efi_ipv6_address_t address;
- const char *rest;
-
- if (grub_efi_string_to_ip6_address (file->device->net->server, &address, &rest) && *rest == 0)
- root_url = grub_xasprintf ("%s://[%s]", type ? "https" : "http", file->device->net->server);
- else
- root_url = grub_xasprintf ("%s://%s", type ? "https" : "http", file->device->net->server);
- if (root_url)
- {
- grub_env_unset ("root_url");
- grub_env_set ("root_url", root_url);
- grub_free (root_url);
- }
- else
- {
+ char *file_name = NULL;
+ const char *http_path;
+
+ /* If path is relative, prepend http_path */
+ http_path = grub_env_get ("http_path");
+ if (http_path && file->device->net->name[0] != '/') {
+ file_name = grub_xasprintf ("%s/%s", http_path, file->device->net->name);
+ if (!file_name)
return grub_errno;
- }
+ }
- err = efihttp_request (dev->http, file->device->net->server, file->device->net->name, type, 1, 0);
+ err = efihttp_request (dev->http, file->device->net->server,
+ file_name ? file_name : file->device->net->name, type, 1, 0);
if (err != GRUB_ERR_NONE)
- return err;
+ {
+ grub_free (file_name);
+ return err;
+ }
- err = efihttp_request (dev->http, file->device->net->server, file->device->net->name, type, 0, &size);
+ err = efihttp_request (dev->http, file->device->net->server,
+ file_name ? file_name : file->device->net->name, type, 0, &size);
+ grub_free (file_name);
if (err != GRUB_ERR_NONE)
- return err;
+ {
+ return err;
+ }
if (size)
{
|