mirror of
https://github.com/rehlds/rehlds.git
synced 2025-04-16 22:32:30 +03:00
Added more check for possible numleaf overflow
Minor refactoring
This commit is contained in:
parent
d6ebe82833
commit
14b56e0514
@ -170,7 +170,7 @@ byte *BSPModel::LeafPVS(mleaf_t *leaf)
|
|||||||
|
|
||||||
byte *BSPModel::DecompressVis(unsigned char *in)
|
byte *BSPModel::DecompressVis(unsigned char *in)
|
||||||
{
|
{
|
||||||
static unsigned char decompressed[MODEL_MAX_PVS];
|
static unsigned char decompressed[MAX_MAP_LEAFS / 8];
|
||||||
if (in == nullptr) {
|
if (in == nullptr) {
|
||||||
return m_novis;
|
return m_novis;
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "l_studio.h"
|
#include "l_studio.h"
|
||||||
#include "edict.h"
|
#include "edict.h"
|
||||||
|
#include "bspfile.h"
|
||||||
|
|
||||||
// values for model_t's needload
|
// values for model_t's needload
|
||||||
#define NL_PRESENT 0
|
#define NL_PRESENT 0
|
||||||
@ -87,9 +88,7 @@ private:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
model_t m_model;
|
model_t m_model;
|
||||||
|
byte m_novis[MAX_MAP_LEAFS / 8];
|
||||||
enum { MODEL_MAX_PVS = 1024 };
|
|
||||||
byte m_novis[MODEL_MAX_PVS];
|
|
||||||
byte *m_base;
|
byte *m_base;
|
||||||
|
|
||||||
int m_visframecount;
|
int m_visframecount;
|
||||||
|
@ -31,17 +31,17 @@
|
|||||||
unsigned char *gPAS;
|
unsigned char *gPAS;
|
||||||
unsigned char *gPVS;
|
unsigned char *gPVS;
|
||||||
int gPVSRowBytes;
|
int gPVSRowBytes;
|
||||||
unsigned char mod_novis[MODEL_MAX_PVS];
|
unsigned char mod_novis[MAX_MAP_LEAFS / 8];
|
||||||
|
|
||||||
void Mod_Init(void)
|
void Mod_Init(void)
|
||||||
{
|
{
|
||||||
SW_Mod_Init();
|
SW_Mod_Init();
|
||||||
Q_memset(mod_novis, 255, MODEL_MAX_PVS);
|
Q_memset(mod_novis, 0xFF, MAX_MAP_LEAFS / 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model)
|
unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model)
|
||||||
{
|
{
|
||||||
static unsigned char decompressed[MODEL_MAX_PVS];
|
static unsigned char decompressed[MAX_MAP_LEAFS / 8];
|
||||||
|
|
||||||
if (in == NULL)
|
if (in == NULL)
|
||||||
{
|
{
|
||||||
|
@ -29,15 +29,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "maintypes.h"
|
#include "maintypes.h"
|
||||||
#include "model.h"
|
|
||||||
|
|
||||||
// Looks like no more than 8096 visibility leafs per world model
|
|
||||||
const int MODEL_MAX_PVS = 1024;
|
|
||||||
|
|
||||||
extern unsigned char *gPAS;
|
extern unsigned char *gPAS;
|
||||||
extern unsigned char *gPVS;
|
extern unsigned char *gPVS;
|
||||||
extern int gPVSRowBytes;
|
extern int gPVSRowBytes;
|
||||||
extern unsigned char mod_novis[MODEL_MAX_PVS];
|
|
||||||
|
|
||||||
void Mod_Init(void);
|
void Mod_Init(void);
|
||||||
unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model);
|
unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model);
|
||||||
|
@ -405,7 +405,6 @@ enum GameType_e
|
|||||||
|
|
||||||
extern GameType_e g_eGameType;
|
extern GameType_e g_eGameType;
|
||||||
|
|
||||||
extern int fatbytes;
|
|
||||||
extern int giNextUserMsg;
|
extern int giNextUserMsg;
|
||||||
extern int hashstrings_collisions;
|
extern int hashstrings_collisions;
|
||||||
|
|
||||||
@ -418,10 +417,6 @@ extern delta_t *g_pweapondelta;
|
|||||||
extern delta_t *g_pusercmddelta;
|
extern delta_t *g_pusercmddelta;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern unsigned char fatpvs[1024];
|
|
||||||
extern int fatpasbytes;
|
|
||||||
extern unsigned char fatpas[1024];
|
|
||||||
|
|
||||||
extern int gPacketSuppressed;
|
extern int gPacketSuppressed;
|
||||||
|
|
||||||
extern char localinfo[MAX_LOCALINFO];
|
extern char localinfo[MAX_LOCALINFO];
|
||||||
|
@ -4030,9 +4030,10 @@ void SV_EmitEvents_internal(client_t *cl, packet_entities_t *pack, sizebuf_t *ms
|
|||||||
}
|
}
|
||||||
|
|
||||||
int fatbytes;
|
int fatbytes;
|
||||||
unsigned char fatpvs[1024];
|
unsigned char fatpvs[MAX_MAP_LEAFS / 8];
|
||||||
|
|
||||||
int fatpasbytes;
|
int fatpasbytes;
|
||||||
unsigned char fatpas[1024];
|
unsigned char fatpas[MAX_MAP_LEAFS / 8];
|
||||||
|
|
||||||
void SV_AddToFatPVS(vec_t *org, mnode_t *node)
|
void SV_AddToFatPVS(vec_t *org, mnode_t *node)
|
||||||
{
|
{
|
||||||
@ -4074,6 +4075,9 @@ unsigned char* EXT_FUNC SV_FatPVS(float *org)
|
|||||||
#endif // REHLDS_FIXES
|
#endif // REHLDS_FIXES
|
||||||
fatbytes = (g_psv.worldmodel->numleafs + 31) >> 3;
|
fatbytes = (g_psv.worldmodel->numleafs + 31) >> 3;
|
||||||
|
|
||||||
|
if (fatbytes >= (MAX_MAP_LEAFS / 8))
|
||||||
|
Sys_Error("%s: MAX_MAP_LEAFS limit exceeded\n", __func__);
|
||||||
|
|
||||||
Q_memset(fatpvs, 0, fatbytes);
|
Q_memset(fatpvs, 0, fatbytes);
|
||||||
SV_AddToFatPVS(org, g_psv.worldmodel->nodes);
|
SV_AddToFatPVS(org, g_psv.worldmodel->nodes);
|
||||||
return fatpvs;
|
return fatpvs;
|
||||||
@ -4131,6 +4135,9 @@ unsigned char* EXT_FUNC SV_FatPAS(float *org)
|
|||||||
#endif // REHLDS_FIXES
|
#endif // REHLDS_FIXES
|
||||||
fatpasbytes = (g_psv.worldmodel->numleafs + 31) >> 3;
|
fatpasbytes = (g_psv.worldmodel->numleafs + 31) >> 3;
|
||||||
|
|
||||||
|
if (fatpasbytes >= (MAX_MAP_LEAFS / 8))
|
||||||
|
Sys_Error("%s: MAX_MAP_LEAFS limit exceeded\n", __func__);
|
||||||
|
|
||||||
Q_memset(fatpas, 0, fatpasbytes);
|
Q_memset(fatpas, 0, fatpasbytes);
|
||||||
SV_AddToFatPAS(org, g_psv.worldmodel->nodes);
|
SV_AddToFatPAS(org, g_psv.worldmodel->nodes);
|
||||||
return fatpas;
|
return fatpas;
|
||||||
@ -6155,7 +6162,7 @@ int SV_SpawnServer(qboolean bIsDemo, char *server, char *startspot)
|
|||||||
if (g_psvs.maxclients <= 1)
|
if (g_psvs.maxclients <= 1)
|
||||||
{
|
{
|
||||||
int row = (g_psv.worldmodel->numleafs + 7) / 8;
|
int row = (g_psv.worldmodel->numleafs + 7) / 8;
|
||||||
if (row < 0 || row > MODEL_MAX_PVS)
|
if (row < 0 || row > (MAX_MAP_LEAFS / 8))
|
||||||
{
|
{
|
||||||
Sys_Error("%s: oversized g_psv.worldmodel->numleafs: %i", __func__, g_psv.worldmodel->numleafs);
|
Sys_Error("%s: oversized g_psv.worldmodel->numleafs: %i", __func__, g_psv.worldmodel->numleafs);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#define HLBSP_VERSION 30 // half-life regular version
|
#define HLBSP_VERSION 30 // half-life regular version
|
||||||
|
|
||||||
#define MAX_MAP_HULLS 4
|
#define MAX_MAP_HULLS 4
|
||||||
|
#define MAX_MAP_LEAFS 8192 // signed short limit
|
||||||
|
|
||||||
#define CONTENTS_ORIGIN -7 // removed at csg time
|
#define CONTENTS_ORIGIN -7 // removed at csg time
|
||||||
#define CONTENTS_CLIP -8 // changed to contents_solid
|
#define CONTENTS_CLIP -8 // changed to contents_solid
|
||||||
|
Loading…
x
Reference in New Issue
Block a user