Skip to content

Commit 83b72cb

Browse files
ggerganovslaren
andauthored
Merge pull request from GHSA-p5mv-gjc5-mwqv
* always use calloc clamp n_kv on failure to read a kv * ggml : alternative ctx->header.n_kv update --------- Co-authored-by: slaren <[email protected]>
1 parent d4a9afc commit 83b72cb

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

ggml.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20614,7 +20614,7 @@ static void gguf_free_kv(struct gguf_kv * kv) {
2061420614
}
2061520615

2061620616
struct gguf_context * gguf_init_empty(void) {
20617-
struct gguf_context * ctx = GGML_ALIGNED_MALLOC(sizeof(struct gguf_context));
20617+
struct gguf_context * ctx = GGML_CALLOC(1, sizeof(struct gguf_context));
2061820618

2061920619
memcpy(ctx->header.magic, GGUF_MAGIC, sizeof(ctx->header.magic));
2062020620
ctx->header.version = GGUF_VERSION;
@@ -20659,7 +20659,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2065920659

2066020660
bool ok = true;
2066120661

20662-
struct gguf_context * ctx = GGML_ALIGNED_MALLOC(sizeof(struct gguf_context));
20662+
struct gguf_context * ctx = GGML_CALLOC(1, sizeof(struct gguf_context));
2066320663

2066420664
// read the header
2066520665
{
@@ -20696,9 +20696,13 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2069620696

2069720697
// read the kv pairs
2069820698
{
20699-
ctx->kv = GGML_MALLOC(ctx->header.n_kv * sizeof(struct gguf_kv));
20699+
const uint64_t n_kv = ctx->header.n_kv;
2070020700

20701-
for (uint64_t i = 0; i < ctx->header.n_kv; ++i) {
20701+
// header.n_kv will hold the actual value of pairs that were successfully read in the loop below
20702+
ctx->header.n_kv = 0;
20703+
ctx->kv = GGML_CALLOC(n_kv, sizeof(struct gguf_kv));
20704+
20705+
for (uint64_t i = 0; i < n_kv; ++i) {
2070220706
struct gguf_kv * kv = &ctx->kv[i];
2070320707

2070420708
//fprintf(stderr, "%s: reading kv %d\n", __func__, i);
@@ -20747,7 +20751,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2074720751
return NULL;
2074820752
}
2074920753

20750-
kv->value.arr.data = GGML_MALLOC(kv->value.arr.n * gguf_type_size(kv->value.arr.type));
20754+
kv->value.arr.data = GGML_CALLOC(kv->value.arr.n, gguf_type_size(kv->value.arr.type));
2075120755

2075220756
ok = ok && gguf_fread_el(file, kv->value.arr.data, kv->value.arr.n * gguf_type_size(kv->value.arr.type), &offset);
2075320757
} break;
@@ -20761,7 +20765,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2076120765
return NULL;
2076220766
}
2076320767

20764-
kv->value.arr.data = GGML_MALLOC(kv->value.arr.n * sizeof(struct gguf_str));
20768+
kv->value.arr.data = GGML_CALLOC(kv->value.arr.n, sizeof(struct gguf_str));
2076520769

2076620770
for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
2076720771
ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
@@ -20777,6 +20781,8 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2077720781
if (!ok) {
2077820782
break;
2077920783
}
20784+
20785+
ctx->header.n_kv++;
2078020786
}
2078120787

2078220788
if (!ok) {
@@ -20789,7 +20795,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2078920795

2079020796
// read the tensor infos
2079120797
{
20792-
ctx->infos = GGML_MALLOC(ctx->header.n_tensors * sizeof(struct gguf_tensor_info));
20798+
ctx->infos = GGML_CALLOC(ctx->header.n_tensors, sizeof(struct gguf_tensor_info));
2079320799

2079420800
for (uint64_t i = 0; i < ctx->header.n_tensors; ++i) {
2079520801
struct gguf_tensor_info * info = &ctx->infos[i];
@@ -20810,6 +20816,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
2081020816
ok = ok && gguf_fread_el (file, &info->type, sizeof(info->type), &offset);
2081120817
ok = ok && gguf_fread_el (file, &info->offset, sizeof(info->offset), &offset);
2081220818

20819+
// TODO: return an error instead of crashing with GGML_ASSERT
2081320820
gguf_tensor_info_sanitize(info);
2081420821

2081520822
if (!ok) {
@@ -21291,7 +21298,7 @@ void gguf_set_arr_data(struct gguf_context * ctx, const char * key, enum gguf_ty
2129121298
ctx->kv[idx].type = GGUF_TYPE_ARRAY;
2129221299
ctx->kv[idx].value.arr.type = type;
2129321300
ctx->kv[idx].value.arr.n = n;
21294-
ctx->kv[idx].value.arr.data = GGML_MALLOC(n*gguf_type_size(type));
21301+
ctx->kv[idx].value.arr.data = GGML_CALLOC(n, gguf_type_size(type));
2129521302
memcpy(ctx->kv[idx].value.arr.data, data, n*gguf_type_size(type));
2129621303
}
2129721304

@@ -21301,7 +21308,7 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
2130121308
ctx->kv[idx].type = GGUF_TYPE_ARRAY;
2130221309
ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
2130321310
ctx->kv[idx].value.arr.n = n;
21304-
ctx->kv[idx].value.arr.data = GGML_MALLOC(n*sizeof(struct gguf_str));
21311+
ctx->kv[idx].value.arr.data = GGML_CALLOC(n, sizeof(struct gguf_str));
2130521312
for (int i = 0; i < n; i++) {
2130621313
struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
2130721314
str->n = strlen(data[i]);
@@ -21328,7 +21335,7 @@ void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
2132821335
case GGUF_TYPE_ARRAY:
2132921336
{
2133021337
if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) {
21331-
const char ** data = GGML_MALLOC(src->kv[i].value.arr.n*sizeof(char *));
21338+
const char ** data = GGML_CALLOC(src->kv[i].value.arr.n, sizeof(char *));
2133221339
for (uint32_t j = 0; j < src->kv[i].value.arr.n; j++) {
2133321340
data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
2133421341
}
@@ -21416,7 +21423,7 @@ struct gguf_buf {
2141621423

2141721424
static struct gguf_buf gguf_buf_init(size_t size) {
2141821425
struct gguf_buf buf = {
21419-
/*buf.data =*/ size == 0 ? NULL : GGML_MALLOC(size),
21426+
/*buf.data =*/ size == 0 ? NULL : GGML_CALLOC(1, size),
2142021427
/*buf.size =*/ size,
2142121428
/*buf.offset =*/ 0,
2142221429
};

0 commit comments

Comments
 (0)