use calloc instead of malloc

This commit is contained in:
Johannes Gäßler 2024-12-04 17:24:35 +01:00
parent 096b847a0f
commit a8046c888a

View File

@ -6625,7 +6625,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
case GGUF_TYPE_FLOAT64: case GGUF_TYPE_FLOAT64:
case GGUF_TYPE_BOOL: case GGUF_TYPE_BOOL:
{ {
// prevent integer overflow in the malloc below // prevent integer overflow in the calloc below
if (kv->value.arr.n >= SIZE_MAX/gguf_type_size(kv->value.arr.type)) { if (kv->value.arr.n >= SIZE_MAX/gguf_type_size(kv->value.arr.type)) {
fprintf(stderr, "%s: array size is too large (%" PRIu64 ")\n", __func__, kv->value.arr.n); fprintf(stderr, "%s: array size is too large (%" PRIu64 ")\n", __func__, kv->value.arr.n);
fclose(file); fclose(file);
@ -6633,8 +6633,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
return NULL; return NULL;
} }
const size_t nbytes = kv->value.arr.n * gguf_type_size(kv->value.arr.type); kv->value.arr.data = calloc(kv->value.arr.n, gguf_type_size(kv->value.arr.type));
kv->value.arr.data = malloc(nbytes);
if (!kv->value.arr.data) { if (!kv->value.arr.data) {
fprintf(stderr, "%s: failed to allocate memory for array\n", __func__); fprintf(stderr, "%s: failed to allocate memory for array\n", __func__);
fclose(file); fclose(file);
@ -6642,11 +6641,11 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
return NULL; return NULL;
} }
ok = ok && gguf_fread_el(file, kv->value.arr.data, nbytes, &offset); ok = ok && gguf_fread_el(file, kv->value.arr.data, kv->value.arr.n * gguf_type_size(kv->value.arr.type), &offset);
} break; } break;
case GGUF_TYPE_STRING: case GGUF_TYPE_STRING:
{ {
// prevent integer overflow in the malloc below // prevent integer overflow in the calloc below
if (kv->value.arr.n >= SIZE_MAX/sizeof(struct gguf_str)) { if (kv->value.arr.n >= SIZE_MAX/sizeof(struct gguf_str)) {
fprintf(stderr, "%s: array size is too large (%" PRIu64 ")\n", __func__, kv->value.arr.n); fprintf(stderr, "%s: array size is too large (%" PRIu64 ")\n", __func__, kv->value.arr.n);
fclose(file); fclose(file);
@ -6654,7 +6653,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
return NULL; return NULL;
} }
kv->value.arr.data = malloc(kv->value.arr.n * sizeof(struct gguf_str)); kv->value.arr.data = calloc(kv->value.arr.n, sizeof(struct gguf_str));
if (!kv->value.arr.data) { if (!kv->value.arr.data) {
fprintf(stderr, "%s: failed to allocate memory for array\n", __func__); fprintf(stderr, "%s: failed to allocate memory for array\n", __func__);
fclose(file); fclose(file);
@ -7152,7 +7151,7 @@ static int gguf_get_or_add_key(struct gguf_context * ctx, const char * key) {
const int n_kv = gguf_get_n_kv(ctx); const int n_kv = gguf_get_n_kv(ctx);
ctx->kv = realloc(ctx->kv, (n_kv + 1) * sizeof(struct gguf_kv)); ctx->kv = realloc(ctx->kv, (n_kv + 1) * sizeof(struct gguf_kv));
GGML_ASSERT(ctx->kv); // potential memory leak GGML_ASSERT(ctx->kv); // detect potential memory leak
memset(&ctx->kv[n_kv], 0, sizeof(struct gguf_kv)); memset(&ctx->kv[n_kv], 0, sizeof(struct gguf_kv));
ctx->kv[n_kv].key.n = strlen(key); ctx->kv[n_kv].key.n = strlen(key);
ctx->kv[n_kv].key.data = strdup(key); ctx->kv[n_kv].key.data = strdup(key);
@ -7170,7 +7169,7 @@ void gguf_remove_key(struct gguf_context * ctx, const char * key) {
ctx->kv[i] = ctx->kv[i+1]; ctx->kv[i] = ctx->kv[i+1];
} }
ctx->kv = realloc(ctx->kv, (n_kv - 1) * sizeof(struct gguf_kv)); ctx->kv = realloc(ctx->kv, (n_kv - 1) * sizeof(struct gguf_kv));
GGML_ASSERT(ctx->kv); // potential memory leak GGML_ASSERT(ctx->kv); // detect potential memory leak
ctx->header.n_kv--; ctx->header.n_kv--;
} }
} }
@ -7268,7 +7267,7 @@ void gguf_set_arr_data(struct gguf_context * ctx, const char * key, enum gguf_ty
ctx->kv[idx].value.arr.type = type; ctx->kv[idx].value.arr.type = type;
ctx->kv[idx].value.arr.n = n; ctx->kv[idx].value.arr.n = n;
ctx->kv[idx].value.arr.data = realloc(ctx->kv[idx].value.arr.data, nbytes); ctx->kv[idx].value.arr.data = realloc(ctx->kv[idx].value.arr.data, nbytes);
GGML_ASSERT(ctx->kv[idx].value.arr.data); // potential memory leak GGML_ASSERT(ctx->kv[idx].value.arr.data); // detect potential memory leak
memcpy(ctx->kv[idx].value.arr.data, data, nbytes); memcpy(ctx->kv[idx].value.arr.data, data, nbytes);
} }
@ -7280,7 +7279,7 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING; ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
ctx->kv[idx].value.arr.n = n; ctx->kv[idx].value.arr.n = n;
ctx->kv[idx].value.arr.data = realloc(ctx->kv[idx].value.arr.data, nbytes); ctx->kv[idx].value.arr.data = realloc(ctx->kv[idx].value.arr.data, nbytes);
GGML_ASSERT(ctx->kv[idx].value.arr.data); // potential memory leak GGML_ASSERT(ctx->kv[idx].value.arr.data); // detect potential memory leak
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i]; struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
str->n = strlen(data[i]); str->n = strlen(data[i]);
@ -7308,7 +7307,7 @@ void gguf_set_kv(struct gguf_context * ctx, const struct gguf_context * src) {
case GGUF_TYPE_ARRAY: case GGUF_TYPE_ARRAY:
{ {
if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) { if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) {
const char ** data = GGML_MALLOC(src->kv[i].value.arr.n * sizeof(char *)); const char ** data = GGML_CALLOC(src->kv[i].value.arr.n, sizeof(char *));
for (uint64_t j = 0; j < src->kv[i].value.arr.n; ++j) { for (uint64_t j = 0; j < src->kv[i].value.arr.n; ++j) {
data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data; data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
} }
@ -7336,7 +7335,7 @@ void gguf_add_tensor(
const uint64_t idx = ctx->header.n_tensors; const uint64_t idx = ctx->header.n_tensors;
ctx->info = realloc(ctx->info, (idx + 1)*sizeof(struct gguf_tensor_info)); ctx->info = realloc(ctx->info, (idx + 1)*sizeof(struct gguf_tensor_info));
GGML_ASSERT(ctx->info); // potential memory leak GGML_ASSERT(ctx->info); // detect potential memory leak
ctx->info[idx].t = *tensor; ctx->info[idx].t = *tensor;
ctx->info[idx].offset = idx == 0 ? 0 : ctx->info[idx].offset = idx == 0 ? 0 :
ctx->info[idx - 1].offset + GGML_PAD(ggml_nbytes(&ctx->info[idx - 1].t), ctx->alignment); ctx->info[idx - 1].offset + GGML_PAD(ggml_nbytes(&ctx->info[idx - 1].t), ctx->alignment);
@ -7404,7 +7403,7 @@ static void gguf_buf_grow(struct gguf_buf * buf, size_t size) {
buf->size = 1.5f*(buf->offset + size); buf->size = 1.5f*(buf->offset + size);
if (buf->data) { if (buf->data) {
buf->data = realloc(buf->data, buf->size); buf->data = realloc(buf->data, buf->size);
GGML_ASSERT(buf->data); // potential memory leak GGML_ASSERT(buf->data); // detect potential memory leak
} }
} }
} }