model: assert nextn_predict_layers to prevent underflow (#20783)
Address GHSA-645x-v54x-34w8. When nextn_predict_layers >= n_layer, n_layer - nextn_predict_layers can underflow (unsigned wrap), which corrupts n_layer_kv_from_start. Assert nextn_predict_layers immediately after parsing the GGUF key. Found-by: Pwno
This commit is contained in:
parent
ab9d4c3678
commit
3adbef7776
|
|
@ -1673,6 +1673,7 @@ void llama_model::load_hparams(llama_model_loader & ml) {
|
||||||
|
|
||||||
// NextN/MTP parameters (GLM-OCR)
|
// NextN/MTP parameters (GLM-OCR)
|
||||||
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
||||||
|
GGML_ASSERT(hparams.nextn_predict_layers < hparams.n_layer && "nextn_predict_layers must be < n_layer");
|
||||||
|
|
||||||
// TODO: when MTP is implemented, this should probably be updated if needed
|
// TODO: when MTP is implemented, this should probably be updated if needed
|
||||||
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
||||||
|
|
@ -1706,6 +1707,7 @@ void llama_model::load_hparams(llama_model_loader & ml) {
|
||||||
|
|
||||||
// NextN/MTP parameters
|
// NextN/MTP parameters
|
||||||
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
||||||
|
GGML_ASSERT(hparams.nextn_predict_layers < hparams.n_layer && "nextn_predict_layers must be < n_layer");
|
||||||
|
|
||||||
// TODO: when MTP is implemented, this should probably be updated if needed
|
// TODO: when MTP is implemented, this should probably be updated if needed
|
||||||
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
||||||
|
|
@ -1752,6 +1754,7 @@ void llama_model::load_hparams(llama_model_loader & ml) {
|
||||||
|
|
||||||
// NextN/MTP parameters
|
// NextN/MTP parameters
|
||||||
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
||||||
|
GGML_ASSERT(hparams.nextn_predict_layers < hparams.n_layer && "nextn_predict_layers must be < n_layer");
|
||||||
|
|
||||||
// TODO: when MTP is implemented, this should probably be updated if needed
|
// TODO: when MTP is implemented, this should probably be updated if needed
|
||||||
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
||||||
|
|
@ -1926,6 +1929,7 @@ void llama_model::load_hparams(llama_model_loader & ml) {
|
||||||
ml.get_key(LLM_KV_LEADING_DENSE_BLOCK_COUNT, hparams.n_layer_dense_lead, false);
|
ml.get_key(LLM_KV_LEADING_DENSE_BLOCK_COUNT, hparams.n_layer_dense_lead, false);
|
||||||
|
|
||||||
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
||||||
|
GGML_ASSERT(hparams.nextn_predict_layers < hparams.n_layer && "nextn_predict_layers must be < n_layer");
|
||||||
|
|
||||||
switch (hparams.n_layer) {
|
switch (hparams.n_layer) {
|
||||||
case 32: type = LLM_TYPE_30B_A3B; break;
|
case 32: type = LLM_TYPE_30B_A3B; break;
|
||||||
|
|
@ -2108,6 +2112,7 @@ void llama_model::load_hparams(llama_model_loader & ml) {
|
||||||
ml.get_key(LLM_KV_EXPERT_WEIGHTS_NORM, hparams.expert_weights_norm, false);
|
ml.get_key(LLM_KV_EXPERT_WEIGHTS_NORM, hparams.expert_weights_norm, false);
|
||||||
ml.get_key(LLM_KV_EXPERT_GATING_FUNC, hparams.expert_gating_func);
|
ml.get_key(LLM_KV_EXPERT_GATING_FUNC, hparams.expert_gating_func);
|
||||||
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
|
||||||
|
GGML_ASSERT(hparams.nextn_predict_layers < hparams.n_layer && "nextn_predict_layers must be < n_layer");
|
||||||
|
|
||||||
// TODO: when MTP is implemented, this should probably be updated if needed
|
// TODO: when MTP is implemented, this should probably be updated if needed
|
||||||
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
hparams.n_layer_kv_from_start = hparams.n_layer - hparams.nextn_predict_layers;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue