mirror of https://github.com/acidanthera/audk.git
Do the following fix up in SetupBrowser driver:
1) Check whether ConfigAccess is NULL before use it. 2) Don't do call back for UI_ACTION_REFRESH_FORMSET action. 3) Release resource before leave SetupBrowser() function. 4) Use the unified check method (HiiHandle, FormsetGuid and FormId) to check FORM is open or close. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10565 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
c6498c1d45
commit
13ad1def34
|
@ -16,7 +16,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
BOOLEAN mHiiPackageListUpdated;
|
BOOLEAN mHiiPackageListUpdated;
|
||||||
UI_MENU_SELECTION *gCurrentSelection;
|
UI_MENU_SELECTION *gCurrentSelection;
|
||||||
|
EFI_HII_HANDLE mCurrentHiiHandle = NULL;
|
||||||
|
EFI_GUID mCurrentFormSetGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};
|
||||||
|
UINT16 mCurrentFormId = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Clear retangle with specified text attribute.
|
Clear retangle with specified text attribute.
|
||||||
|
@ -842,8 +844,6 @@ FormUpdateNotify (
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN mFormCloseCallBack = FALSE;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The worker function that send the displays to the screen. On output,
|
The worker function that send the displays to the screen. On output,
|
||||||
the selection made by user is returned.
|
the selection made by user is returned.
|
||||||
|
@ -872,11 +872,7 @@ SetupBrowser (
|
||||||
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
|
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
|
||||||
FORM_BROWSER_FORMSET *FormSet;
|
FORM_BROWSER_FORMSET *FormSet;
|
||||||
EFI_INPUT_KEY Key;
|
EFI_INPUT_KEY Key;
|
||||||
BOOLEAN FormOpenCallBack;
|
|
||||||
BOOLEAN SubmitFormIsRequired;
|
BOOLEAN SubmitFormIsRequired;
|
||||||
EFI_GUID CurrentFormSetGuid;
|
|
||||||
EFI_HII_HANDLE CurrentHiiHandle;
|
|
||||||
UINT16 CurrentFormId;
|
|
||||||
|
|
||||||
gMenuRefreshHead = NULL;
|
gMenuRefreshHead = NULL;
|
||||||
gResetRequired = FALSE;
|
gResetRequired = FALSE;
|
||||||
|
@ -903,7 +899,6 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
Status = InitializeCurrentSetting (Selection->FormSet);
|
Status = InitializeCurrentSetting (Selection->FormSet);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Selection->Action = UI_ACTION_EXIT;
|
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -911,13 +906,7 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
// Initialize Selection->Form
|
// Initialize Selection->Form
|
||||||
//
|
//
|
||||||
FormOpenCallBack = FALSE;
|
|
||||||
if (Selection->FormId == 0) {
|
if (Selection->FormId == 0) {
|
||||||
//
|
|
||||||
// First Form will open.
|
|
||||||
//
|
|
||||||
FormOpenCallBack = TRUE;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Zero FormId indicates display the first Form in a FormSet
|
// Zero FormId indicates display the first Form in a FormSet
|
||||||
//
|
//
|
||||||
|
@ -926,12 +915,6 @@ SetupBrowser (
|
||||||
Selection->Form = FORM_BROWSER_FORM_FROM_LINK (Link);
|
Selection->Form = FORM_BROWSER_FORM_FROM_LINK (Link);
|
||||||
Selection->FormId = Selection->Form->FormId;
|
Selection->FormId = Selection->Form->FormId;
|
||||||
} else {
|
} else {
|
||||||
if (Selection->Form == NULL) {
|
|
||||||
//
|
|
||||||
// First Form will open.
|
|
||||||
//
|
|
||||||
FormOpenCallBack = TRUE;
|
|
||||||
}
|
|
||||||
Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);
|
Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -939,7 +922,8 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
// No Form to display
|
// No Form to display
|
||||||
//
|
//
|
||||||
return EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -947,8 +931,9 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
if (Selection->Form->SuppressExpression != NULL) {
|
if (Selection->Form->SuppressExpression != NULL) {
|
||||||
Status = EvaluateExpression (Selection->FormSet, Selection->Form, Selection->Form->SuppressExpression);
|
Status = EvaluateExpression (Selection->FormSet, Selection->Form, Selection->Form->SuppressExpression);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status) || (Selection->Form->SuppressExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN)) {
|
||||||
return Status;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Selection->Form->SuppressExpression->Result.Value.b) {
|
if (Selection->Form->SuppressExpression->Result.Value.b) {
|
||||||
|
@ -959,17 +944,11 @@ SetupBrowser (
|
||||||
CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);
|
CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);
|
||||||
} while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
|
} while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Keep current form information
|
|
||||||
//
|
|
||||||
CurrentHiiHandle = Selection->Handle;
|
|
||||||
CopyGuid (&CurrentFormSetGuid, &Selection->FormSetGuid);
|
|
||||||
CurrentFormId = Selection->FormId;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Reset FormPackage update flag
|
// Reset FormPackage update flag
|
||||||
//
|
//
|
||||||
|
@ -980,8 +959,18 @@ SetupBrowser (
|
||||||
// for each question with callback flag.
|
// for each question with callback flag.
|
||||||
// New form may be the first form, or the different form after another form close.
|
// New form may be the first form, or the different form after another form close.
|
||||||
//
|
//
|
||||||
if ((FormOpenCallBack || mFormCloseCallBack) && (ConfigAccess != NULL)) {
|
if ((ConfigAccess != NULL) &&
|
||||||
mFormCloseCallBack = FALSE;
|
((Selection->Handle != mCurrentHiiHandle) ||
|
||||||
|
(!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||
|
||||||
|
(Selection->FormId != mCurrentFormId))) {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Keep current form information
|
||||||
|
//
|
||||||
|
mCurrentHiiHandle = Selection->Handle;
|
||||||
|
CopyGuid (&mCurrentFormSetGuid, &Selection->FormSetGuid);
|
||||||
|
mCurrentFormId = Selection->FormId;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Go through each statement in this form
|
// Go through each statement in this form
|
||||||
//
|
//
|
||||||
|
@ -1061,7 +1050,7 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
Status = LoadFormSetConfig (Selection, Selection->FormSet);
|
Status = LoadFormSetConfig (Selection, Selection->FormSet);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1089,7 +1078,7 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
Status = DisplayForm (Selection);
|
Status = DisplayForm (Selection);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1106,12 +1095,11 @@ SetupBrowser (
|
||||||
//
|
//
|
||||||
mHiiPackageListUpdated = FALSE;
|
mHiiPackageListUpdated = FALSE;
|
||||||
|
|
||||||
if (((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) && (Statement->Operand != EFI_IFR_PASSWORD_OP)) {
|
if ((ConfigAccess != NULL) &&
|
||||||
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) &&
|
||||||
|
(Statement->Operand != EFI_IFR_PASSWORD_OP)) {
|
||||||
|
|
||||||
if (ConfigAccess == NULL) {
|
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
HiiValue = &Statement->HiiValue;
|
HiiValue = &Statement->HiiValue;
|
||||||
TypeValue = &HiiValue->Value;
|
TypeValue = &HiiValue->Value;
|
||||||
|
@ -1191,16 +1179,14 @@ SetupBrowser (
|
||||||
// Before exit the form, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE
|
// Before exit the form, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE
|
||||||
// for each question with callback flag.
|
// for each question with callback flag.
|
||||||
//
|
//
|
||||||
mFormCloseCallBack = FALSE;
|
|
||||||
if ((ConfigAccess != NULL) &&
|
if ((ConfigAccess != NULL) &&
|
||||||
((Selection->Action == UI_ACTION_EXIT) ||
|
((Selection->Action == UI_ACTION_EXIT) ||
|
||||||
(Selection->Handle != CurrentHiiHandle) ||
|
(Selection->Handle != mCurrentHiiHandle) ||
|
||||||
(!CompareGuid (&CurrentFormSetGuid, &Selection->FormSetGuid)) ||
|
(!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||
|
||||||
(Selection->FormId != CurrentFormId))) {
|
(Selection->FormId != mCurrentFormId))) {
|
||||||
//
|
//
|
||||||
// Go through each statement in this form
|
// Go through each statement in this form
|
||||||
//
|
//
|
||||||
mFormCloseCallBack = TRUE;
|
|
||||||
SubmitFormIsRequired = FALSE;
|
SubmitFormIsRequired = FALSE;
|
||||||
Link = GetFirstNode (&Selection->Form->StatementListHead);
|
Link = GetFirstNode (&Selection->Form->StatementListHead);
|
||||||
while (!IsNull (&Selection->Form->StatementListHead, Link)) {
|
while (!IsNull (&Selection->Form->StatementListHead, Link)) {
|
||||||
|
@ -1256,10 +1242,19 @@ SetupBrowser (
|
||||||
gOldFormSet = FormSet;
|
gOldFormSet = FormSet;
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
|
//
|
||||||
|
// Reset current form information to the initial setting when error happens or form exit.
|
||||||
|
//
|
||||||
|
if (EFI_ERROR (Status) || Selection->Action == UI_ACTION_EXIT) {
|
||||||
|
mCurrentHiiHandle = NULL;
|
||||||
|
CopyGuid (&mCurrentFormSetGuid, &gZeroGuid);
|
||||||
|
mCurrentFormId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Unregister notify for Form package update
|
// Unregister notify for Form package update
|
||||||
//
|
//
|
||||||
Status = mHiiDatabase->UnregisterPackageNotify (
|
mHiiDatabase->UnregisterPackageNotify (
|
||||||
mHiiDatabase,
|
mHiiDatabase,
|
||||||
NotifyHandle
|
NotifyHandle
|
||||||
);
|
);
|
||||||
|
|
|
@ -778,8 +778,9 @@ ProcessOptions (
|
||||||
//
|
//
|
||||||
*StringPtr = 0;
|
*StringPtr = 0;
|
||||||
Status = PasswordCallback (Selection, MenuOption, StringPtr);
|
Status = PasswordCallback (Selection, MenuOption, StringPtr);
|
||||||
if (Status == EFI_NOT_AVAILABLE_YET) {
|
if (Status == EFI_NOT_AVAILABLE_YET || Status == EFI_UNSUPPORTED) {
|
||||||
//
|
//
|
||||||
|
// Callback is not supported, or
|
||||||
// Callback request to terminate password input
|
// Callback request to terminate password input
|
||||||
//
|
//
|
||||||
FreePool (StringPtr);
|
FreePool (StringPtr);
|
||||||
|
|
|
@ -2080,15 +2080,13 @@ LoadFormConfig (
|
||||||
//
|
//
|
||||||
// Check whether EfiVarstore with CallBack can be got.
|
// Check whether EfiVarstore with CallBack can be got.
|
||||||
//
|
//
|
||||||
if ((Question->QuestionId != 0) && (Question->Storage != NULL) &&
|
if ((FormSet->ConfigAccess != NULL) &&
|
||||||
|
(Selection->Action != UI_ACTION_REFRESH_FORMSET) &&
|
||||||
|
(Question->QuestionId != 0) &&
|
||||||
|
(Question->Storage != NULL) &&
|
||||||
(Question->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) &&
|
(Question->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) &&
|
||||||
((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK)) {
|
((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK)) {
|
||||||
//
|
|
||||||
// ConfigAccess can't be NULL.
|
|
||||||
//
|
|
||||||
if (FormSet->ConfigAccess == NULL) {
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// Check QuestionValue does exist.
|
// Check QuestionValue does exist.
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue