Fixes buffer overrun

Problem
-------
The buffer given for payload serialization is 1024,
but we are currently using (1024 + 3) * sizeof(int)

Solution
--------
Reduce it way down, and fix a few things around unsigned vs int
pull/481/head
Eugene Yokota 2023-01-16 16:07:08 +07:00
parent fce8f8c3f6
commit 31aba1de6e
2 changed files with 13 additions and 9 deletions

10
src/stack.h vendored

@ -10,10 +10,11 @@
#define LOG(...) #define LOG(...)
#endif #endif
#define STACK_SIZE 1024 // Total payload size is 1024 bytes max
#define STACK_SIZE 100
typedef struct ScannerStack { typedef struct ScannerStack {
unsigned int stack[STACK_SIZE]; int stack[STACK_SIZE];
int top; int top;
int last_indentation_size; int last_indentation_size;
int last_newline_count; int last_newline_count;
@ -63,7 +64,10 @@ void printStack(ScannerStack *stack, char *msg) {
} }
unsigned serialiseStack(ScannerStack *stack, char *buf) { unsigned serialiseStack(ScannerStack *stack, char *buf) {
unsigned elements = isEmptyStack(stack) ? 0 : stack->top; int elements = isEmptyStack(stack) ? 0 : stack->top;
if (elements < 0) {
elements = 0;
}
unsigned result_length = (elements + 3) * sizeof(int); unsigned result_length = (elements + 3) * sizeof(int);
int *placement = (int *)buf; int *placement = (int *)buf;
memcpy(placement, stack->stack, elements * sizeof(int)); memcpy(placement, stack->stack, elements * sizeof(int));

@ -26,19 +26,19 @@ int main() {
assert(peekStack(stack) == -1); assert(peekStack(stack) == -1);
assert(isEmptyStack(stack)); assert(isEmptyStack(stack));
char *buf = malloc(2048); char *buf = malloc(1024);
for (int i = 0; i < 250; i++) { for (int i = 0; i < 100; i++) {
pushStack(stack, i); pushStack(stack, i);
} }
assert(serialiseStack(stack, buf) == sizeof(int) * 253); assert(serialiseStack(stack, buf) == sizeof(int) * 103);
ScannerStack *newStack = createStack(); ScannerStack *newStack = createStack();
deserialiseStack(newStack, buf, sizeof(int) * 253); deserialiseStack(newStack, buf, sizeof(int) * 103);
assert(newStack -> top == 250); assert(newStack -> top == 100);
assert(popStack(newStack) == 249); assert(popStack(newStack) == 99);
resetStack(newStack); resetStack(newStack);