Fix some memory errors (bug 5904, r=ds).

This commit is contained in:
David Anderson 2013-10-29 18:58:34 -04:00
parent 66dd3f08b1
commit 96d6cf8def
6 changed files with 37 additions and 23 deletions

View File

@ -212,7 +212,7 @@ void CHalfLife2::InitCommandLine()
return;
}
ILibrary *lib = g_LibSys.OpenLibrary(path, error, sizeof(error));
ke::AutoPtr<ILibrary> lib(g_LibSys.OpenLibrary(path, error, sizeof(error)));
m_pGetCommandLine = lib->GetSymbolAddress("CommandLine_Tier0");
/* '_Tier0' dropped on Alien Swarm version */
@ -224,7 +224,6 @@ void CHalfLife2::InitCommandLine()
if (m_pGetCommandLine == NULL)
{
/* We probably have a Ship engine. */
lib->CloseLibrary();
g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "../bin/" VSTDLIB_NAME);
if (!g_LibSys.IsPathFile(path))
{
@ -244,8 +243,6 @@ void CHalfLife2::InitCommandLine()
{
g_Logger.LogError("Could not locate any command line functionality");
}
lib->CloseLibrary();
}
}

View File

@ -35,6 +35,7 @@
#include <ISourceMod.h>
#include "common_logic.h"
#include "PluginSys.h"
#include <am-utility.h>
CExtensionManager g_Extensions;
IdentityType_t g_ExtType;
@ -537,11 +538,9 @@ void CExtensionManager::TryAutoload()
g_pSM->BuildPath(Path_SM, path, sizeof(path), "extensions");
IDirectory *pDir = libsys->OpenDirectory(path);
ke::AutoPtr<IDirectory> pDir(libsys->OpenDirectory(path));
if (!pDir)
{
return;
}
const char *lfile;
size_t len;

View File

@ -186,6 +186,7 @@ static bool get_game_name(char *buffer, size_t maxlength)
if ((str = pGameInfo->GetString("game", NULL)) != NULL)
{
strncopy(buffer, str, maxlength);
pGameInfo->deleteThis();
return true;
}
}

View File

@ -84,7 +84,7 @@ TopMenu::~TopMenu()
{
TearDownClient(&m_clients[i]);
}
delete [] m_clients;
free(m_clients);
}
unsigned int TopMenu::CalcMemUsage()

View File

@ -37,6 +37,7 @@
#if defined(_MSC_VER)
# include <intrin.h>
#endif
#include <am-moveable.h>
#define KE_32BIT
@ -62,6 +63,18 @@ ReturnAndVoid(T &t)
return saved;
}
#if __cplusplus >= 201103L
# define KE_CXX11
#endif
#if defined(KE_CXX11)
# define KE_DELETE = delete
# define KE_OVERRIDE = override
#else
# define KE_DELETE
# define KE_OVERRIDE
#endif
// Wrapper that automatically deletes its contents. The pointer can be taken
// to avoid destruction.
template <typename T>
@ -74,10 +87,15 @@ class AutoPtr
: t_(NULL)
{
}
explicit AutoPtr(T *t)
AutoPtr(T *t)
: t_(t)
{
}
AutoPtr(Moveable<AutoPtr<T> > &other)
{
t_ = other->t_;
other->t_ = NULL;
}
~AutoPtr() {
delete t_;
}
@ -93,13 +111,24 @@ class AutoPtr
operator T *() const {
return t_;
}
void operator =(T *t) {
T *operator =(T *t) {
delete t_;
t_ = t;
return t_;
}
T *operator =(Moveable<AutoPtr<T> > &other) {
delete t_;
t_ = other->t_;
other->t_ = NULL;
return t_;
}
bool operator !() const {
return !t_;
}
private:
AutoPtr(const AutoPtr &other) KE_DELETE;
AutoPtr &operator =(const AutoPtr &other) KE_DELETE;
};
// Wrapper that automatically deletes its contents. The pointer can be taken
@ -298,18 +327,6 @@ class StorageBuffer
};
};
#if __cplusplus >= 201103L
# define KE_CXX11
#endif
#if defined(KE_CXX11)
# define KE_DELETE delete
# define KE_OVERRIDE override
#else
# define KE_DELETE
# define KE_OVERRIDE
#endif
#if defined(_MSC_VER)
# define KE_SIZET_FMT "%Iu"
#elif defined(__GNUC__)

View File

@ -256,7 +256,7 @@ Interpret(BaseRuntime *rt, uint32_t aCodeStart, cell_t *rval)
break;
case OP_ZERO_S:
Write(plugin, *cip++, 0);
Write(plugin, ctx->frm + *cip++, 0);
break;
case OP_PUSH_PRI: