Fix assertion failure on too many parameters in a nested function (#3663)
A call passing more than 4095 arguments at the start of a nested function body aborted jq after reporting the compile errors, with "Assertion failed: (nemb > 0 && sz > 0), function jv_mem_calloc" and exit status 134. Stop compiling a function before its bytecode is allocated when it has compile errors, since the bytecode is only generated and used when compilation succeeds. jq now prints the same compile errors followed by "jq: 2 compile errors" and exits with status 3, as it does for other compile errors, instead of crashing.
This commit is contained in:
1 parent
04042494cf
commit
a5323a369c
2 files changed
+21
-1
No files matched your search
+7
-1
@@ -1306,12 +1306,18 @@ static int compile(struct bytecode* bc, block b, struct locfile* lf, jv args, jv
|
||||
bc->nsubfunctions = 0;
|
||||
bc->subfunctions = 0;
|
||||
}
|
||||
if (errors) {
|
||||
bc->code = 0;
|
||||
bc->constants = jv_invalid();
|
||||
block_free(b);
|
||||
return errors;
|
||||
}
|
||||
uint16_t* code = jv_mem_calloc(bc->codelen, sizeof(uint16_t));
|
||||
bc->code = code;
|
||||
pos = 0;
|
||||
jv constant_pool = jv_array();
|
||||
int maxvar = -1;
|
||||
if (!errors) for (inst* curr = b.first; curr; curr = curr->next) {
|
||||
for (inst* curr = b.first; curr; curr = curr->next) {
|
||||
const struct opcode_description* op = opcode_describe(curr->op);
|
||||
if (op->length == 0)
|
||||
continue;
|
||||
|
||||
Reference in new issue
Block a user