CVector fix - corrupt memory on size change
Version bumps
This commit is contained in:
@ -1,5 +1,12 @@
|
||||
#include <stdlib.h>
|
||||
#include "amxxapi.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
CVector<Vault *> Vaults;
|
||||
|
||||
static cell nvault_open(AMX *amx, cell *params)
|
||||
@ -31,13 +38,115 @@ static cell nvault_open(AMX *amx, cell *params)
|
||||
static cell nvault_get(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(i))
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
unsigned int numParams = (*params)/sizeof(cell);
|
||||
int len;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
const char *val = Vaults.at(id)->Find(key)->val.c_str();
|
||||
switch (numParams)
|
||||
{
|
||||
case 2:
|
||||
{
|
||||
return atoi(val);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
cell *fAddr = MF_GetAmxAddr(amx, params[3]);
|
||||
*fAddr = amx_ftoc((REAL)atof(val));
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
len = *(MF_GetAmxAddr(amx, params[4]));
|
||||
return MF_SetAmxString(amx, params[3], val, len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell nvault_timeget(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
unsigned int numParams = (*params)/sizeof(cell);
|
||||
int len;
|
||||
HashTable::htNode *node;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
node = Vaults.at(id)->Find(key);
|
||||
const char *val = node->val.c_str();
|
||||
cell *t_addr = MF_GetAmxAddr(amx, params[3]);
|
||||
*t_addr = (cell)(node->stamp);
|
||||
switch (numParams)
|
||||
{
|
||||
case 3:
|
||||
{
|
||||
return atoi(val);
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
cell *fAddr = MF_GetAmxAddr(amx, params[4]);
|
||||
*fAddr = amx_ftoc((REAL)atof(val));
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
len = *(MF_GetAmxAddr(amx, params[5]));
|
||||
return MF_SetAmxString(amx, params[4], val, len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell nvault_set(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int len;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
char *val = MF_FormatAmxString(amx, params, 3, &len);
|
||||
|
||||
Vaults.at(id)->Store(key, val);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell nvault_pset(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int len;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
char *val = MF_FormatAmxString(amx, params, 3, &len);
|
||||
|
||||
Vaults.at(id)->Store(key, val, false);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void OnAmxxAttach()
|
||||
@ -46,6 +155,6 @@ void OnAmxxAttach()
|
||||
#ifdef __linux__
|
||||
mkdir(MF_BuildPathname("%s/nvault", LOCALINFO("amxx_datadir")), 0700);
|
||||
#else
|
||||
mkdir(MF_BuildPathname("%s/nvault", LOCALINFO("amxx_datadir"));
|
||||
mkdir(MF_BuildPathname("%s/nvault", LOCALINFO("amxx_datadir")));
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user