blob: c19d8ab613d1f7018c61a9842677c0641ef18a87 [file] [log] [blame]
Add ignore-error-on-complete option to work around the cases when
UpgradeComplete returns TPM_FAIL after a succesful upgrade.
--- a/Common/FirmwareUpdate.c
+++ b/Common/FirmwareUpdate.c
@@ -1466,11 +1466,23 @@
uint16_t usOutCompleteSize = 0;
BYTE bCompleteData = 0;
- if (RC_SUCCESS != TSS_TPM_FieldUpgradeComplete(usCompleteDataSize, &bCompleteData, &usOutCompleteSize))
+ unReturnValue = TSS_TPM_FieldUpgradeComplete(usCompleteDataSize, &bCompleteData, &usOutCompleteSize);
+ if (TPM_RC_SUCCESS != unReturnValue)
{
- ERROR_STORE_FMT(RC_E_FIRMWARE_UPDATE_FAILED, L"TSS_TPM_FieldUpgradeComplete returned an unexpected value. (0x%.8x)", unReturnValue);
- unReturnValue = RC_E_FIRMWARE_UPDATE_FAILED;
- break;
+ BOOL fIgnoreError = FALSE;
+ if (TPM_FAIL == (unReturnValue ^ RC_TPM_MASK) &&
+ TRUE == PropertyStorage_GetBooleanValueByKey(PROPERTY_IGNORE_ERROR_ON_COMPLETE, &fIgnoreError) &&
+ TRUE == fIgnoreError)
+ {
+ LOGGING_WRITE_LEVEL1(L"TSS_TPM_FieldUpgradeComplete returned TPM_FAIL - ignoring.");
+ usOutCompleteSize = 0;
+ }
+ else
+ {
+ ERROR_STORE_FMT(RC_E_FIRMWARE_UPDATE_FAILED, L"TSS_TPM_FieldUpgradeComplete returned an unexpected value. (0x%.8x)", unReturnValue);
+ unReturnValue = RC_E_FIRMWARE_UPDATE_FAILED;
+ break;
+ }
}
// Check if out parameter is as expected (zero)
--- a/TPMFactoryUpd/CommandLineParser.c
+++ b/TPMFactoryUpd/CommandLineParser.c
@@ -330,6 +330,20 @@
break;
}
+ // **** -ignore-error-on-complete
+ if (0 == Platform_StringCompare(PwszCommandLineOption, CMD_IGNORE_ERROR_ON_COMPLETE, RG_LEN(CMD_IGNORE_ERROR_ON_COMPLETE), TRUE))
+ {
+ unReturnValue = CommandLineParser_CheckCommandLineOptions(PwszCommandLineOption);
+ if (RC_SUCCESS != unReturnValue)
+ break;
+
+ // Add IgnoreErrorOnComplete property, ignore return value because CommandLineParser_CheckCommandLineOptions takes care of doubled given options
+ IGNORE_RETURN_VALUE(PropertyStorage_AddKeyBooleanValuePair(PROPERTY_IGNORE_ERROR_ON_COMPLETE, TRUE));
+
+ unReturnValue = CommandLineParser_IncrementOptionCount();
+ break;
+ }
+
unReturnValue = RC_E_BAD_COMMANDLINE;
ERROR_STORE_FMT(unReturnValue, L"Unknown command line parameter (%ls).", PwszCommandLineOption);
}
@@ -657,6 +671,7 @@
BOOL fAccessMode = FALSE;
BOOL fConfigFileOption = FALSE;
BOOL fDryRunOption = FALSE;
+ BOOL fIgnoreErrorOnComplete = FALSE;
// Read Property storage
if (TRUE == PropertyStorage_ExistsElement(PROPERTY_HELP))
@@ -677,6 +692,8 @@
fConfigFileOption = TRUE;
if (TRUE == PropertyStorage_ExistsElement(PROPERTY_DRY_RUN))
fDryRunOption = TRUE;
+ if (TRUE == PropertyStorage_ExistsElement(PROPERTY_IGNORE_ERROR_ON_COMPLETE))
+ fIgnoreErrorOnComplete = TRUE;
// **** -help [Help]
if (0 == Platform_StringCompare(PwszCommand, CMD_HELP, RG_LEN(CMD_HELP), TRUE) ||
@@ -790,6 +807,15 @@
unReturnValue = RC_E_BAD_COMMANDLINE;
break;
}
+
+ // **** -ignore-error-on-complete [IgnoreErrorOnComplete]
+ if (0 == Platform_StringCompare(PwszCommand, CMD_IGNORE_ERROR_ON_COMPLETE, RG_LEN(CMD_IGNORE_ERROR_ON_COMPLETE), TRUE))
+ {
+ // Command line parameter 'ignore-error-on-complete' can be combined with any parameters, though has meaning only for 'update'
+ if (TRUE == fIgnoreErrorOnComplete) // And parameter 'ignore-error-on-complete' should not be given twice
+ unReturnValue = RC_E_BAD_COMMANDLINE;
+ break;
+ }
unReturnValue = RC_E_BAD_COMMANDLINE;
}
--- a/TPMFactoryUpd/PropertyDefines.h
+++ b/TPMFactoryUpd/PropertyDefines.h
@@ -68,6 +68,8 @@
#define PROPERTY_CONFIG_FIRMWARE_FOLDER_PATH L"FirmwareFolderPath"
/// Define for dry run property
#define PROPERTY_DRY_RUN L"DryRun"
+/// Define for IgnoreErrorOnComplete property
+#define PROPERTY_IGNORE_ERROR_ON_COMPLETE L"IgnoreErrorOnComplete"
#ifdef __cplusplus
}
--- a/TPMFactoryUpd/Resource.h
+++ b/TPMFactoryUpd/Resource.h
@@ -111,6 +111,7 @@
#define CMD_ACCESS_MODE L"access-mode"
#define CMD_CONFIG L"config"
#define CMD_DRY_RUN L"dry-run"
+#define CMD_IGNORE_ERROR_ON_COMPLETE L"ignore-error-on-complete"
// --------------- Help Output ---------------------
#define HELP_LINE1 L"Call: TPMFactoryUpd [parameter] [parameter] ..."
@@ -157,6 +158,8 @@
#define HELP_LINE42 L" (default value: /dev/tpm0)"
#define HELP_LINE43 L"\n-%ls" /* use with format CMD_DRY_RUN */
#define HELP_LINE44 L" Optional parameter. Do everything except actually updating the image."
+#define HELP_LINE45 L"\n-%ls" /* use with format CMD_IGNORE_ERROR_ON_COMPLETE */
+#define HELP_LINE46 L" Optional parameter. Ignores TPM_FAIL errors from FieldUpgradeComplete."
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
--- a/TPMFactoryUpd/Response.c
+++ b/TPMFactoryUpd/Response.c
@@ -1049,6 +1049,8 @@
#endif
CONSOLEIO_WRITE_BREAK_FMT(FALSE, HELP_LINE43, CMD_DRY_RUN);
CONSOLEIO_WRITE_BREAK(FALSE, HELP_LINE44);
+ CONSOLEIO_WRITE_BREAK_FMT(FALSE, HELP_LINE45, CMD_IGNORE_ERROR_ON_COMPLETE);
+ CONSOLEIO_WRITE_BREAK(FALSE, HELP_LINE46);
}
WHILE_FALSE_END;