value pair. Block is left updated and\r
Progress points at the '&' preceding the first\r
non-<BlockName>.\r
+ @retval EFI_DEVICE_ERROR Block not large enough. Progress undefined.\r
+ @retval EFI_NOT_FOUND Target for the specified routing data was not found.\r
+ Progress points to the "G" in "GUID" of the errant\r
+ routing data.\r
\r
**/\r
EFI_STATUS\r
UINTN Width;\r
UINT8 *Value;\r
UINTN BufferSize;\r
+ UINTN MaxBlockSize;\r
\r
if (This == NULL || BlockSize == NULL || Progress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (ConfigResp == NULL || Block == NULL) {\r
- *Progress = ConfigResp;\r
+ *Progress = ConfigResp;\r
+ if (ConfigResp == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
StringPtr = ConfigResp;\r
BufferSize = *BlockSize;\r
Value = NULL;\r
+ MaxBlockSize = 0;\r
\r
//\r
// Jump <ConfigHdr>\r
//\r
// Update the Block with configuration info\r
//\r
-\r
- if (Offset + Width > BufferSize) {\r
- return EFI_DEVICE_ERROR;\r
+ if ((Block != NULL) && (Offset + Width <= BufferSize)) {\r
+ CopyMem (Block + Offset, Value, Width);\r
+ }\r
+ if (Offset + Width > MaxBlockSize) {\r
+ MaxBlockSize = Offset + Width;\r
}\r
-\r
- CopyMem (Block + Offset, Value, Width);\r
- *BlockSize = Offset + Width - 1;\r
\r
FreePool (Value);\r
Value = NULL;\r
}\r
\r
*Progress = StringPtr + StrLen (StringPtr);\r
+ *BlockSize = MaxBlockSize - 1;\r
+\r
+ if (MaxBlockSize > BufferSize) {\r
+ *BlockSize = MaxBlockSize;\r
+ if (Block != NULL) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ }\r
+\r
+ if (Block == NULL) {\r
+ *Progress = ConfigResp;\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
return EFI_SUCCESS;\r
\r
Exit:\r