From cfd220bb54e467f6227217a6beb3c49e6c3ffd87 Mon Sep 17 00:00:00 2001
From: lordhavoc <lordhavoc@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Tue, 21 May 2002 02:32:04 +0000
Subject: [PATCH] validate animations in zym models

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@1855 d7cf8633-e32d-0410-b094-e92efae38249
---
 model_alias.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/model_alias.c b/model_alias.c
index eb5696a4..e80ee4db 100644
--- a/model_alias.c
+++ b/model_alias.c
@@ -774,7 +774,7 @@ static void zymswapintblock(int *m, int size)
 
 void Mod_LoadZymoticModel(model_t *mod, void *buffer)
 {
-	int i, pbase, *bonecount;
+	int i, pbase, *bonecount, numposes;
 	unsigned int count, a, b, c, *renderlist, *renderlistend;
 	rtexture_t **texture;
 	char *shadername;
@@ -845,6 +845,7 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
 	loadmodel->skinframes->glow = NULL;
 	loadmodel->skinframes->merged = NULL;
 	loadmodel->numskins = 1;
+	numposes = pheader->lump_poses.length / sizeof(float[3][4]) / pheader->numbones;
 
 	// go through the lumps, swapping things
 
@@ -867,6 +868,12 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
 		loadmodel->animscenes[i].framerate = scene->framerate;
 		loadmodel->animscenes[i].loop = (scene->flags & ZYMSCENEFLAG_NOLOOP) == 0;
 
+		if ((unsigned int) loadmodel->animscenes[i].firstframe >= numposes)
+			Host_Error("Mod_LoadZymoticModel: scene firstframe (%i) >= numposes (%i)\n", loadmodel->animscenes[i].firstframe, numposes);
+		if ((unsigned int) loadmodel->animscenes[i].firstframe + (unsigned int) loadmodel->animscenes[i].framecount > numposes)
+			Host_Error("Mod_LoadZymoticModel: scene firstframe (%i) + framecount (%i) >= numposes (%i)\n", loadmodel->animscenes[i].firstframe, loadmodel->animscenes[i].framecount, numposes);
+		if (loadmodel->animscenes[i].framerate < 0)
+			Host_Error("Mod_LoadZymoticModel: scene framerate (%f) < 0\n", loadmodel->animscenes[i].framerate);
 		scene++;
 	}
 
-- 
2.39.5