Fix signed-int overflow in stack_reallocate
This fixes CVE-2026-41257.
This commit is contained in:
1 parent
d1a12569d9
commit
01b3cded76
1 file changed
+10
-4
+10
-4
@@ -2,8 +2,10 @@
|
|||||||
#define EXEC_STACK_H
|
#define EXEC_STACK_H
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
#include "jv_alloc.h"
|
#include "jv_alloc.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -81,15 +83,19 @@ static stack_ptr* stack_block_next(struct stack* s, stack_ptr p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void stack_reallocate(struct stack* s, size_t sz) {
|
static void stack_reallocate(struct stack* s, size_t sz) {
|
||||||
int old_mem_length = -(s->bound) + ALIGNMENT;
|
size_t old_mem_length = (size_t)(-(s->bound)) + ALIGNMENT;
|
||||||
char* old_mem_start = (s->mem_end != NULL) ? (s->mem_end - old_mem_length) : NULL;
|
char* old_mem_start = s->mem_end != NULL ? s->mem_end - old_mem_length : NULL;
|
||||||
|
|
||||||
int new_mem_length = align_round_up((old_mem_length + sz + 256) * 2);
|
size_t new_mem_length = align_round_up((old_mem_length + sz + 256) * 2);
|
||||||
|
if (new_mem_length > INT_MAX) {
|
||||||
|
fprintf(stderr, "jq: error: cannot allocate memory\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
char* new_mem_start = jv_mem_realloc(old_mem_start, new_mem_length);
|
char* new_mem_start = jv_mem_realloc(old_mem_start, new_mem_length);
|
||||||
memmove(new_mem_start + (new_mem_length - old_mem_length),
|
memmove(new_mem_start + (new_mem_length - old_mem_length),
|
||||||
new_mem_start, old_mem_length);
|
new_mem_start, old_mem_length);
|
||||||
s->mem_end = new_mem_start + new_mem_length;
|
s->mem_end = new_mem_start + new_mem_length;
|
||||||
s->bound = -(new_mem_length - ALIGNMENT);
|
s->bound = -(int)(new_mem_length - ALIGNMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static stack_ptr stack_push_block(struct stack* s, stack_ptr p, size_t sz) {
|
static stack_ptr stack_push_block(struct stack* s, stack_ptr p, size_t sz) {
|
||||||
|
|||||||
Reference in new issue
Block a user