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(...)
#endif
#define STACK_SIZE 1024
// Total payload size is 1024 bytes max
#define STACK_SIZE 100
typedef struct ScannerStack {
unsigned int stack[STACK_SIZE];
int stack[STACK_SIZE];
int top;
int last_indentation_size;
int last_newline_count;
@ -63,7 +64,10 @@ void printStack(ScannerStack *stack, char *msg) {
}
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);
int *placement = (int *)buf;
memcpy(placement, stack->stack, elements * sizeof(int));

@ -26,19 +26,19 @@ int main() {
assert(peekStack(stack) == -1);
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);
}
assert(serialiseStack(stack, buf) == sizeof(int) * 253);
assert(serialiseStack(stack, buf) == sizeof(int) * 103);
ScannerStack *newStack = createStack();
deserialiseStack(newStack, buf, sizeof(int) * 253);
assert(newStack -> top == 250);
assert(popStack(newStack) == 249);
deserialiseStack(newStack, buf, sizeof(int) * 103);
assert(newStack -> top == 100);
assert(popStack(newStack) == 99);
resetStack(newStack);