summaryrefslogtreecommitdiffstats
path: root/NetworkPkg
diff options
context:
space:
mode:
authorSunny Wang <sunnywang@hpe.com>2016-05-05 10:05:00 +0800
committerFu Siyuan <siyuan.fu@intel.com>2016-05-06 09:00:57 +0800
commit44a7d08b5a935347a35507fb5db42659a96b3452 (patch)
tree9ea9bb019696e72a462ae9f79adbd50cd518c70c /NetworkPkg
parent9cc0168a70052638ffb40b09369a636d4fa84b36 (diff)
downloadedk2-44a7d08b5a935347a35507fb5db42659a96b3452.tar.gz
edk2-44a7d08b5a935347a35507fb5db42659a96b3452.tar.bz2
edk2-44a7d08b5a935347a35507fb5db42659a96b3452.zip
NetworkPkg/HttpBootDxe: Fix for the issue that the HTTP boot option can't be booted more than once
This issue can be reproduced by the following steps: 1. Boot to HTTP boot option and the boot file is a ISO file like Ubuntu PE image. 2. Exit from boot option (GRUB) and then back to boot manager menu. 3. Boot to the same HTTP boot option again or a HTTP boot option pointing to the same HTTP ISO file. It will fail to boot. Root cause: When booting a HTTP boot option, the HTTP boot driver will save the Boot File's information in its private data as cache data for skipping the Boot file discovery from next time boot. However, the cache data doesn't include ImageType data, which would cause HTTP boot driver using the invalid ImageType (ImageTypeMax) and then fail to boot the cached boot file. In other words, for the second time boot, the HttpBootLoadFile() doesn't update ImageType (it returns a valid ImageType), which causes that the HttpBootDxeLoadFile() skips to Register a RAM Disk for downloaded HTTP ISO file and then BDS code can't find the RAM disk to boot. Solution: Save ImageType to private data for next time HTTP boot. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Sunny Wang <sunnywang@hpe.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Diffstat (limited to 'NetworkPkg')
-rw-r--r--NetworkPkg/HttpBootDxe/HttpBootDxe.h1
-rw-r--r--NetworkPkg/HttpBootDxe/HttpBootImpl.c6
2 files changed, 5 insertions, 2 deletions
diff --git a/NetworkPkg/HttpBootDxe/HttpBootDxe.h b/NetworkPkg/HttpBootDxe/HttpBootDxe.h
index 76b794321e..806429cad1 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootDxe.h
+++ b/NetworkPkg/HttpBootDxe/HttpBootDxe.h
@@ -189,6 +189,7 @@ struct _HTTP_BOOT_PRIVATE_DATA {
VOID *BootFileUriParser;
UINTN BootFileSize;
BOOLEAN NoGateway;
+ HTTP_BOOT_IMAGE_TYPE ImageType;
//
// URI string extracted from the input FilePath parameter.
diff --git a/NetworkPkg/HttpBootDxe/HttpBootImpl.c b/NetworkPkg/HttpBootDxe/HttpBootImpl.c
index cf643d86bc..4b850b6628 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootImpl.c
+++ b/NetworkPkg/HttpBootDxe/HttpBootImpl.c
@@ -2,6 +2,7 @@
The implementation of EFI_LOAD_FILE_PROTOCOL for UEFI HTTP boot.
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -271,7 +272,7 @@ HttpBootLoadFile (
TRUE,
&Private->BootFileSize,
NULL,
- ImageType
+ &Private->ImageType
);
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
//
@@ -283,7 +284,7 @@ HttpBootLoadFile (
FALSE,
&Private->BootFileSize,
NULL,
- ImageType
+ &Private->ImageType
);
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
return Status;
@@ -293,6 +294,7 @@ HttpBootLoadFile (
if (*BufferSize < Private->BootFileSize) {
*BufferSize = Private->BootFileSize;
+ *ImageType = Private->ImageType;
return EFI_BUFFER_TOO_SMALL;
}