Merge pull request #603 from NieDzejkob/rpn-realloc

reserveSpace: don't assume one doubling is enough
This commit is contained in:
Eldred Habert
2020-10-12 12:26:44 +02:00
committed by GitHub
2 changed files with 20 additions and 11 deletions

View File

@@ -46,17 +46,19 @@ static uint8_t *reserveSpace(struct Expression *expr, uint32_t size)
/* If there isn't enough room to reserve the space, realloc */ /* If there isn't enough room to reserve the space, realloc */
if (!expr->tRPN) if (!expr->tRPN)
expr->nRPNCapacity = 256; /* Initial size */ expr->nRPNCapacity = 256; /* Initial size */
else if (expr->nRPNCapacity >= MAXRPNLEN) while (expr->nRPNCapacity - expr->nRPNLength < size) {
/* if (expr->nRPNCapacity >= MAXRPNLEN)
* To avoid generating humongous object files, cap the /*
* size of RPN expressions * To avoid generating humongous object files, cap the
*/ * size of RPN expressions
fatalerror("RPN expression cannot grow larger than " */
EXPAND_AND_STR(MAXRPNLEN) " bytes\n"); fatalerror("RPN expression cannot grow larger than "
else if (expr->nRPNCapacity > MAXRPNLEN / 2) EXPAND_AND_STR(MAXRPNLEN) " bytes\n");
expr->nRPNCapacity = MAXRPNLEN; else if (expr->nRPNCapacity > MAXRPNLEN / 2)
else expr->nRPNCapacity = MAXRPNLEN;
expr->nRPNCapacity *= 2; else
expr->nRPNCapacity *= 2;
}
expr->tRPN = realloc(expr->tRPN, expr->nRPNCapacity); expr->tRPN = realloc(expr->tRPN, expr->nRPNCapacity);
if (!expr->tRPN) if (!expr->tRPN)

View File

@@ -27,3 +27,10 @@ X EQUS "{X7E}"
X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X
x: db 0 x: db 0
; this tests long RPN expressions being used as the RHS, as this once triggered
; a realloc bug
db 1+(x+X)
; likewise, a long symbol could result in an insufficient *initial* allocation
db A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+0+0