Compare commits

...
Author SHA1 Message Date
Nicholas Hastings f008349cbc Updated versioning for 1.4.7 release. 2013-02-06 20:40:45 -05:00
Nicholas Hastings c978f8620e Updated changelog. 2013-02-06 20:39:27 -05:00
Nicholas Hastings ec9a4ab9c5 Updated more CS:S gamedata. 2013-02-06 17:43:02 -05:00
Nicholas Hastings de40e8990f Updated core to compile for new ep2v lib names (bug 5524). 2013-02-05 23:32:56 -05:00
Nicholas Hastings ae07dc524d Updated CS:S gamedata. 2013-02-05 17:20:00 -05:00
Nicholas Hastings 31426fb8d0 Fixed VARINT & UNSIGNED flags being read from dt instead of member in SendProp arrays (bug 5591, r=prodigysim). 2013-02-04 07:42:38 -05:00
Michael Busby f538a51ef4 Fix GameRules_SetPropVector writing data to unexpected addresses instead of to the proxy entity (bug 5592, r=psychonic). 2013-01-27 14:59:14 -08:00
Nicholas Hastings 55ee8af1e6 Updated more TF2 gamedata. 2012-12-20 18:24:47 -05:00
Nicholas Hastings 85ed2e01a4 Updated TF2 gamedata. 2012-12-19 07:55:03 -05:00
Peace-Maker 9eddf38b92 Fixed Sort_Random not including first value in array sorting functions (bug 4292, r=psychonic). 2013-01-23 12:51:19 -05:00
Nicholas Hastings 4ca976f883 Fixed gamedata offsets for CSPromod, GESource, and Synergy. 2013-01-06 09:35:22 -05:00
Nicholas Hastings ba9db46290 Updated gamedata offsets for CSPromod, GESource, and Synergy. 2012-12-31 18:15:25 -05:00
Nicholas Hastings b58fe300ba Removed SE_CSS references that snuck in with merge from central. 2012-12-20 18:42:15 -05:00
Nicholas Hastings 4eb3754afc Added support for new SPROP_VARINT sendprops. 2012-12-18 17:58:45 -05:00
Nicholas Hastings ae6ae0e3ea Ported GetEntProp's unsigned prop support to GameRules_GetProp. 2012-12-18 17:53:45 -05:00
Nicholas Hastings e903810d34 Updated DOD:S and HL2DM gamedata. 2012-12-20 17:58:43 -05:00
Nicholas Hastings b73fd01490 Validate entity in GameRules_GetPropEnt and in CS_DropWeapon safety checks. 2012-12-17 14:34:44 -05:00
Nicholas Hastings af0d46fcc1 Fixed regressions in 3d66ab8565c1:
* Fixed crash when prop/data ent is invalid.
* Restored GetEntPropEnt/GetEntDataEnt2 functionality when logical ent support is not available.
2012-12-17 14:33:57 -05:00
Nicholas Hastings 773216d517 Validate entity in GetEntPropEnt, GetEntDataEnt2 (r=me). 2012-12-16 19:52:31 -05:00
Powerlord ccfdcfb727 Updated TFHoliday enum (bug 5526, r=psychonic). 2012-12-15 14:40:51 -05:00
Ryan Stecker 8bf7f1a00f Fixed VoteMenuToAll stock adding bots to list (bug 5253, r=asherkin). 2012-12-14 15:18:30 -05:00
GoD-Tony 5e99870df0 Added PlayerRunCmd gamedata for The Hidden: Source (bug 5534, r=psychonic). 2012-12-14 15:07:47 -05:00
FlaminSarge 6f8d002404 Added new values to TFCond(ition) enum (bug 5537, r=asherkin). 2012-12-14 15:01:28 -05:00
Nicholas Hastings 3a94a3268a Updated CSPromod gamedata. 2012-12-10 23:35:57 -05:00
Kyle Sanderson 8355efaca4 Added a sanity check on handle index in EntityToBCompatRef (bug 5539, r=psychonic). 2012-12-01 13:41:00 -05:00
Drifter 2f388cfdb4 AutoExecConfig now logs an error when it cannot create cfg (bug 5465, r=asherkin). 2012-11-24 09:53:44 -05:00
Nicholas Hastings 272473ed02 Updated more L4D2 gamedata. 2012-11-21 08:30:08 -05:00
Nicholas Hastings 6e95680838 Updated L4D2 gamedata. 2012-11-20 20:55:28 -05:00
Nicholas Hastings 18e089e9d0 Fixed typo in game.nucleardawn.txt. 2012-11-08 12:56:19 -05:00
Nicholas Hastings 185e5fe6db Updated ZPS gamedata (bug 5536). 2012-11-02 13:39:33 -04:00
Nicholas Hastings 2b84454e77 Updated Nuclear Dawn gamedata. 2012-10-31 09:58:13 -04:00
Nicholas Hastings bb66d660b9 Updated ambuilder script for ep2v lib name changes (bug 5524). 2012-10-27 11:33:32 -04:00
Nicholas Hastings 3867d70d53 Updated last piece of gamedata for today's TF2 update. 2012-10-26 22:59:20 -04:00
Nicholas Hastings 144c1a3a13 Updated more ep2v gamedata. 2012-10-26 22:02:46 -04:00
Nicholas Hastings c2197a4422 Fixing ep2v build against sdk update. 2012-10-26 21:45:53 -04:00
Nicholas Hastings c3c51ff3a3 Updated TF2 extension gamedata. 2012-10-26 20:06:50 -04:00
Nicholas Hastings a2d3e1bee5 Updated PVKII gamedata. 2012-10-24 13:55:07 -04:00
Nicholas Hastings 6fa750bffe Merge. 2012-10-14 18:32:44 -04:00
Nicholas Hastings 83841cc218 Updated NMRiH gamedata (bug 5482). 2012-10-14 18:25:59 -04:00
Asher Baker 5c7e6c79c8 Updated plugin blacklist. 2012-10-12 02:25:53 +01:00
Asher Baker b20ff4075a Updated plugin blacklist. 2012-09-22 12:59:16 +01:00
Drifter f860ef10e6 Updated CS:S gamedata for CStrike extension. 2012-09-11 18:48:10 -04:00
Nicholas Hastings e357a5d650 Updated CS:S SDKTools gamedata. 2012-09-11 18:47:44 -04:00
Asher Baker c3bded70c5 Check the debug stringbase when loading plugins, lest it be null and cause crashes down the line (bug 5478, r=dvander). 2012-09-08 17:31:31 +01:00
Nicholas Hastings c11f2569ce Updated TF2 gamedata. 2012-09-06 18:46:38 -04:00
Nicholas Hastings c56d550333 Merge. 2012-09-06 17:43:19 -04:00
Nicholas Hastings 4e96ffb438 Updated ep2v gamedata. 2012-09-06 17:42:57 -04:00
Asher Baker 6b4b5eb0b1 Bumping version. 2012-09-04 12:56:31 +01:00
Asher Baker 74847c5b4f Added tag sourcemod-1.4.6 for changeset 56a9ba4cd1e2 2012-09-04 12:54:31 +01:00
Asher Baker 116fbe9a7a Updated versioning for 1.4.6 release. 2012-09-04 12:46:12 +01:00
Asher Baker 79f412c55c Updated changelog. 2012-09-04 12:45:37 +01:00
Asher Baker d839b83b6b Fixed extraneous errors related to accessing nested props (bug 5446, r=me). 2012-09-04 11:41:35 +01:00
Nicholas Hastings 9bcc3de922 Bumping version. 2012-09-03 23:07:23 -04:00
Nicholas Hastings 30ebb670f4 Added tag sourcemod-1.4.5 for changeset 9560adae2a72 2012-09-03 23:06:27 -04:00
Asher Baker 94e471192d Added system to block malware or illegal plugins (bug 5289, r=dvander). 2012-08-09 01:54:43 +01:00
42 changed files with 1205 additions and 296 deletions
+2
View File
@@ -8,3 +8,5 @@ f74e1dea2ef2c5a12b5238badc0e877106804191 sourcemod-1.4.1
0026e1394254c392244c7b140e3075974ab5a6db sourcemod-1.4.2
608f4c94872e3624404a1d105284163bc57fadf7 sourcemod-1.4.3
29186166cc99e73c61995a0bd0450fc6c36466bc sourcemod-1.4.4
9560adae2a7263e6e076d5bc2e1c2838c27d686a sourcemod-1.4.5
56a9ba4cd1e2ca8a583f7e150af058ce5d41ca33 sourcemod-1.4.6
+13 -2
View File
@@ -268,7 +268,15 @@ class SM:
else:
staticLibs = os.path.join(sdkPath, 'lib', 'linux')
workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
if sdk in ['ep2v', 'l4d', 'l4d2']:
if sdk == 'ep2v':
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib_srv.so', 'libtier0_srv.so']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
try:
os.lstat(link)
except:
job.AddCommand(SymlinkCommand(link, target))
elif sdk in ['l4d', 'l4d2']:
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
@@ -354,7 +362,10 @@ class SM:
if not noLink:
if AMBuild.target['platform'] == 'linux':
compiler['POSTLINKFLAGS'][0:0] = ['-lm']
if sdk in ['ep2v', 'l4d', 'l4d2']:
if sdk == 'ep2v':
compiler['POSTLINKFLAGS'][0:0] = ['libtier0_srv.so']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib_srv.so']
elif sdk in ['l4d', 'l4d2']:
compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
else:
+37 -1
View File
@@ -1,6 +1,42 @@
SourceMod Changelog
-----------------------------
SourceMod 1.4.7 [2013-02-06]
URL: http://wiki.alliedmods.net/SourceMod_1.4.7_Release_Notes
User Changes:
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM).
- Updated gamedata for Left 4 Dead 2, Nuclear Dawn, No More Room in Hell, Zombie Panic Source, CSPromod, GoldenEye Source, Synergy, The Hidden, and PVKII.
- Added system to block malware or illegal plugins (bug 5289).
- Fixed a potential crash when a bad entity index is passed to certain functions (bug 5539) (KyleS).
- Added an error message for when auto plugin configs fail to be created due to write error (bug 5465) (Drifter).
- Fixed an issue where a malformed plugin could cause crashes (bug 5478).
Developer Changes:
- Added new values to the TFCond TF2 conditions enum (bug 5537) (FlaminSarge).
- Updated TFHoliday TF2 holidays enum (bug 5526) (Powerlord).
- Fixed regression in SourceMod 1.3.0 causing GetEntPropEnt, GetEntDataEnt2, and GameRules_GetPropEnt to possibly return stale (incorrect) entity indexes in place of -1.
- Added support for < 32-bit unsigned sign extension to GameRules_GetProp lookup (already in GetEntProp since SM 1.4.0).
- Fixed < 32-bit unsigned sign extension in GetEntProp not being applied for array prop elements (bug 5591).
- Fixed value size auto-detection in GetEntProp and GameRules_GetProp for ep2v's new SPROP_VARINT sendprops.
- Fixed Sort_Random sort type not including first value in array sorting functions (bug 4292) (Peace-Maker).
- Fixed GameRules_SetPropVector writing data to unexpected addresses instead of to the gamerules proxy entity (bug 5592) (ProdigySim).
- Fixed VoteMenuToAll stock adding bots to list (bug 5253 (VoiDeD).
----------------------------------------------------------
SourceMod 1.4.6 [2012-09-04]
URL: http://wiki.alliedmods.net/SourceMod_1.4.6_Release_Notes
User Changes:
- Fixed extraneous errors resulting from a bug in 1.4.5.
----------------------------------------------------------
SourceMod 1.4.5 [2012-09-03]
+10
View File
@@ -107,4 +107,14 @@
* Currently this will log details about the gamedata updating process.
*/
"DebugSpew" "no"
/**
* Enables or disables whether SourceMod blocks known or potentially malicious plugins from loading.
* It is STRONGLY advised that this is left enabled, there have been cases in the past with plugins that
* allow anyone to delete files on the server, gain full rcon control, etc.
*
* "yes" - Block malware or illegal plugins from loading (default)
* "no" - Warn about malware or illegal plugins loading
*/
"BlockBadPlugins" "yes"
}
+5
View File
@@ -452,6 +452,11 @@ bool SM_ExecuteConfig(CPlugin *pl, AutoConfig *cfg, bool can_create)
can_create = false;
fclose(fp);
}
else
{
g_Logger.LogError("Failed to auto generate config for %s, make sure the directory has write permission.", pl->GetFilename());
return can_create;
}
}
}
+18 -4
View File
@@ -40,6 +40,7 @@
#include <Logger.h>
#include "LibrarySys.h"
#include "logic_bridge.h"
#include <tier0/mem.h>
typedef ICommandLine *(*FakeGetCommandLine)();
@@ -51,7 +52,10 @@ typedef ICommandLine *(*FakeGetCommandLine)();
#define TIER0_NAME "libtier0.dylib"
#define VSTDLIB_NAME "libvstdlib.dylib"
#elif defined __linux__
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE || SOURCE_ENGINE == SE_LEFT4DEAD || SOURCE_ENGINE == SE_LEFT4DEAD2
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
#define TIER0_NAME "libtier0_srv.so"
#define VSTDLIB_NAME "libvstdlib_srv.so"
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
#define TIER0_NAME "libtier0.so"
#define VSTDLIB_NAME "libvstdlib.so"
#else
@@ -352,11 +356,16 @@ typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name, bool *i
{
if (isNested)
{
*isNested = true;
return NULL;
*isNested = (UTIL_FindInDataMap(pMap->dataDesc[i].td, name, NULL) != NULL);
if (*isNested)
{
return NULL;
} else {
continue;
}
} else { // Use the old behaviour, we dont want to spring this on extensions - even if they're doing bad things.
typedescription_t *_td;
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name, isNested)) != NULL)
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name, NULL)) != NULL)
{
return _td;
}
@@ -987,6 +996,11 @@ cell_t CHalfLife2::EntityToBCompatRef(CBaseEntity *pEntity)
IServerUnknown *pUnknown = (IServerUnknown *)pEntity;
CBaseHandle hndl = pUnknown->GetRefEHandle();
if (hndl == INVALID_EHANDLE_INDEX)
{
return INVALID_EHANDLE_INDEX;
}
if (hndl.GetEntryIndex() >= MAX_EDICTS)
{
return (hndl.ToInt() | (1<<31));
+68 -1
View File
@@ -789,6 +789,8 @@ CPluginManager::CPluginManager()
m_AllPluginsLoaded = false;
m_MyIdent = NULL;
m_LoadingLocked = false;
m_bBlockBadPlugins = true;
}
CPluginManager::~CPluginManager()
@@ -1031,6 +1033,41 @@ LoadRes CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool de
}
}
if (pPlugin->GetStatus() == Plugin_Created)
{
unsigned char *pCodeHash = pPlugin->m_pRuntime->GetCodeHash();
char codeHashBuf[40];
UTIL_Format(codeHashBuf, 40, "plugin_");
for (int i = 0; i < 16; i++)
UTIL_Format(codeHashBuf + 7 + (i * 2), 3, "%02x", pCodeHash[i]);
const char *bulletinUrl = g_pGameConf->GetKeyValue(codeHashBuf);
if (bulletinUrl != NULL)
{
if (m_bBlockBadPlugins)
{
if (error)
{
if (bulletinUrl[0] != '\0')
{
UTIL_Format(error, maxlength, "Known malware detected and blocked. See %s for more info", bulletinUrl);
} else {
UTIL_Format(error, maxlength, "Possible malware or illegal plugin detected and blocked");
}
}
pPlugin->m_status = Plugin_BadLoad;
} else {
if (bulletinUrl[0] != '\0')
{
g_Logger.LogMessage("%s: Known malware detected. See %s for more info, blocking disabled in core.cfg", pPlugin->GetFilename(), bulletinUrl);
} else {
g_Logger.LogMessage("%s: Possible malware or illegal plugin detected, blocking disabled in core.cfg", pPlugin->GetFilename());
}
}
}
}
LoadRes loadFailure = LoadRes_Failure;
/* Get the status */
if (pPlugin->GetStatus() == Plugin_Created)
@@ -1129,7 +1166,7 @@ void CPluginManager::LoadAutoPlugin(const char *plugin)
if ((res=_LoadPlugin(&pl, plugin, false, PluginType_MapUpdated, error, sizeof(error))) == LoadRes_Failure)
{
g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s", plugin, error);
g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s.", plugin, error);
pl->SetErrorState(
pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(),
"%s",
@@ -1889,6 +1926,27 @@ void CPluginManager::OnSourceModShutdown()
g_ShareSys.DestroyIdentity(m_MyIdent);
}
ConfigResult CPluginManager::OnSourceModConfigChanged(const char *key,
const char *value,
ConfigSource source,
char *error,
size_t maxlength)
{
if (strcmp(key, "BlockBadPlugins") == 0) {
if (strcasecmp(value, "yes") == 0)
{
m_bBlockBadPlugins = true;
} else if (strcasecmp(value, "no") == 0) {
m_bBlockBadPlugins = false;
} else {
UTIL_Format(error, maxlength, "Invalid value: must be \"yes\" or \"no\"");
return ConfigResult_Reject;
}
return ConfigResult_Accept;
}
return ConfigResult_Ignore;
}
void CPluginManager::OnHandleDestroy(HandleType_t type, void *object)
{
/* We don't care about the internal object, actually */
@@ -2269,6 +2327,15 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
{
g_RootMenu.ConsolePrint(" Timestamp: %s", pl->m_DateTime);
}
unsigned char *pCodeHash = pl->m_pRuntime->GetCodeHash();
unsigned char *pDataHash = pl->m_pRuntime->GetDataHash();
char combinedHash[33];
for (int i = 0; i < 16; i++)
UTIL_Format(combinedHash + (i * 2), 3, "%02x", pCodeHash[i] ^ pDataHash[i]);
g_RootMenu.ConsolePrint(" Hash: %s", combinedHash);
}
else
{
+5
View File
@@ -57,6 +57,7 @@
#include "convar_sm.h"
#endif
#include "ITranslator.h"
#include "IGameConfigs.h"
#include "NativeOwner.h"
#include "ShareSys.h"
@@ -326,6 +327,7 @@ public: //IPluginManager
public: //SMGlobalClass
void OnSourceModAllInitialized();
void OnSourceModShutdown();
ConfigResult OnSourceModConfigChanged(const char *key, const char *value, ConfigSource source, char *error, size_t maxlength);
void OnSourceModMaxPlayersChanged(int newvalue);
public: //IHandleTypeDispatch
void OnHandleDestroy(HandleType_t type, void *object);
@@ -470,6 +472,9 @@ private:
List<FakeNative *> m_Natives;
bool m_LoadingLocked;
// Config
bool m_bBlockBadPlugins;
};
extern CPluginManager g_PluginSys;
+2 -2
View File
@@ -94,7 +94,7 @@ void sort_random(cell_t *array, cell_t size)
for (int i = size-1; i > 0; i--)
{
int n = (rand() % i) + 1;
int n = rand() % (i + 1);
if (array[i] != array[n])
{
@@ -435,7 +435,7 @@ void sort_adt_random(CellArray *cArray)
for (int i = arraysize-1; i > 0; i--)
{
int n = (rand() % i) + 1;
int n = rand() % (i + 1);
cArray->swap(i, n);
}
+35 -12
View File
@@ -620,9 +620,12 @@ static cell_t GetEntDataEnt2(IPluginContext *pContext, const cell_t *params)
}
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
int ref = g_HL2.IndexToReference(hndl.GetEntryIndex());
return g_HL2.ReferenceToBCompatRef(ref);
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
return -1;
return g_HL2.EntityToBCompatRef(pHandleEntity);
}
/* THIS GUY IS DEPRECATED. */
@@ -994,6 +997,7 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
#define FIND_PROP_SEND(type, type_name) \
sm_sendprop_info_t info;\
SendProp *pProp; \
IServerUnknown *pUnk = (IServerUnknown *)pEntity; \
IServerNetworkable *pNet = pUnk->GetNetworkable(); \
if (!pNet) \
@@ -1010,9 +1014,10 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
} \
\
offset = info.actual_offset; \
bit_count = info.prop->m_nBits; \
pProp = info.prop; \
bit_count = pProp->m_nBits; \
\
switch (info.prop->GetType()) \
switch (pProp->GetType()) \
{ \
case type: \
{ \
@@ -1026,7 +1031,6 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
} \
case DPT_DataTable: \
{ \
SendProp *pProp; \
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
\
offset += pProp->GetOffset(); \
@@ -1037,13 +1041,13 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
{ \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
prop, \
info.prop->GetType(), \
pProp->GetType(), \
type); \
} \
} \
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
SendTable *pTable = info.prop->GetDataTable(); \
SendTable *pTable = pProp->GetDataTable(); \
if (!pTable) \
{ \
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \
@@ -1064,8 +1068,8 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
{ \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
prop, \
info.prop->GetType(), \
info.prop->m_nBits, \
pProp->GetType(), \
pProp->m_nBits, \
type); \
}
@@ -1201,7 +1205,15 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
case Prop_Send:
{
FIND_PROP_SEND(DPT_Int, "integer");
is_unsigned = ((info.prop->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
is_unsigned = ((pProp->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (pProp->GetFlags() & SPROP_VARINT)
{
bit_count = sizeof(int) * 8;
}
#endif
break;
}
default:
@@ -1292,6 +1304,14 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
case Prop_Send:
{
FIND_PROP_SEND(DPT_Int, "integer");
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (pProp->GetFlags() & SPROP_VARINT)
{
bit_count = sizeof(int) * 8;
}
#endif
break;
}
default:
@@ -1506,9 +1526,12 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
}
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
int ref = g_HL2.IndexToReference(hndl.GetEntryIndex());
return g_HL2.ReferenceToBCompatRef(ref);
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle())
return -1;
return g_HL2.EntityToBCompatRef(pHandleEntity);
}
static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
+1 -1
View File
@@ -217,7 +217,7 @@ static cell_t CS_DropWeapon(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Invalid entity index %d for weapon", params[2]);
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pWeapon + spi.actual_offset);
if (params[1] != hndl.GetEntryIndex())
if (params[1] != hndl.GetEntryIndex() || hndl != ((IServerEntity *)pEntity)->GetRefEHandle())
return pContext->ThrowNativeError("Weapon %d is not owned by client %d", params[2], params[1]);
if (params[4] == 1 && g_pCSWeaponDropDetoured)
+50 -12
View File
@@ -89,15 +89,17 @@ enum PropFieldType
#define FIND_PROP_SEND(type, type_name) \
sm_sendprop_info_t info;\
SendProp *pProp; \
if (!gamehelpers->FindSendPropInfo(g_szGameRulesProxy, prop, &info)) \
{ \
return pContext->ThrowNativeError("Property \"%s\" not found on the gamerules proxy", prop); \
} \
\
offset = info.actual_offset; \
bit_count = info.prop->m_nBits; \
pProp = info.prop; \
bit_count = pProp->m_nBits; \
\
switch (info.prop->GetType()) \
switch (pProp->GetType()) \
{ \
case type: \
{ \
@@ -111,7 +113,6 @@ enum PropFieldType
} \
case DPT_DataTable: \
{ \
SendProp *pProp; \
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
\
offset += pProp->GetOffset(); \
@@ -122,13 +123,13 @@ enum PropFieldType
{ \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
prop, \
info.prop->GetType(), \
pProp->GetType(), \
type); \
} \
} \
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
SendTable *pTable = info.prop->GetDataTable(); \
SendTable *pTable = pProp->GetDataTable(); \
if (!pTable) \
{ \
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \
@@ -149,8 +150,8 @@ enum PropFieldType
{ \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
prop, \
info.prop->GetType(), \
info.prop->m_nBits, \
pProp->GetType(), \
pProp->m_nBits, \
type); \
}
@@ -160,6 +161,7 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
int element = params[3];
int offset;
int bit_count;
bool is_unsigned;
if (!g_pGameRules || !g_szGameRulesProxy || !strcmp(g_szGameRulesProxy, ""))
return pContext->ThrowNativeError("Gamerules lookup failed.");
@@ -169,6 +171,15 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
int elementCount = 1;
FIND_PROP_SEND(DPT_Int, "integer");
is_unsigned = ((pProp->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (pProp->GetFlags() & SPROP_VARINT)
{
bit_count = sizeof(int) * 8;
}
#endif
if (bit_count < 1)
{
bit_count = params[2] * 8;
@@ -182,11 +193,25 @@ static cell_t GameRules_GetProp(IPluginContext *pContext, const cell_t *params)
}
else if (bit_count >= 9)
{
return *(int16_t *)((intptr_t)pGameRules + offset);
if (is_unsigned)
{
return *(uint16_t *)((intptr_t)pGameRules + offset);
}
else
{
return *(int16_t *)((intptr_t)pGameRules + offset);
}
}
else if (bit_count >= 2)
{
return *(int8_t *)((intptr_t)pGameRules + offset);
if (is_unsigned)
{
return *(uint8_t *)((intptr_t)pGameRules + offset);
}
else
{
return *(int8_t *)((intptr_t)pGameRules + offset);
}
}
else
{
@@ -218,6 +243,14 @@ static cell_t GameRules_SetProp(IPluginContext *pContext, const cell_t *params)
FIND_PROP_SEND(DPT_Int, "integer");
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
#if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (pProp->GetFlags() & SPROP_VARINT)
{
bit_count = sizeof(int) * 8;
}
#endif
void *pGameRules = *g_pGameRules;
if (bit_count < 1)
@@ -339,9 +372,14 @@ static cell_t GameRules_GetPropEnt(IPluginContext *pContext, const cell_t *param
void *pGameRules = *g_pGameRules;
CBaseHandle &hndl = *(CBaseHandle *)((intptr_t)pGameRules + offset);
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(hndl.GetEntryIndex());
int ref = gamehelpers->IndexToReference(hndl.GetEntryIndex());
return gamehelpers->ReferenceToBCompatRef(ref);
if (!pEntity || ((IServerEntity *)pEntity)->GetRefEHandle() != hndl)
{
return -1;
}
return gamehelpers->EntityToBCompatRef(pEntity);
}
static cell_t GameRules_SetPropEnt(IPluginContext *pContext, const cell_t *params)
@@ -470,7 +508,7 @@ static cell_t GameRules_SetPropVector(IPluginContext *pContext, const cell_t *pa
if (sendChange)
{
v = (Vector *)((intptr_t)g_pGameRules + offset);
v = (Vector *)((intptr_t)pProxy + offset);
v->x = sp_ctof(vec[0]);
v->y = sp_ctof(vec[1]);
v->z = sp_ctof(vec[2]);
+34
View File
@@ -0,0 +1,34 @@
/**
* Do not edit this file. Any changes will be overwritten by the gamedata
* updater or by upgrading your SourceMod install.
*
* For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(SourceMod)
*/
"Games"
{
"#default"
{
"Keys"
{
"plugin_541de8d7f577398bad43b75f4ac80b84" "http://forums.alliedmods.net/showpost.php?p=1767388&postcount=7" /* LightRP (Sphex) - Version 1.2.5 */
"plugin_e10aab3464312dc0e484bda26b490b3f" "http://forums.alliedmods.net/showpost.php?p=1767388&postcount=7" /* LightRP (Sphex) - Version 1.2.7 */
"plugin_a7973ddc4e72aafd0312432568a1806b" "http://forums.alliedmods.net/showpost.php?p=1767388&postcount=7" /* LightRP (Sphex) - Version 1.2.8 */
"plugin_39ddd719f74b62e27e8e480871b9d3b6" "http://forums.alliedmods.net/showpost.php?p=1803875&postcount=1" /* Malicious plugin being uploaded to CS:GO servers */
"plugin_c82200dc10b39ad196fc805e4d4da807" "" /* [L4D] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 */
"plugin_4225ffe2fd15d10a730466909a64bd01" "" /* [L4D2] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 */
"plugin_862ae600f417a26e6b6d3ab5d702c5e7" "" /* [L4D] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 - Hotfix */
"plugin_cdb8b711ff0166791e761d6324b30b4c" "" /* [L4D2] Survivor Upgrades Reloaded (Marcus101RR, Whosat & Jerrith) - Version 1.5.0 - Hotfix */
"plugin_fd89ca333467cffe722072a52e7bc752" "" /* L4D SuperVersus (DDRKhat) - Version 1.6.5 - Marcus101RR version */
"plugin_33c1c93eaff16f385ef245cb4af80f1a" "" /* Survivor Health & Armor System (Marcus101RR) - Version 1.4.8 */
"plugin_895eb68cb2dd5235e29b93452e14e52b" "" /* [L4D(2)] Health & Armor System (Marcus101RR) - Version 1.5.0 */
"plugin_56ce0378afbb2cadb06be89dcba76706" "" /* [L4D(2)] Human Director Reloaded (Marcus101RR & lucskywalker) - Version 0.7.0 */
"plugin_f405db5491a465b1a30859ee7f7c5080" "" /* UCP Server (Endi) - Version 6.9 */
"plugin_6fcb6721fb740b854b0a05bfc9a7984a" "" /* UCP Server (Endi) - Version 7.1 */
"plugin_4d320d6c5aba5d31c644fe2847c0662f" "" /* UCP Server (Endi) - Version 7.2 */
"plugin_92d7c31873390c254bbcd0c955939aa6" "" /* UCP Server (Endi) - Version 7.7 */
"plugin_f99d77668e7aa0adb6a960322ab05568" "" /* UCP Server (Endi) - Version 7.8 */
"plugin_78140f1a0f26cd3297767d0598eac4b1" "" /* [Any] PReplay (DarthNinja) - Version 1.0.0 */
}
}
}
+3
View File
@@ -60,4 +60,7 @@
"engine" "eye"
}
"blacklist.plugins.txt"
{
}
}
-1
View File
@@ -17,7 +17,6 @@
"#supported"
{
"game" "ageofchivalry"
"game" "zps"
"game" "empires"
"game" "synergy"
"game" "bg2"
+5 -37
View File
@@ -73,8 +73,8 @@
"game" "dod"
"game" "tf"
"game" "hl2mp"
"game" "cstrike"
"game" "garrysmod"
"game" "cstrike"
}
"Signatures"
@@ -83,7 +83,7 @@
"FindEntityByClassname"
{
"library" "server"
"windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x8B\x4D\x2A\x85\xC9\x57\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\x2A\x2A\x2A\x2A\x83\xC0\x2A\xC1\xE0\x04\x8B\x3C\x30\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5D\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x15\x2A\x2A\x2A\x2A\x83\xC4\x2A\xEB\x2A\x39"
"windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x8B\x4D\x2A\x57\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x40\x03\xC0\x8B\x3C\xC6\xEB\x2A\x8B"
"linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
"mac" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
}
@@ -144,6 +144,7 @@
"game" "tf"
"game" "hl2mp"
"game" "garrysmod"
"game" "cstrike"
}
"Keys"
@@ -176,40 +177,6 @@
}
}
"#default"
{
"#supported"
{
"game" "cstrike"
}
"Keys"
{
/* Signature for the beginning of IVEngineServer::CreateFakeClientEx.
* (Must be unique!)
*/
"CreateFakeClient_Windows" "\x55\x8B\xEC\x8B\x2A\x2A\x8A\x2A\x2A\x51\xB9\x2A\x2A\x2A\x2A\xA2"
}
"Offsets"
{
"sv"
{
"windows" "11"
}
}
"Signatures"
{
"sv"
{
"library" "engine"
"linux" "@sv"
"mac" "@sv"
}
}
}
/* EntityFactoryDictionary function */
"#default"
{
@@ -218,6 +185,7 @@
"game" "tf"
"game" "dod"
"game" "hl2mp"
"game" "cstrike"
}
"Signatures"
@@ -247,7 +215,7 @@
"FireOutput"
{
"library" "server"
"windows" "\x55\x8B\xEC\x81\xEC\x2A\x2A\x2A\x2A\x53\x56\x8B\x71\x2A\x85\xF6"
"windows" "\x55\x8B\xEC\x81\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\x2A\x2A\x57\x89"
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
}
-1
View File
@@ -196,7 +196,6 @@
"#supported"
{
"game" "left4dead2"
"game" "nucleardawn"
}
"Signatures"
{
+16 -16
View File
@@ -1,6 +1,6 @@
"Games"
{
/* CSpromod 1.05 */
/* CSpromod 1.09 */
"cspromod"
{
"Offsets"
@@ -8,47 +8,47 @@
"GiveNamedItem"
{
"windows" "353"
"linux" "354"
"linux" "355"
}
"RemovePlayerItem"
{
"windows" "239"
"windows" "238"
"linux" "240"
}
"Weapon_GetSlot"
{
"windows" "237"
"windows" "236"
"linux" "238"
}
"Ignite"
{
"windows" "194"
"windows" "193"
"linux" "195"
}
"Extinguish"
{
"windows" "198"
"windows" "197"
"linux" "199"
}
"Teleport"
{
"windows" "101"
"windows" "100"
"linux" "102"
}
"CommitSuicide"
{
"windows" "389"
"linux" "389"
"windows" "390"
"linux" "391"
}
"GetVelocity"
{
"windows" "131"
"linux" "132"
"windows" "132"
"linux" "134"
}
"EyeAngles"
{
"windows" "123"
"linux" "124"
"windows" "124"
"linux" "126"
}
"AcceptInput"
{
@@ -57,7 +57,7 @@
}
"WeaponEquip"
{
"windows" "230"
"windows" "229"
"linux" "231"
}
"SetEntityModel"
@@ -72,8 +72,8 @@
}
"PlayerRunCmd"
{
"windows" "373"
"linux" "374"
"windows" "374"
"linux" "376"
}
}
}
+18 -18
View File
@@ -28,22 +28,22 @@
{
"GiveNamedItem"
{
"windows" "396"
"linux" "397"
"mac" "397"
"windows" "399"
"linux" "400"
"mac" "400"
}
"RemovePlayerItem"
{
"windows" "268"
"linux" "269"
"mac" "269"
}
"Weapon_GetSlot"
{
"windows" "266"
"linux" "267"
"mac" "267"
}
"Weapon_GetSlot"
{
"windows" "264"
"linux" "265"
"mac" "265"
}
"Ignite"
{
"windows" "207"
@@ -64,9 +64,9 @@
}
"CommitSuicide"
{
"windows" "437"
"linux" "437"
"mac" "437"
"windows" "440"
"linux" "440"
"mac" "440"
}
"GetVelocity"
{
@@ -94,9 +94,9 @@
}
"WeaponEquip"
{
"windows" "257"
"linux" "258"
"mac" "258"
"windows" "259"
"linux" "260"
"mac" "260"
}
"Activate"
{
@@ -106,9 +106,9 @@
}
"PlayerRunCmd"
{
"windows" "414"
"linux" "415"
"mac" "415"
"windows" "417"
"linux" "418"
"mac" "418"
}
}
}
+18 -18
View File
@@ -18,22 +18,22 @@
{
"GiveNamedItem"
{
"windows" "395"
"linux" "396"
"mac" "396"
"windows" "398"
"linux" "399"
"mac" "399"
}
"RemovePlayerItem"
{
"windows" "268"
"linux" "269"
"mac" "269"
}
"Weapon_GetSlot"
{
"windows" "266"
"linux" "267"
"mac" "267"
}
"Weapon_GetSlot"
{
"windows" "264"
"linux" "265"
"mac" "265"
}
"Ignite"
{
"windows" "207"
@@ -54,9 +54,9 @@
}
"CommitSuicide"
{
"windows" "433"
"linux" "434"
"mac" "434"
"windows" "436"
"linux" "437"
"mac" "437"
}
"GetVelocity"
{
@@ -84,9 +84,9 @@
}
"WeaponEquip"
{
"windows" "257"
"linux" "258"
"mac" "258"
"windows" "259"
"linux" "260"
"mac" "260"
}
"Activate"
{
@@ -96,9 +96,9 @@
}
"PlayerRunCmd"
{
"windows" "413"
"linux" "414"
"mac" "414"
"windows" "416"
"linux" "417"
"mac" "417"
}
}
+17 -17
View File
@@ -6,28 +6,28 @@
{
"GiveNamedItem"
{
"windows" "352"
"linux" "353"
"windows" "354"
"linux" "355"
}
"RemovePlayerItem"
{
"windows" "241"
"linux" "242"
}
"Weapon_GetSlot"
{
"windows" "239"
"linux" "240"
}
"Weapon_GetSlot"
{
"windows" "237"
"linux" "238"
}
"Ignite"
{
"windows" "194"
"linux" "195"
"windows" "196"
"linux" "197"
}
"Extinguish"
{
"windows" "198"
"linux" "199"
"windows" "200"
"linux" "201"
}
"Teleport"
{
@@ -36,8 +36,8 @@
}
"CommitSuicide"
{
"windows" "393"
"linux" "393"
"windows" "395"
"linux" "395"
}
"GetVelocity"
{
@@ -61,8 +61,8 @@
}
"WeaponEquip"
{
"windows" "230"
"linux" "231"
"windows" "232"
"linux" "233"
}
"Activate"
{
@@ -71,8 +71,8 @@
}
"PlayerRunCmd"
{
"windows" "372"
"linux" "373"
"windows" "374"
"linux" "375"
}
"s_pTempEntities"
{
+5
View File
@@ -97,6 +97,11 @@
"windows" "198"
"linux" "199"
}
"PlayerRunCmd"
{
"windows" "364"
"linux" "365"
}
}
"Signatures"
+18 -18
View File
@@ -18,22 +18,22 @@
{
"GiveNamedItem"
{
"windows" "395"
"linux" "396"
"mac" "396"
"windows" "398"
"linux" "399"
"mac" "399"
}
"RemovePlayerItem"
{
"windows" "268"
"linux" "269"
"mac" "269"
}
"Weapon_GetSlot"
{
"windows" "266"
"linux" "267"
"mac" "267"
}
"Weapon_GetSlot"
{
"windows" "264"
"linux" "265"
"mac" "265"
}
"Ignite"
{
"windows" "207"
@@ -54,9 +54,9 @@
}
"CommitSuicide"
{
"windows" "434"
"linux" "434"
"mac" "434"
"windows" "437"
"linux" "437"
"mac" "437"
}
"GetVelocity"
{
@@ -84,9 +84,9 @@
}
"WeaponEquip"
{
"windows" "257"
"linux" "258"
"mac" "258"
"windows" "259"
"linux" "260"
"mac" "260"
}
"Activate"
{
@@ -96,9 +96,9 @@
}
"PlayerRunCmd"
{
"windows" "413"
"linux" "414"
"mac" "414"
"windows" "416"
"linux" "417"
"mac" "417"
}
}
}
+24 -24
View File
@@ -7,33 +7,33 @@
{
"GiveNamedItem"
{
"windows" "506"
"linux" "507"
"mac" "507"
"windows" "507"
"linux" "508"
"mac" "508"
}
"RemovePlayerItem"
{
"windows" "288"
"linux" "289"
"mac" "289"
"windows" "289"
"linux" "290"
"mac" "290"
}
"Weapon_GetSlot"
{
"windows" "286"
"linux" "287"
"mac" "287"
"windows" "287"
"linux" "288"
"mac" "288"
}
"Ignite"
{
"windows" "221"
"linux" "222"
"mac" "222"
"windows" "222"
"linux" "223"
"mac" "223"
}
"Extinguish"
{
"windows" "224"
"linux" "225"
"mac" "225"
"windows" "225"
"linux" "226"
"mac" "226"
}
"Teleport"
{
@@ -43,9 +43,9 @@
}
"CommitSuicide"
{
"windows" "474"
"linux" "474"
"mac" "474"
"windows" "475"
"linux" "475"
"mac" "475"
}
"GetVelocity"
{
@@ -73,9 +73,9 @@
}
"WeaponEquip"
{
"windows" "279"
"linux" "280"
"mac" "280"
"windows" "280"
"linux" "281"
"mac" "281"
}
"Activate"
{
@@ -85,9 +85,9 @@
}
"PlayerRunCmd"
{
"windows" "452"
"linux" "453"
"mac" "453"
"windows" "453"
"linux" "454"
"mac" "454"
}
}
+13 -13
View File
@@ -11,25 +11,25 @@
"Games"
{
/* No More Room in Hell 1.02 */
/* No More Room in Hell 1.05 */
"nmrih"
{
"Offsets"
{
"GiveNamedItem"
{
"windows" "361"
"linux" "362"
"windows" "362"
"linux" "363"
}
"RemovePlayerItem"
{
"windows" "240"
"linux" "241"
"windows" "241"
"linux" "242"
}
"Weapon_GetSlot"
{
"windows" "238"
"linux" "239"
"windows" "239"
"linux" "240"
}
"Ignite"
{
@@ -48,8 +48,8 @@
}
"CommitSuicide"
{
"windows" "402"
"linux" "402"
"windows" "403"
"linux" "403"
}
"GetVelocity"
{
@@ -73,8 +73,8 @@
}
"WeaponEquip"
{
"windows" "231"
"linux" "232"
"windows" "232"
"linux" "233"
}
"Activate"
{
@@ -83,8 +83,8 @@
}
"PlayerRunCmd"
{
"windows" "381"
"linux" "382"
"windows" "382"
"linux" "383"
}
/* Offset into CBaseTempEntity constructor (vs2010 moved it!) */
@@ -95,5 +95,16 @@
{
"GameRulesProxy" "CNuclearDawnRulesProxy"
}
"Signatures"
{
"FireOutput"
{
"library" "server"
"windows" "\x81\x2A\x2A\x2A\x2A\x2A\x53\x55\x56\x8B\x2A\x2A\x85"
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
"mac" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
}
}
}
}
+17 -17
View File
@@ -19,28 +19,28 @@
/* CBasePlayer */
"GiveNamedItem"
{
"windows" "352"
"linux" "353"
"windows" "354"
"linux" "355"
}
"RemovePlayerItem"
{
"windows" "241"
"linux" "242"
}
"Weapon_GetSlot"
{
"windows" "239"
"linux" "240"
}
"Weapon_GetSlot"
{
"windows" "237"
"linux" "238"
}
"Ignite"
{
"windows" "194"
"linux" "195"
"windows" "196"
"linux" "197"
}
"Extinguish"
{
"windows" "198"
"linux" "199"
"windows" "200"
"linux" "201"
}
"Teleport"
{
@@ -49,8 +49,8 @@
}
"CommitSuicide"
{
"windows" "393"
"linux" "393"
"windows" "395"
"linux" "395"
}
"GetVelocity"
{
@@ -74,8 +74,8 @@
}
"WeaponEquip"
{
"windows" "230"
"linux" "231"
"windows" "232"
"linux" "233"
}
"Activate"
{
@@ -84,8 +84,8 @@
}
"PlayerRunCmd"
{
"windows" "372"
"linux" "373"
"windows" "374"
"linux" "375"
}
"FireOutputBackup"
{
+8 -13
View File
@@ -19,8 +19,8 @@
/* CBasePlayer */
"GiveNamedItem"
{
"windows" "355"
"linux" "356"
"windows" "356"
"linux" "357"
}
"RemovePlayerItem"
{
@@ -49,8 +49,8 @@
}
"CommitSuicide"
{
"windows" "396"
"linux" "396"
"windows" "397"
"linux" "397"
}
"GetVelocity"
{
@@ -84,18 +84,13 @@
}
"RemoveAllItems"
{
"windows" "303"
"linux" "304"
"windows" "304"
"linux" "305"
}
"PlayerRunCmd"
{
"windows" "375"
"linux" "376"
}
"FireOutputBackup"
{
"windows" "6"
"linux" "10"
"windows" "376"
"linux" "377"
}
}
"Signatures"
+18 -18
View File
@@ -18,22 +18,22 @@
{
"GiveNamedItem"
{
"windows" "395"
"linux" "396"
"mac" "396"
"windows" "398"
"linux" "399"
"mac" "399"
}
"RemovePlayerItem"
{
"windows" "268"
"linux" "269"
"mac" "269"
}
"Weapon_GetSlot"
{
"windows" "266"
"linux" "267"
"mac" "267"
}
"Weapon_GetSlot"
{
"windows" "264"
"linux" "265"
"mac" "265"
}
"Ignite"
{
"windows" "207"
@@ -54,9 +54,9 @@
}
"CommitSuicide"
{
"windows" "436"
"linux" "436"
"mac" "436"
"windows" "439"
"linux" "439"
"mac" "439"
}
"GetVelocity"
{
@@ -84,9 +84,9 @@
}
"WeaponEquip"
{
"windows" "257"
"linux" "258"
"mac" "258"
"windows" "259"
"linux" "260"
"mac" "260"
}
"Activate"
{
@@ -96,9 +96,9 @@
}
"PlayerRunCmd"
{
"windows" "413"
"linux" "414"
"mac" "414"
"windows" "416"
"linux" "417"
"mac" "417"
}
}
+65 -24
View File
@@ -18,48 +18,48 @@
{
"GiveNamedItem"
{
"windows" "357"
"linux" "358"
"windows" "358"
"linux" "359"
}
"RemovePlayerItem"
{
"windows" "246"
"linux" "247"
"windows" "247"
"linux" "248"
}
"Weapon_GetSlot"
{
"windows" "241"
"linux" "242"
"windows" "242"
"linux" "243"
}
"Ignite"
{
"windows" "198"
"linux" "199"
"windows" "199"
"linux" "200"
}
"Extinguish"
{
"windows" "202"
"linux" "203"
"windows" "203"
"linux" "204"
}
"Teleport"
{
"windows" "103"
"linux" "104"
"windows" "104"
"linux" "105"
}
"CommitSuicide"
{
"windows" "402"
"linux" "402"
"windows" "405"
"linux" "405"
}
"GetVelocity"
{
"windows" "132"
"linux" "133"
"windows" "133"
"linux" "134"
}
"EyeAngles"
{
"windows" "124"
"linux" "125"
"windows" "125"
"linux" "126"
}
"AcceptInput"
{
@@ -73,8 +73,8 @@
}
"WeaponEquip"
{
"windows" "234"
"linux" "235"
"windows" "235"
"linux" "236"
}
"Activate"
{
@@ -83,8 +83,8 @@
}
"PlayerRunCmd"
{
"windows" "376"
"linux" "377"
"windows" "377"
"linux" "378"
}
}
"Signatures"
@@ -92,15 +92,56 @@
"FindEntityByClassname"
{
"library" "server"
"windows" "\x53\x55\x56\x8B\xF1\x8B\x2A\x2A\x2A\x57\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x40\xC1\xE0\x2A\x8B\x3C\x30\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\xC4\x2A\xEB\x2A\x39"
"windows" "\x55\x8B\xEC\x53\x56\x8B\xF1\x8B\x4D\x2A\x57\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x00\x25\x2A\x2A\x2A\x2A\x40\xC1\xE0\x2A\x8B\x3C\x30\xEB\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5D\x2A\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x2A\x2A\x2A\x2A\x83\xC4\x2A\xEB\x2A\x39"
"linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc"
}
"FireOutput"
{
"library" "server"
"windows" "\x81\xEC\x2A\x2A\x2A\x2A\x53\x55\x56\x8B\x71\x2A\x57\x89"
"windows" "\x55\x8B\xEC\x81\x2A\x2A\x2A\x2A\x2A\x53\x56\x8B\x71\x2A\x57"
"linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f"
}
}
}
"zps"
{
"Offsets"
{
/* Offset into CBaseTempEntity constructor */
"s_pTempEntities"
{
"windows" "19"
}
"GetTEName"
{
"windows" "4"
"linux" "4"
}
"GetTENext"
{
"windows" "8"
"linux" "8"
}
"TE_GetServerClass"
{
"windows" "0"
"linux" "0"
}
}
"Signatures"
{
"CBaseTempEntity"
{
"library" "server"
"windows" "\x55\x8B\xEC\x8B\xC1\x8B\x4D\x2A\xC7\x2A\x2A\x2A\x2A\x2A\x89"
}
"s_pTempEntities"
{
"library" "server"
"linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE"
}
}
}
}
+4 -4
View File
@@ -32,7 +32,7 @@
"ClanTagOffset"
{
"windows" "24"
"linux" "42"
"linux" "29"
"mac" "29"
}
}
@@ -69,21 +69,21 @@
"CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM
{
"library" "server"
"windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x89\x8D\x5C\x2A\x2A\x2A\xC6\x45\x2A\x2A\x8B\x8D\x5C\x2A\x2A\x2A\xE8"
"windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x89\x8D\x2A\x2A\x2A\x2A\xC6\x2A\x2A\x00\x8B\x8D\x2A\x2A\x2A\x2A\xE8"
"linux" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
"mac" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb"
}
"TerminateRound"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x8B\x2A\x2A\x56\x57\x33\xFF\x83"
"windows" "\x55\x8B\xEC\x83\xEC\x24\x53\x8B\x5D\x0C\x56\x57\x33\xFF"
"linux" "@_ZN12CCSGameRules14TerminateRoundEfi"
"mac" "@_ZN12CCSGameRules14TerminateRoundEfi"
}
"GetTranslatedWeaponAlias"
{
"library" "server"
"windows" "\x55\x8B\xEC\x56\x57\x8B\x2A\x2A\x33\xF6\x8D\x2A\x00\x00\x00\x00\x8B\x04\xF5\x2A\x2A\x2A\x2A\x57\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x2A\x85\xC0\x74\x2A\x83\xC6\x01\x83\x2A\x1A"
"windows" "\x55\x8B\xEC\x56\x57\x8B\x7D\x08\x33\xF6\x8D\x9B\x00\x00\x00\x00\x8B\x04\xF5\x2A\x2A\x2A\x2A\x57\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x08\x85\xC0\x74\x2A\x46\x83\xFE\x1A\x72\x2A\x8B\xC7\x5F"
"linux" "@_Z24GetTranslatedWeaponAliasPKc"
"mac" "@_Z24GetTranslatedWeaponAliasPKc"
}
+13 -13
View File
@@ -18,14 +18,14 @@
"Burn"
{
"library" "server"
"windows" "\x55\x8B\xEC\x51\x56\x8B\xF1\x8B\x2A\x2A\x2A\x2A\x2A\x8B\x01\x8B\x2A\x2A\x2A\x2A\x2A\xFF\xD2\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x57\x8D"
"windows" "\x55\x8B\xEC\x51\x56\x8B\xF1\x8B\x2A\x2A\x2A\x2A\x2A\x8B\x01\x8B\x2A\x2A\x2A\x2A\x2A\xFF\xD2\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x57\x6A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\xC1\x2A\x2A\x24\x01\x0F\x2A\x2A\x2A\x2A\x2A\x8B"
"linux" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase"
"mac" "@_ZN15CTFPlayerShared4BurnEP9CTFPlayerP13CTFWeaponBase"
}
"RemoveDisguise"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x08\x53\x56\x8B\xF1\x57\x8D\x9E"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\xF1\x6A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0"
"linux" "@_ZN15CTFPlayerShared14RemoveDisguiseEv"
"mac" "@_ZN15CTFPlayerShared14RemoveDisguiseEv"
}
@@ -41,7 +41,7 @@
"library" "server"
"linux" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
"mac" "@_ZN13CTFWeaponBase26CalcIsAttackCriticalHelperEv"
"windows" "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\x2A\x83\xC4\x2A\x55\x8B\x6B\x2A\x89\x6C\x24\x2A\x8B\xEC\x83\xEC\x2A\x56\x57\x6A\x00"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x56\x57\x6A\x00\x68\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\x6A\x00\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x50\xE8\x2A\x2A\x2A\x2A\x8B\xF8\x83\xC4\x2A\x85\xFF\x74\x2A\x8B"
}
"CalcCriticalMelee"
{
@@ -67,21 +67,21 @@
"AddCondition"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\x7D\x2A\x83\xFF\x2A\x8B\xF1\x7C\x2A\x8D\x47\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x45\x2A\xEB\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x7D\x2A\x8B\x8E\x2A\x2A\x2A\x2A\xD9"
"linux" "@_ZN15CTFPlayerShared7AddCondE7ETFCondf"
"mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondf"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\x7D\x2A\x8B\xF1\x83\xFF\x2A\x7C\x2A\x8D\x2A\x2A\x8D\x2A\x2A\x2A\x2A\x2A\x89\x2A\x2A\xEB\x2A\x83\xFF\x2A\x7C"
"linux" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
"mac" "@_ZN15CTFPlayerShared7AddCondE7ETFCondfP11CBaseEntity"
}
"RemoveCondition"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x57\x8B\x7D\x2A\x83\xFF\x2A\x8B\xF1\x7C\x2A\x8D\x47\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x45\x2A\xEB\x2A\x8D\x9E\x2A\x2A\x2A\x2A\x89\x7D\x2A\x8B\x4D"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x53\x56\x8B\x75\x2A\x57\x8B\xF9\x83"
"linux" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb"
"mac" "@_ZN15CTFPlayerShared10RemoveCondE7ETFCondb"
}
"SetPowerplayEnabled"
{
"library" "server"
"windows" "\x55\x8B\xEC\x80\x7D\x2A\x2A\x56\x8B\xF1\x74\x2A\x57\x8D\x45"
"windows" "\x55\x8B\xEC\x80\x2A\x2A\x2A\x56\x57\x8B\xF1\x74\x2A\x80\x2A\x2A\x2A\x2A\x2A\x2A\x74"
"linux" "@_ZN9CTFPlayer19SetPowerplayEnabledEb"
"mac" "@_ZN9CTFPlayer19SetPowerplayEnabledEb"
}
@@ -95,7 +95,7 @@
"StunPlayer"
{
"library" "server"
"windows" "\x55\x8B\xEC\x51\xD9\x05\x2A\x2A\x2A\x2A\x56\x57\x83\xEC\x14"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x56\x8B\xF1\x8B\x86\x2A\x2A\x2A\x2A\x40\x3D\x2A\x2A\x2A\x2A\x0F"
"linux" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer"
"mac" "@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer"
}
@@ -109,7 +109,7 @@
"MakeBleed"
{
"library" "server"
"windows" "\x55\x8B\xEC\x51\x56\x8B\xF1\x8B\x2A\x2A\x2A\x2A\x2A\x8B\x01\x8B\x2A\x2A\x2A\x2A\x2A\xFF\xD2\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x6A\x19"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x57\x8B\xF9\x8B\x8F\x2A\x2A\x2A\x2A\x8B\x01\x8B"
"linux" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasefi"
"mac" "@_ZN15CTFPlayerShared9MakeBleedEP9CTFPlayerP13CTFWeaponBasefi"
}
@@ -125,9 +125,9 @@
{
"ForceRespawn"
{
"windows" "321"
"linux" "322"
"mac" "322"
"windows" "323"
"linux" "324"
"mac" "324"
}
}
}
+1 -1
View File
@@ -506,7 +506,7 @@ stock bool:VoteMenuToAll(Handle:menu, time, flags=0)
for (new i=1; i<=MaxClients; i++)
{
if (!IsClientInGame(i))
if (!IsClientInGame(i) || IsFakeClient(i))
{
continue;
}
+14 -2
View File
@@ -109,6 +109,7 @@ enum TFCond
TFCond_NoHealingDamageBuff,
TFCond_SpeedBuffAlly,
TFCond_HalloweenCritCandy,
TFCond_CritCanteen,
TFCond_CritHype = 36,
TFCond_CritOnFirstBlood,
@@ -117,8 +118,18 @@ enum TFCond
TFCond_CritOnKill,
TFCond_RestrictToMelee,
TFCond_CritMmmph = 44,
TFCond_Reprogrammed = 43,
TFCond_CritMmmph,
TFCond_DefenseBuffMmmph,
TFCond_FocusBuff,
TFCond_DisguiseRemoved,
TFCond_MarkedForDeathSilent,
TFCond_DisguisedAsDispenser,
TFCond_Sapped,
TFCond_UberchargedHidden,
TFCond_UberchargedCanteen,
TFCond_HalloweenBombHead,
TFCond_HalloweenThriller,
};
enum TFHoliday
@@ -126,10 +137,11 @@ enum TFHoliday
TFHoliday_Birthday = 1,
TFHoliday_Halloween,
TFHoliday_Christmas,
TFHoliday_ValentinesDay,
TFHoliday_MeetThePyro,
TFHoliday_MannVsMachine,
TFHoliday_FullMoon,
TFHoliday_HalloweenOrFullMoon,
TFHoliday_HalloweenOrFullMoonOrValentines,
};
enum TFObjectType
+2 -2
View File
@@ -37,6 +37,6 @@
#define SOURCEMOD_V_MAJOR 1 /**< SourceMod Major version */
#define SOURCEMOD_V_MINOR 4 /**< SourceMod Minor version */
#define SOURCEMOD_V_RELEASE 5 /**< SourceMod Release version */
#define SOURCEMOD_V_RELEASE 7 /**< SourceMod Release version */
#define SOURCEMOD_VERSION "1.4.5" /**< SourceMod version string (major.minor.release.build) */
#define SOURCEMOD_VERSION "1.4.7" /**< SourceMod version string (major.minor.release.build) */
+1 -1
View File
@@ -1 +1 @@
1.4.5
1.4.7
+15 -1
View File
@@ -40,7 +40,7 @@
/** SourcePawn Engine API Version */
#define SOURCEPAWN_ENGINE_API_VERSION 4
#define SOURCEPAWN_ENGINE2_API_VERSION 3
#define SOURCEPAWN_ENGINE2_API_VERSION 4
#if !defined SOURCEMOD_BUILD
#define SOURCEMOD_BUILD
@@ -479,6 +479,20 @@ namespace SourcePawn
* @return Memory usage, in bytes.
*/
virtual size_t GetMemUsage() =0;
/**
* @brief Returns the MD5 hash of the plugin's P-Code.
*
* @return 16-byte buffer with MD5 hash of the plugin's P-Code.
*/
virtual unsigned char *GetCodeHash() =0;
/**
* @brief Returns the MD5 hash of the plugin's Data.
*
* @return 16-byte buffer with MD5 hash of the plugin's Data.
*/
virtual unsigned char *GetDataHash() =0;
};
/**
+1
View File
@@ -36,6 +36,7 @@ binary.AddSourceFiles('sourcepawn/jit', [
'zlib/trees.c',
'zlib/uncompr.c',
'zlib/zutil.c',
'md5/md5.cpp',
'../../knight/shared/KeCodeAllocator.cpp'
])
SM.AutoVersion('sourcepawn/jit', binary)
+30 -1
View File
@@ -8,6 +8,8 @@
#include "sp_vm_basecontext.h"
#include "engine2.h"
#include "md5/md5.h"
using namespace SourcePawn;
BaseRuntime::BaseRuntime() : m_Debug(&m_plugin), m_pPlugin(&m_plugin), m_pCtx(NULL),
@@ -18,6 +20,9 @@ m_PubFuncs(NULL), m_PubJitFuncs(NULL), m_pCo(NULL), m_CompSerial(0)
m_FuncCache = NULL;
m_MaxFuncs = 0;
m_NumFuncs = 0;
memset(m_CodeHash, 0, sizeof(m_CodeHash));
memset(m_DataHash, 0, sizeof(m_DataHash));
}
BaseRuntime::~BaseRuntime()
@@ -214,7 +219,11 @@ int BaseRuntime::CreateFromMemory(sp_file_hdr_t *hdr, uint8_t *base)
return SP_ERROR_FILE_FORMAT;
}
if ((plugin->flags & SP_FLAG_DEBUG) && (!(plugin->debug.files) || !(plugin->debug.lines) || !(plugin->debug.symbols)))
if ((plugin->flags & SP_FLAG_DEBUG) && (
!(plugin->debug.files) ||
!(plugin->debug.lines) ||
!(plugin->debug.symbols) ||
!(plugin->debug.stringbase) ))
{
return SP_ERROR_FILE_FORMAT;
}
@@ -227,6 +236,16 @@ int BaseRuntime::CreateFromMemory(sp_file_hdr_t *hdr, uint8_t *base)
memset(m_PubJitFuncs, 0, sizeof(JitFunction *) * m_pPlugin->num_publics);
}
MD5 md5_pcode;
md5_pcode.update(plugin->pcode, plugin->pcode_size);
md5_pcode.finalize();
md5_pcode.raw_digest(m_CodeHash);
MD5 md5_data;
md5_data.update(plugin->data, plugin->data_size);
md5_data.finalize();
md5_data.raw_digest(m_DataHash);
m_pPlugin->profiler = g_engine2.GetProfiler();
m_pCtx = new BaseContext(this);
m_pCo = g_Jit.StartCompilation(this);
@@ -483,6 +502,16 @@ size_t BaseRuntime::GetMemUsage()
return mem;
}
unsigned char *BaseRuntime::GetCodeHash()
{
return m_CodeHash;
}
unsigned char *BaseRuntime::GetDataHash()
{
return m_DataHash;
}
BaseContext *BaseRuntime::GetBaseContext()
{
return m_pCtx;
+5
View File
@@ -48,6 +48,8 @@ public:
virtual void SetPauseState(bool paused);
virtual bool IsPaused();
virtual size_t GetMemUsage();
virtual unsigned char *GetCodeHash();
virtual unsigned char *GetDataHash();
JitFunction *GetJittedFunction(uint32_t idx);
uint32_t AddJittedFunction(JitFunction *fn);
public:
@@ -65,6 +67,9 @@ public:
JitFunction **m_PubJitFuncs;
ICompilation *m_pCo;
unsigned int m_CompSerial;
unsigned char m_CodeHash[16];
unsigned char m_DataHash[16];
};
#endif //_INCLUDE_SOURCEPAWN_JIT_RUNTIME_H_
+476
View File
@@ -0,0 +1,476 @@
// MD5.CC - source code for the C++/object oriented translation and
// modification of MD5.
// Translation and modification (c) 1995 by Mordechai T. Abzug
// This translation/ modification is provided "as is," without express or
// implied warranty of any kind.
// The translator/ modifier does not claim (1) that MD5 will do what you think
// it does; (2) that this translation/ modification is accurate; or (3) that
// this software is "merchantible." (Language for this disclaimer partially
// copied from the disclaimer below).
/* based on:
MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
MDDRIVER.C - test driver for MD2, MD4 and MD5
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
#include "md5.h"
#include <assert.h>
#include <string.h>
// MD5 simple initialization method
MD5::MD5(){
init();
}
// MD5 block update operation. Continues an MD5 message-digest
// operation, processing another message block, and updating the
// context.
void MD5::update (uint1 *input, uint4 input_length) {
uint4 input_index, buffer_index;
uint4 buffer_space; // how much space is left in buffer
if (finalized){ // so we can't update!
/*cerr << "MD5::update: Can't update a finalized digest!" << endl;*/
return;
}
// Compute number of bytes mod 64
buffer_index = (unsigned int)((count[0] >> 3) & 0x3F);
// Update number of bits
if ( (count[0] += ((uint4) input_length << 3))<((uint4) input_length << 3) )
count[1]++;
count[1] += ((uint4)input_length >> 29);
buffer_space = 64 - buffer_index; // how much space is left in buffer
// Transform as many times as possible.
if (input_length >= buffer_space) { // ie. we have enough to fill the buffer
// fill the rest of the buffer and transform
memcpy (buffer + buffer_index, input, buffer_space);
transform (buffer);
// now, transform each 64-byte piece of the input, bypassing the buffer
for (input_index = buffer_space; input_index + 63 < input_length;
input_index += 64)
transform (input+input_index);
buffer_index = 0; // so we can buffer remaining
}
else
input_index=0; // so we can buffer the whole input
// and here we do the buffering:
memcpy(buffer+buffer_index, input+input_index, input_length-input_index);
}
// MD5 update for files.
// Like above, except that it works on files (and uses above as a primitive.)
void MD5::update(FILE *file){
unsigned char buffer[1024];
int len;
while ((len=fread(buffer, 1, 1024, file)))
update(buffer, len);
fclose (file);
}
// MD5 finalization. Ends an MD5 message-digest operation, writing the
// the message digest and zeroizing the context.
void MD5::finalize (){
unsigned char bits[8];
unsigned int index, padLen;
static uint1 PADDING[64]={
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
if (finalized){
/* cerr << "MD5::finalize: Already finalized this digest!" << endl;*/
return;
}
// Save number of bits
encode (bits, count, 8);
// Pad out to 56 mod 64.
index = (uint4) ((count[0] >> 3) & 0x3f);
padLen = (index < 56) ? (56 - index) : (120 - index);
update (PADDING, padLen);
// Append length (before padding)
update (bits, 8);
// Store state in digest
encode (digest, state, 16);
// Zeroize sensitive information
memset (buffer, 0, sizeof(*buffer));
finalized=1;
}
MD5::MD5(FILE *file){
init(); // must be called be all constructors
update(file);
finalize ();
}
unsigned char *MD5::raw_digest(){
uint1 *s = new uint1[16];
if (!finalized){
/* cerr << "MD5::raw_digest: Can't get digest if you haven't "<<
"finalized the digest!" <<endl;*/
return ( (unsigned char*) "");
}
memcpy(s, digest, 16);
return s;
}
unsigned char *MD5::raw_digest(unsigned char buffer[16])
{
if (!finalized)
{
return ( (unsigned char*) "");
}
memcpy(buffer, digest, 16);
return buffer;
}
char *MD5::hex_digest(){
int i;
char *s= new char[33];
assert(finalized);
for (i=0; i<16; i++)
sprintf(s+i*2, "%02x", digest[i]);
s[32]='\0';
return s;
}
char *MD5::hex_digest(char buffer[33]){
int i;
assert(finalized);
for (i=0; i<16; i++)
sprintf(buffer+i*2, "%02x", digest[i]);
buffer[32]='\0';
return buffer;
}
// PRIVATE METHODS:
void MD5::init(){
finalized=0; // we just started!
// Nothing counted, so count=0
count[0] = 0;
count[1] = 0;
// Load magic initialization constants.
state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;
}
// Constants for MD5Transform routine.
// Although we could use C++ style constants, defines are actually better,
// since they let us easily evade scope clashes.
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
// MD5 basic transformation. Transforms state based on block.
void MD5::transform (uint1 block[64]){
uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
decode (x, block, 64);
assert(!finalized); // not just a user error, since the method is private
/* Round 1 */
FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
/* Round 2 */
GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */
HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */
II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
// Zeroize sensitive information.
memset ( (uint1 *) x, 0, sizeof(x));
}
// Encodes input (UINT4) into output (unsigned char). Assumes len is
// a multiple of 4.
void MD5::encode (uint1 *output, uint4 *input, uint4 len) {
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (uint1) (input[i] & 0xff);
output[j+1] = (uint1) ((input[i] >> 8) & 0xff);
output[j+2] = (uint1) ((input[i] >> 16) & 0xff);
output[j+3] = (uint1) ((input[i] >> 24) & 0xff);
}
}
// Decodes input (unsigned char) into output (UINT4). Assumes len is
// a multiple of 4.
void MD5::decode (uint4 *output, uint1 *input, uint4 len){
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
(((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
}
// Note: Replace "for loop" with standard memcpy if possible.
void MD5::memcpy (uint1 *output, uint1 *input, uint4 len){
unsigned int i;
for (i = 0; i < len; i++)
output[i] = input[i];
}
// Note: Replace "for loop" with standard memset if possible.
void MD5::memset (uint1 *output, uint1 value, uint4 len){
unsigned int i;
for (i = 0; i < len; i++)
output[i] = value;
}
// ROTATE_LEFT rotates x left n bits.
inline unsigned int MD5::rotate_left (uint4 x, uint4 n){
return (x << n) | (x >> (32-n)) ;
}
// F, G, H and I are basic MD5 functions.
inline unsigned int MD5::F (uint4 x, uint4 y, uint4 z){
return (x & y) | (~x & z);
}
inline unsigned int MD5::G (uint4 x, uint4 y, uint4 z){
return (x & z) | (y & ~z);
}
inline unsigned int MD5::H (uint4 x, uint4 y, uint4 z){
return x ^ y ^ z;
}
inline unsigned int MD5::I (uint4 x, uint4 y, uint4 z){
return y ^ (x | ~z);
}
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
// Rotation is separate from addition to prevent recomputation.
inline void MD5::FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += F(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
inline void MD5::GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += G(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
inline void MD5::HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += H(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
inline void MD5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac){
a += I(b, c, d) + x + ac;
a = rotate_left (a, s) +b;
}
+106
View File
@@ -0,0 +1,106 @@
// MD5.CC - source code for the C++/object oriented translation and
// modification of MD5.
// Translation and modification (c) 1995 by Mordechai T. Abzug
// This translation/ modification is provided "as is," without express or
// implied warranty of any kind.
// The translator/ modifier does not claim (1) that MD5 will do what you think
// it does; (2) that this translation/ modification is accurate; or (3) that
// this software is "merchantible." (Language for this disclaimer partially
// copied from the disclaimer below).
/* based on:
MD5.H - header file for MD5C.C
MDDRIVER.C - test driver for MD2, MD4 and MD5
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
#include <stdio.h>
//#include <fstream.h>
//#include <iostream.h>
class MD5 {
public:
// methods for controlled operation:
MD5 (); // simple initializer
void update (unsigned char *input, unsigned int input_length);
void update (FILE *file);
void finalize ();
// constructors for special circumstances. All these constructors finalize
// the MD5 context.
MD5 (unsigned char *string); // digest string, finalize
MD5 (FILE *file); // digest file, close, finalize
// methods to acquire finalized result
unsigned char *raw_digest (); // digest as a 16-byte binary array
unsigned char *raw_digest(unsigned char buffer[16]);
char * hex_digest (); // digest as a 33-byte ascii-hex string
char * hex_digest (char buffer[33]); //same as above, passing buffer
private:
// first, some types:
typedef unsigned int uint4; // assumes integer is 4 words long
typedef unsigned short int uint2; // assumes short integer is 2 words long
typedef unsigned char uint1; // assumes char is 1 word long
// next, the private data:
uint4 state[4];
uint4 count[2]; // number of *bits*, mod 2^64
uint1 buffer[64]; // input buffer
uint1 digest[16];
uint1 finalized;
// last, the private methods, mostly static:
void init (); // called by all constructors
void transform (uint1 *buffer); // does the real update work. Note
// that length is implied to be 64.
static void encode (uint1 *dest, uint4 *src, uint4 length);
static void decode (uint4 *dest, uint1 *src, uint4 length);
static void memcpy (uint1 *dest, uint1 *src, uint4 length);
static void memset (uint1 *start, uint1 val, uint4 length);
static inline uint4 rotate_left (uint4 x, uint4 n);
static inline uint4 F (uint4 x, uint4 y, uint4 z);
static inline uint4 G (uint4 x, uint4 y, uint4 z);
static inline uint4 H (uint4 x, uint4 y, uint4 z);
static inline uint4 I (uint4 x, uint4 y, uint4 z);
static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
};