@@ -20614,7 +20614,7 @@ static void gguf_free_kv(struct gguf_kv * kv) {
20614
20614
}
20615
20615
20616
20616
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));
20618
20618
20619
20619
memcpy(ctx->header.magic, GGUF_MAGIC, sizeof(ctx->header.magic));
20620
20620
ctx->header.version = GGUF_VERSION;
@@ -20659,7 +20659,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
20659
20659
20660
20660
bool ok = true;
20661
20661
20662
- struct gguf_context * ctx = GGML_ALIGNED_MALLOC( sizeof(struct gguf_context));
20662
+ struct gguf_context * ctx = GGML_CALLOC(1, sizeof(struct gguf_context));
20663
20663
20664
20664
// read the header
20665
20665
{
@@ -20696,9 +20696,13 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
20696
20696
20697
20697
// read the kv pairs
20698
20698
{
20699
- ctx->kv = GGML_MALLOC( ctx->header.n_kv * sizeof(struct gguf_kv)) ;
20699
+ const uint64_t n_kv = ctx->header.n_kv;
20700
20700
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) {
20702
20706
struct gguf_kv * kv = &ctx->kv[i];
20703
20707
20704
20708
//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
20747
20751
return NULL;
20748
20752
}
20749
20753
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));
20751
20755
20752
20756
ok = ok && gguf_fread_el(file, kv->value.arr.data, kv->value.arr.n * gguf_type_size(kv->value.arr.type), &offset);
20753
20757
} break;
@@ -20761,7 +20765,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
20761
20765
return NULL;
20762
20766
}
20763
20767
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));
20765
20769
20766
20770
for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
20767
20771
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
20777
20781
if (!ok) {
20778
20782
break;
20779
20783
}
20784
+
20785
+ ctx->header.n_kv++;
20780
20786
}
20781
20787
20782
20788
if (!ok) {
@@ -20789,7 +20795,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
20789
20795
20790
20796
// read the tensor infos
20791
20797
{
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));
20793
20799
20794
20800
for (uint64_t i = 0; i < ctx->header.n_tensors; ++i) {
20795
20801
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
20810
20816
ok = ok && gguf_fread_el (file, &info->type, sizeof(info->type), &offset);
20811
20817
ok = ok && gguf_fread_el (file, &info->offset, sizeof(info->offset), &offset);
20812
20818
20819
+ // TODO: return an error instead of crashing with GGML_ASSERT
20813
20820
gguf_tensor_info_sanitize(info);
20814
20821
20815
20822
if (!ok) {
@@ -21291,7 +21298,7 @@ void gguf_set_arr_data(struct gguf_context * ctx, const char * key, enum gguf_ty
21291
21298
ctx->kv[idx].type = GGUF_TYPE_ARRAY;
21292
21299
ctx->kv[idx].value.arr.type = type;
21293
21300
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));
21295
21302
memcpy(ctx->kv[idx].value.arr.data, data, n*gguf_type_size(type));
21296
21303
}
21297
21304
@@ -21301,7 +21308,7 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
21301
21308
ctx->kv[idx].type = GGUF_TYPE_ARRAY;
21302
21309
ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
21303
21310
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));
21305
21312
for (int i = 0; i < n; i++) {
21306
21313
struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
21307
21314
str->n = strlen(data[i]);
@@ -21328,7 +21335,7 @@ void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
21328
21335
case GGUF_TYPE_ARRAY:
21329
21336
{
21330
21337
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 *));
21332
21339
for (uint32_t j = 0; j < src->kv[i].value.arr.n; j++) {
21333
21340
data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
21334
21341
}
@@ -21416,7 +21423,7 @@ struct gguf_buf {
21416
21423
21417
21424
static struct gguf_buf gguf_buf_init(size_t size) {
21418
21425
struct gguf_buf buf = {
21419
- /*buf.data =*/ size == 0 ? NULL : GGML_MALLOC( size),
21426
+ /*buf.data =*/ size == 0 ? NULL : GGML_CALLOC(1, size),
21420
21427
/*buf.size =*/ size,
21421
21428
/*buf.offset =*/ 0,
21422
21429
};
0 commit comments