Correct .modinfo section parsing
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 34s
Builds / ExectOS (amd64, release) (push) Successful in 32s
Builds / ExectOS (i686, debug) (push) Successful in 44s
Builds / ExectOS (i686, release) (push) Successful in 44s

This commit is contained in:
Aiken Harris 2025-08-25 12:07:49 +02:00
parent 0b40a3fb10
commit e99e563aff
Signed by: harraiken
GPG Key ID: C40F06CB7493C1F5

View File

@ -749,100 +749,96 @@ BlpGetModuleInfoStrings(IN PWCHAR SectionData,
EFI_STATUS Status;
PWCHAR *Array;
PWCHAR String;
ULONG DataSize;
/* Check input parameters */
InfoStrings = SectionData;
if(!InfoStrings || !SectionSize)
{
/* Invalid input parameters */
*ModInfo = NULL;
*InfoCount = 0;
return STATUS_EFI_INVALID_PARAMETER;
}
/* Skip zero padding */
while(InfoStrings[0] == L'\0' && SectionSize > 1)
/* Calculate the size of the data based on the size of the section */
DataSize = SectionSize / sizeof(WCHAR);
/* Skip zero padding at the beginning */
while(DataSize > 0 && *InfoStrings == L'\0')
{
/* Get next character and decrement section size */
InfoStrings++;
SectionSize--;
DataSize--;
}
/* Make sure there is at least one string available */
if(SectionSize <= 1)
if(DataSize < 1)
{
/* No strings found */
*ModInfo = NULL;
*InfoCount = 0;
return STATUS_EFI_END_OF_FILE;
}
/* Count number of strings */
Index = 0;
Count = 0;
while(Index < SectionSize)
while(Index < DataSize)
{
/* Get to the next string */
if(InfoStrings[Index] != L'\0')
{
/* Get next character */
Index++;
continue;
}
/* Found start of a new string */
Count++;
/* Skip zero padding */
while(InfoStrings[Index] == L'\0' && Index < SectionSize)
/* Go to the end of the string */
while(Index < DataSize && InfoStrings[Index] != L'\0')
{
Index++;
}
/* Skip all null terminators */
while(Index < DataSize && InfoStrings[Index] == L'\0')
{
/* Get next character */
Index++;
}
/* New string found, increment counter */
Count++;
}
/* Make sure there is no missing string */
if(InfoStrings[Index - 1] != L'\0')
{
/* One more string available */
Count++;
}
/* Allocate memory for array of strings */
Status = BlAllocateMemoryPool(SectionSize + 1 + sizeof(PWCHAR) * (Count + 1), (PVOID *)&Array);
/* Allocate memory for the pointer array and the string data */
Status = BlAllocateMemoryPool(sizeof(PWCHAR) * (Count + 1) + (DataSize + 1) * sizeof(WCHAR), (PVOID *)&Array);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to allocate memory */
return STATUS_EFI_OUT_OF_RESOURCES;
}
/* Allocate memory and copy strings read from '.modinfo' section */
BlAllocateMemoryPool(SectionSize, (PVOID*)&String);
RtlCopyMemory(String, InfoStrings, SectionSize);
/* The string buffer is located right after the pointer array */
String = (PWCHAR)(Array + Count + 1);
/* Make sure last string is NULL-terminated */
/* Copy the raw string data */
RtlCopyMemory(String, InfoStrings, DataSize * sizeof(WCHAR));
/* Ensure the entire buffer is null-terminated for safety */
String[DataSize] = L'\0';
/* Set the last element of the pointer array to NULL */
Array[Count] = NULL;
Array[0] = String;
/* Parse strings into array */
/* Populate the array with pointers to the strings within the buffer */
Index = 0;
ArrayIndex = 1;
while(Index < SectionSize && ArrayIndex < Count)
ArrayIndex = 0;
while(Index < DataSize && ArrayIndex < Count)
{
/* Get to the next string */
if(String[Index] != L'\0')
{
/* Get next character */
Index++;
continue;
}
/* Set pointer to the beginning of the string */
Array[ArrayIndex++] = &String[Index];
/* Skip zero padding */
while(InfoStrings[Index] == L'\0' && Index < SectionSize)
/* Find the end of the current string */
while(Index < DataSize && String[Index] != L'\0')
{
/* Get next character */
Index++;
}
/* Push string into array */
Array[ArrayIndex] = &String[Index];
ArrayIndex++;
/* Skip all null terminators to find the beginning of the next string */
while(Index < DataSize && String[Index] == L'\0')
{
Index++;
}
}
/* Return array of strings and its size */