Fixed use-after-free in Assembler

Use after free occurred in main() in the case that a program being assembled was longer than the initially allocated intermediate array.
This commit is contained in:
Anachronaut
2026-04-27 16:58:43 -04:00
committed by GitHub
parent 49fd342135
commit b50210d127
4 changed files with 16 additions and 16 deletions
+1 -1
View File
@@ -97,7 +97,7 @@ int main(int argc, char *argv[]) {
char *fileName = argv[1]; char *fileName = argv[1];
int index = 0; int index = 0;
loadFile(intermediateArray, fileName, &index, &arraySize); loadFile(&intermediateArray, fileName, &index, &arraySize);
populateLabelTable(intermediateArray, index); populateLabelTable(intermediateArray, index);
fillInLabelAddresses(intermediateArray, index); fillInLabelAddresses(intermediateArray, index);
populateOutputBuffers(intermediateArray, index, Program, &programLength, Data, &dataLength); populateOutputBuffers(intermediateArray, index, Program, &programLength, Data, &dataLength);
+13 -13
View File
@@ -44,7 +44,7 @@ void addIncludedFile(const char *fileName) {
} }
} }
int loadFile(intermediateElement *intermediateArray, char *fileName, int *intermediateIndex, size_t *arraySize){ int loadFile(intermediateElement **intermediateArray, char *fileName, int *intermediateIndex, size_t *arraySize){
// Initial setup. // Initial setup.
addIncludedFile(fileName); addIncludedFile(fileName);
int status = NOWHERE; int status = NOWHERE;
@@ -56,10 +56,10 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
exit(1); exit(1);
} }
// Read off tokens. // Read off tokens.
while (readToken(&intermediateArray[*intermediateIndex], file, &lineNumber)) { while (readToken(&(*intermediateArray)[*intermediateIndex], file, &lineNumber)) {
if (*intermediateIndex >= *arraySize - 1) { if (*intermediateIndex >= *arraySize - 1) {
*arraySize *= 2; // Double the size of the array *arraySize *= 2; // Double the size of the array
intermediateArray = realloc(intermediateArray, *arraySize * sizeof(intermediateElement)); *intermediateArray = realloc(*intermediateArray, *arraySize * sizeof(intermediateElement));
if (!intermediateArray) { if (!intermediateArray) {
fprintf(stderr, RED "Error: Memory reallocation failed.\n" RESET); fprintf(stderr, RED "Error: Memory reallocation failed.\n" RESET);
exit(1); exit(1);
@@ -67,10 +67,10 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
} }
//printf("Token number %d\n", intermediateIndex); //printf("Token number %d\n", intermediateIndex);
// Go ahead and mark what we already know about this token. // Go ahead and mark what we already know about this token.
intermediateArray[*intermediateIndex].fileName = fileName; (*intermediateArray)[*intermediateIndex].fileName = fileName;
intermediateArray[*intermediateIndex].lineNumber = lineNumber; (*intermediateArray)[*intermediateIndex].lineNumber = lineNumber;
// Take a look at it and determine what it is. // Take a look at it and determine what it is.
int testValue = checkIfKeyword(&intermediateArray[*intermediateIndex]); int testValue = checkIfKeyword(&(*intermediateArray)[*intermediateIndex]);
if(testValue > 0) { if(testValue > 0) {
switch (testValue){ switch (testValue){
case KEYWORD_INCLUDE: case KEYWORD_INCLUDE:
@@ -78,8 +78,8 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
status = NOWHERE; status = NOWHERE;
// Get the filename and load up the file. // Get the filename and load up the file.
(*intermediateIndex)++; (*intermediateIndex)++;
readToken(&intermediateArray[*intermediateIndex], file, &lineNumber); readToken(&(*intermediateArray)[*intermediateIndex], file, &lineNumber);
char *includeFile = intermediateArray[*intermediateIndex].token; char *includeFile = (*intermediateArray)[*intermediateIndex].token;
if (isFileIncluded(includeFile)) { if (isFileIncluded(includeFile)) {
fprintf(stderr, RED "Error: File %s is included more than once.\n" RESET, includeFile); fprintf(stderr, RED "Error: File %s is included more than once.\n" RESET, includeFile);
printf(" File: %s at line %d.\n", fileName, lineNumber); printf(" File: %s at line %d.\n", fileName, lineNumber);
@@ -97,7 +97,7 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
break; break;
} }
// Next, check to see if it's an instruction. // Next, check to see if it's an instruction.
} else if (checkIfInstruction(&intermediateArray[*intermediateIndex])) { } else if (checkIfInstruction(&(*intermediateArray)[*intermediateIndex])) {
// We should check if we're set up to mark this for the Program Segment. // We should check if we're set up to mark this for the Program Segment.
if (status != PROGRAM) { if (status != PROGRAM) {
fprintf(stderr, RED "Error: Attempting to assemble outside the Program Segment.\n Did you forget to use the #Program keyword?\n" RESET); fprintf(stderr, RED "Error: Attempting to assemble outside the Program Segment.\n Did you forget to use the #Program keyword?\n" RESET);
@@ -105,7 +105,7 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
exit(1); exit(1);
} }
// Next, check if it's a literal value. // Next, check if it's a literal value.
} else if (checkIfLiteralValue(&intermediateArray[*intermediateIndex])) { } else if (checkIfLiteralValue(&(*intermediateArray)[*intermediateIndex])) {
// We should check to make sure we have a destination for it. // We should check to make sure we have a destination for it.
if (status == NOWHERE) { if (status == NOWHERE) {
fprintf(stderr, RED "Error: Attempting to write a value to nowhere!\n Did you forget to use the #Program or #Data keyword?\n" RESET); fprintf(stderr, RED "Error: Attempting to write a value to nowhere!\n Did you forget to use the #Program or #Data keyword?\n" RESET);
@@ -114,8 +114,8 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
} }
// Finally, check if it's a label or label definition. // Finally, check if it's a label or label definition.
// First, make sure it hasn't already been marked as a string literal. // First, make sure it hasn't already been marked as a string literal.
} else if (intermediateArray[*intermediateIndex].type != STRING) { } else if ((*intermediateArray)[*intermediateIndex].type != STRING) {
if (checkIfLabel(&intermediateArray[*intermediateIndex])) { if (checkIfLabel(&(*intermediateArray)[*intermediateIndex])) {
if (status == NOWHERE) { if (status == NOWHERE) {
fprintf(stderr, RED "Error: Attempting to create or use a label nowhere!\n Did you forget to use the #Program or #Data keyword?\n" RESET); fprintf(stderr, RED "Error: Attempting to create or use a label nowhere!\n Did you forget to use the #Program or #Data keyword?\n" RESET);
printf(" File: %s at line %d.\n", fileName, lineNumber); printf(" File: %s at line %d.\n", fileName, lineNumber);
@@ -123,7 +123,7 @@ int loadFile(intermediateElement *intermediateArray, char *fileName, int *interm
} }
} }
} }
intermediateArray[*intermediateIndex].destination = status; (*intermediateArray)[*intermediateIndex].destination = status;
(*intermediateIndex)++; (*intermediateIndex)++;
} }
return 0; return 0;
+1 -1
View File
@@ -14,7 +14,7 @@
void freeIncludeList(); void freeIncludeList();
int loadFile(intermediateElement *intermediateArray, char *fileName, int *intermediateIndex, size_t *arraySize); int loadFile(intermediateElement **intermediateArray, char *fileName, int *intermediateIndex, size_t *arraySize);
#endif // FIRSTPASS_H #endif // FIRSTPASS_H
+1 -1
View File
@@ -195,5 +195,5 @@ void writeOutputFile(const char *outputFileName, uint8_t *Program, int programCo
fclose(outputFile); fclose(outputFile);
printf("Successfully wrote SplitBit binary to \"%s\".\n", outputFileName); printf("Successfully wrote SplitBit binary to \"%s\".\n", outputFileName);
printf(GREEN " Program Segment size: %d bytes.\n Data Segment size: %d bytes.\n Total size: %d bytes." RESET, programCount, dataCount, (programCount+dataCount+10)); printf(GREEN " Program Segment size: %d bytes.\n Data Segment size: %d bytes.\n Total size: %d bytes.\n" RESET, programCount, dataCount, (programCount+dataCount+10));
} }