diff options
author | D Scott Phillips <scottph@FreeBSD.org> | 2020-09-09 16:35:51 +0000 |
---|---|---|
committer | Kyle Evans <kevans@FreeBSD.org> | 2021-10-08 01:15:59 +0000 |
commit | b87ad4f2db6dfc3b66464a689c399f666fa64d39 (patch) | |
tree | 26bcd31ba20d0235ac284b54afd5945466adb045 | |
parent | f7ad7b5a1e5da5fa611e578dfa978de66cc6e87b (diff) | |
download | src-b87ad4f2db6dfc3b66464a689c399f666fa64d39.tar.gz src-b87ad4f2db6dfc3b66464a689c399f666fa64d39.zip |
stand/efihttp: Work around a bug in edk2 http instance reconfiguration
A bug in the EFI HTTP driver of TianoCore EDK2 causes memory
corruption when an http instance that uses tls is reconfigured,
leading to a crash.
Work around this by forcing a new http instance for each request
instead of reconfiguring the existing one.
The upstream bug report is https://bugzilla.tianocore.org/show_bug.cgi?id=1917
(cherry picked from commit d455cd5ac36f4c1ac76f04e2c2bb4bfb00fe8bcd)
-rw-r--r-- | stand/efi/libefi/efihttp.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/stand/efi/libefi/efihttp.c b/stand/efi/libefi/efihttp.c index 074c85dcdef0..05d338fbaf04 100644 --- a/stand/efi/libefi/efihttp.c +++ b/stand/efi/libefi/efihttp.c @@ -576,6 +576,14 @@ efihttp_fs_open(const char *path, struct open_file *f) */ err = _efihttp_fs_open(path, f); if (err != 0) { + /* + * Work around a bug in the EFI HTTP implementation which + * causes a crash if the http instance isn't torn down + * between requests. + * See https://bugzilla.tianocore.org/show_bug.cgi?id=1917 + */ + efihttp_dev_close(f); + efihttp_dev_open(f); path_slash = malloc(strlen(path) + 2); if (path_slash == NULL) return (ENOMEM); @@ -719,6 +727,14 @@ efihttp_fs_seek(struct open_file *f, off_t offset, int where) path = fh->path; fh->path = NULL; efihttp_fs_close(f); + /* + * Work around a bug in the EFI HTTP implementation which + * causes a crash if the http instance isn't torn down + * between requests. + * See https://bugzilla.tianocore.org/show_bug.cgi?id=1917 + */ + efihttp_dev_close(f); + efihttp_dev_open(f); err = efihttp_fs_open(path, f); free(path); if (err != 0) |