int64_t n_tensors = 0;
if (ok && gr.read(ctx->version)) {
+ if (ok && ctx->version == 0) {
+ GGML_LOG_ERROR("%s: bad GGUF version: %" PRIu32 "\n", __func__, ctx->version);
+ ok = false;
+ }
+
/*
* bit layout is different when reading non-native endian models.
* assuming that the GGUF version is 3, the non-native endian model
* the last 4 hexadecimal digits to check if the model is the same
* endianness as the host system.
*/
- if ((ctx->version & 0x0000FFFF) == 0x00000000) {
+ if (ok && (ctx->version & 0x0000FFFF) == 0x00000000) {
GGML_LOG_ERROR("%s: failed to load model: this GGUF file version %" PRIu32 " is extremely large, is there a mismatch between the host and model endianness?\n", __func__, ctx->version);
- gguf_free(ctx);
- return nullptr;
+ ok = false;
}
- GGML_ASSERT(ctx->version > 0 && ctx->version <= 65535);
- if (ctx->version == 1) {
+ if (ok && ctx->version == 1) {
GGML_LOG_ERROR("%s: GGUFv1 is no longer supported, please use a more up-to-date version\n", __func__);
ok = false;
}
- if (ctx->version > GGUF_VERSION) {
+ if (ok && ctx->version > GGUF_VERSION) {
GGML_LOG_ERROR("%s: this GGUF file is version %" PRIu32 " but this software only supports up to version %d\n",
__func__, ctx->version, GGUF_VERSION);
ok = false;
enum handcrafted_file_type {
HANDCRAFTED_HEADER_BAD_MAGIC = 10,
+ HANDCRAFTED_HEADER_BAD_VERSION_0 = 15,
HANDCRAFTED_HEADER_BAD_VERSION_1 = 20,
HANDCRAFTED_HEADER_BAD_VERSION_FUTURE = 30,
HANDCRAFTED_HEADER_BAD_N_TENSORS = 40,
static std::string handcrafted_file_type_name(const enum handcrafted_file_type hft) {
switch (hft) {
case HANDCRAFTED_HEADER_BAD_MAGIC: return "HEADER_BAD_MAGIC";
+ case HANDCRAFTED_HEADER_BAD_VERSION_0: return "HEADER_BAD_VERSION_0";
case HANDCRAFTED_HEADER_BAD_VERSION_1: return "HEADER_BAD_VERSION_1";
case HANDCRAFTED_HEADER_BAD_VERSION_FUTURE: return "HEADER_BAD_VERSION_FUTURE";
case HANDCRAFTED_HEADER_BAD_N_KV: return "HEADER_BAD_N_KV";
helper_write(file, GGUF_MAGIC, 4);
}
- if (hft == HANDCRAFTED_HEADER_BAD_VERSION_1) {
+ if (hft == HANDCRAFTED_HEADER_BAD_VERSION_0) {
+ const uint32_t version = 0;
+ helper_write(file, version);
+ } else if (hft == HANDCRAFTED_HEADER_BAD_VERSION_1) {
const uint32_t version = 1;
helper_write(file, version);
} else if (hft == HANDCRAFTED_HEADER_BAD_VERSION_FUTURE) {
const std::vector<handcrafted_file_type> hfts = {
HANDCRAFTED_HEADER_BAD_MAGIC,
+ HANDCRAFTED_HEADER_BAD_VERSION_0,
HANDCRAFTED_HEADER_BAD_VERSION_1,
HANDCRAFTED_HEADER_BAD_VERSION_FUTURE,
HANDCRAFTED_HEADER_BAD_N_KV,