summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
diff options
context:
space:
mode:
authorDandan Bi <dandan.bi@intel.com>2018-10-12 18:13:19 +0800
committerHao Wu <hao.a.wu@intel.com>2018-10-26 15:08:44 +0800
commit979b7d802c316722da3f3dee90799728c7aab38f (patch)
tree3661b38d302750487f16c3dd527e0b54741f7a83 /MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
parentadb2c050128c62ab96bdec95f648f9a18603b028 (diff)
downloadedk2-979b7d802c316722da3f3dee90799728c7aab38f.zip
edk2-979b7d802c316722da3f3dee90799728c7aab38f.tar.gz
edk2-979b7d802c316722da3f3dee90799728c7aab38f.tar.bz2
MdeModulePkg/HiiDB: Make sure database update behaviors are atomic
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1235 When update contents in HiiDatabase, like: 1. Add/update/remove package list 2. Add/update string 3. Add/update image We should make these operations atomic to prevent the potential issue that the one update operation with higher TPL may interrupt another. This commit is to make the HiiDatabase update behaviors atomic by adding EfiAcquireLock/EfiReleaseLock function. Cc: Liming Gao <liming.gao@intel.com> Cc: Eric Dong <eric.dong@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
Diffstat (limited to 'MdeModulePkg/Universal/HiiDatabaseDxe/Image.c')
-rw-r--r--MdeModulePkg/Universal/HiiDatabaseDxe/Image.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
index d101082..71ebc55 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
@@ -649,6 +649,8 @@ HiiNewImage (
return EFI_NOT_FOUND;
}
+ EfiAcquireLock (&mHiiDatabaseLock);
+
NewBlockSize = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +
BITMAP_LEN_24_BIT ((UINT32) Image->Width, Image->Height);
@@ -671,6 +673,7 @@ HiiNewImage (
//
ImageBlocks = AllocatePool (ImagePackage->ImageBlockSize + NewBlockSize);
if (ImageBlocks == NULL) {
+ EfiReleaseLock (&mHiiDatabaseLock);
return EFI_OUT_OF_RESOURCES;
}
//
@@ -704,6 +707,7 @@ HiiNewImage (
//
ImagePackage = (HII_IMAGE_PACKAGE_INSTANCE *) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE));
if (ImagePackage == NULL) {
+ EfiReleaseLock (&mHiiDatabaseLock);
return EFI_OUT_OF_RESOURCES;
}
//
@@ -732,6 +736,7 @@ HiiNewImage (
ImagePackage->ImageBlock = AllocateZeroPool (NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK));
if (ImagePackage->ImageBlock == NULL) {
FreePool (ImagePackage);
+ EfiReleaseLock (&mHiiDatabaseLock);
return EFI_OUT_OF_RESOURCES;
}
ImageBlocks = ImagePackage->ImageBlock;
@@ -769,6 +774,8 @@ HiiNewImage (
HiiGetDatabaseInfo(&Private->HiiDatabase);
}
+ EfiReleaseLock (&mHiiDatabaseLock);
+
return EFI_SUCCESS;
}
@@ -1064,6 +1071,8 @@ HiiSetImage (
return EFI_NOT_FOUND;
}
+ EfiAcquireLock (&mHiiDatabaseLock);
+
//
// Get the size of original image block. Use some common block code here
// since the definition of some structures is the same.
@@ -1108,6 +1117,7 @@ HiiSetImage (
);
break;
default:
+ EfiReleaseLock (&mHiiDatabaseLock);
return EFI_NOT_FOUND;
}
@@ -1121,6 +1131,7 @@ HiiSetImage (
//
ImageBlocks = AllocateZeroPool (ImagePackage->ImageBlockSize + NewBlockSize - OldBlockSize);
if (ImageBlocks == NULL) {
+ EfiReleaseLock (&mHiiDatabaseLock);
return EFI_OUT_OF_RESOURCES;
}
@@ -1158,6 +1169,7 @@ HiiSetImage (
HiiGetDatabaseInfo(&Private->HiiDatabase);
}
+ EfiReleaseLock (&mHiiDatabaseLock);
return EFI_SUCCESS;
}