From 20f913d119b8072dde388b6e53571f55b21cd42a Mon Sep 17 00:00:00 2001 From: Aaron Teo Date: Sun, 1 Jun 2025 22:53:57 +0800 Subject: [PATCH] ggml: check if non-native endian model is being loaded (llama/13943) * gguf: prevent non-native endian models from being loaded Signed-off-by: Aaron Teo * gguf: update error message Signed-off-by: Aaron Teo * gguf: make the non-native endian check more verbose Signed-off-by: Aaron Teo * ggml: move ggml_assert location Signed-off-by: Aaron Teo * ggml: reword the endianness check error message Signed-off-by: Aaron Teo --------- Signed-off-by: Aaron Teo --- ggml/src/gguf.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ggml/src/gguf.cpp b/ggml/src/gguf.cpp index 8667a80b..dab228e1 100644 --- a/ggml/src/gguf.cpp +++ b/ggml/src/gguf.cpp @@ -347,6 +347,20 @@ struct gguf_context * gguf_init_from_file_impl(FILE * file, struct gguf_init_par int64_t n_tensors = 0; if (ok && gr.read(ctx->version)) { + /* + * bit layout is different when reading non-native endian models. + * assuming that the GGUF version is 3, the non-native endian model + * would read it as 0x30000000. we can use the AND operation against + * the last 4 hexadecimal digits to check if the model is the same + * endianness as the host system. + */ + if ((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; + } + + GGML_ASSERT(ctx->version > 0 && ctx->version <= 65535); if (ctx->version == 1) { GGML_LOG_ERROR("%s: GGUFv1 is no longer supported, please use a more up-to-date version\n", __func__); ok = false;