Skip to content

Commit 2803696

Browse files
authored
Fix Miscellaneous Regressions and UBs (#1022)
1 parent 2164f51 commit 2803696

6 files changed

Lines changed: 39 additions & 72 deletions

File tree

core/logic/CellArray.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,17 @@ class CellArray : public ICellArray
227227
/* finally, allocate the new block */
228228
if (m_Data)
229229
{
230-
m_Data = (cell_t *)realloc(m_Data, sizeof(cell_t) * m_BlockSize * m_AllocSize);
230+
cell_t *data = static_cast<cell_t*>(realloc(m_Data, sizeof(cell_t) * m_BlockSize * m_AllocSize));
231+
if (!data) // allocation failure
232+
{
233+
return false;
234+
}
235+
236+
m_Data = data;
231237
} else {
232-
m_Data = (cell_t *)malloc(sizeof(cell_t) * m_BlockSize * m_AllocSize);
238+
m_Data = static_cast<cell_t*>(malloc(sizeof(cell_t) * m_BlockSize * m_AllocSize));
233239
}
234-
return (m_Data != NULL);
240+
return (m_Data != nullptr);
235241
}
236242
private:
237243
cell_t *m_Data;

core/logic/ExtensionSys.cpp

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -416,65 +416,20 @@ void CExtension::AddChildDependent(CExtension *pOther, SMInterface *iface)
416416
m_ChildDeps.push_back(info);
417417
}
418418

419+
// note: dependency iteration deprecated since 1.10
419420
ITERATOR *CExtension::FindFirstDependency(IExtension **pOwner, SMInterface **pInterface)
420421
{
421-
List<IfaceInfo>::iterator iter = m_Deps.begin();
422-
423-
if (iter == m_Deps.end())
424-
{
425-
return NULL;
426-
}
427-
428-
if (pOwner)
429-
{
430-
*pOwner = (*iter).owner;
431-
}
432-
if (pInterface)
433-
{
434-
*pInterface = (*iter).iface;
435-
}
436-
437-
List<IfaceInfo>::iterator *pIter = new List<IfaceInfo>::iterator(iter);
438-
439-
return (ITERATOR *)pIter;
422+
return nullptr;
440423
}
441424

442425
bool CExtension::FindNextDependency(ITERATOR *iter, IExtension **pOwner, SMInterface **pInterface)
443426
{
444-
List<IfaceInfo>::iterator *pIter = (List<IfaceInfo>::iterator *)iter;
445-
List<IfaceInfo>::iterator _iter;
446-
447-
if (_iter == m_Deps.end())
448-
{
449-
return false;
450-
}
451-
452-
_iter++;
453-
454-
if (pOwner)
455-
{
456-
*pOwner = (*_iter).owner;
457-
}
458-
if (pInterface)
459-
{
460-
*pInterface = (*_iter).iface;
461-
}
462-
463-
*pIter = _iter;
464-
465-
if (_iter == m_Deps.end())
466-
{
467-
return false;
468-
}
469-
470-
return true;
427+
return false;
471428
}
472429

473430
void CExtension::FreeDependencyIterator(ITERATOR *iter)
474431
{
475-
List<IfaceInfo>::iterator *pIter = (List<IfaceInfo>::iterator *)iter;
476432

477-
delete pIter;
478433
}
479434

480435
void CExtension::AddInterface(SMInterface *pInterface)

core/logic/ShareSys.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,18 +162,16 @@ bool ShareSystem::RequestInterface(const char *iface_name,
162162
SMInterface **pIface)
163163
{
164164
/* See if the interface exists */
165-
List<IfaceInfo>::iterator iter;
166165
SMInterface *iface;
167-
IExtension *iface_owner;
166+
IExtension *iface_owner = nullptr;
168167
bool found = false;
169-
for (iter=m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
168+
for (auto iter = m_Interfaces.begin(); iter!=m_Interfaces.end(); iter++)
170169
{
171-
IfaceInfo &info = (*iter);
170+
IfaceInfo &info = *iter;
172171
iface = info.iface;
173172
if (strcmp(iface->GetInterfaceName(), iface_name) == 0)
174173
{
175-
if (iface->GetInterfaceVersion() == iface_vers
176-
|| iface->IsVersionCompatible(iface_vers))
174+
if (iface->GetInterfaceVersion() == iface_vers || iface->IsVersionCompatible(iface_vers))
177175
{
178176
iface_owner = info.owner;
179177
found = true;

core/logic/stringutil.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,11 @@ class StaticCharBuf
381381
{
382382
if (len > max_size)
383383
{
384-
buffer = (char *)realloc(buffer, len);
384+
auto *newbuffer = static_cast<char *>(realloc(buffer, len));
385+
if (!newbuffer)
386+
return nullptr;
387+
388+
buffer = newbuffer;
385389
max_size = len;
386390
}
387391
return buffer;
@@ -420,7 +424,11 @@ cell_t InternalFormat(IPluginContext *pCtx, const cell_t *params, int start)
420424
{
421425
if (maxlen > sizeof(g_formatbuf))
422426
{
423-
__copy_buf = g_extrabuf.GetWithSize(maxlen);
427+
char *tmpbuff = g_extrabuf.GetWithSize(maxlen);
428+
if (!tmpbuff)
429+
return pCtx->ThrowNativeError("Unable to allocate buffer with a size of \"%u\"", maxlen);
430+
431+
__copy_buf = tmpbuff;
424432
}
425433
else
426434
{

core/smn_entities.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2595,7 +2595,7 @@ static cell_t GetEntityFlags(IPluginContext *pContext, const cell_t *params)
25952595

25962596
for (int32_t i = 0; i < 32; i++)
25972597
{
2598-
int32_t flag = (1<<i);
2598+
int32_t flag = (1U<<i);
25992599
if ((actual_flags & flag) == flag)
26002600
{
26012601
sm_flags |= SDKEntFlagToSMEntFlag(flag);
@@ -2641,7 +2641,7 @@ static cell_t SetEntityFlags(IPluginContext *pContext, const cell_t *params)
26412641

26422642
for (int32_t i = 0; i < 32; i++)
26432643
{
2644-
int32_t flag = (1<<i);
2644+
int32_t flag = (1U<<i);
26452645
if ((sm_flags & flag) == flag)
26462646
{
26472647
actual_flags |= SMEntFlagToSDKEntFlag(flag);

public/IExtensionSys.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,28 +84,28 @@ namespace SourceMod
8484
virtual IdentityToken_t *GetIdentity() =0;
8585

8686
/**
87-
* @brief Retrieves the extension dependency list for this extension.
87+
* @brief Deprecated, do not use.
8888
*
89-
* @param pOwner Optional pointer to store the first interface's owner.
90-
* @param pInterface Optional pointer to store the first interface.
91-
* @return An ITERATOR pointer for the results, or NULL if no results at all.
89+
* @param pOwner Unused
90+
* @param pInterface Unused
91+
* @return nullptr
9292
*/
9393
virtual ITERATOR *FindFirstDependency(IExtension **pOwner, SMInterface **pInterface) =0;
9494

9595
/**
96-
* @brief Finds the next dependency in the dependency list.
96+
* @brief Deprecated, do not use.
9797
*
98-
* @param iter Pointer to iterator from FindFirstDependency.
99-
* @param pOwner Optional pointer to store the interface's owner.
100-
* @param pInterface Optional pointer to store the interface.
101-
* @return True if there are more results after this, false otherwise.
98+
* @param iter Unused
99+
* @param pOwner Unused
100+
* @param pInterface Unused
101+
* @return false
102102
*/
103103
virtual bool FindNextDependency(ITERATOR *iter, IExtension **pOwner, SMInterface **pInterface) =0;
104104

105105
/**
106-
* @brief Frees an ITERATOR handle from FindFirstDependency.
106+
* @brief Deprecated, do not use.
107107
*
108-
* @param iter Pointer to iterator to free.
108+
* @param iter Unused
109109
*/
110110
virtual void FreeDependencyIterator(ITERATOR *iter) =0;
111111

0 commit comments

Comments
 (0)