added some checks for .mo integrity (part of patch 649438)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21822 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -188,21 +188,37 @@ private:
|
|||||||
// all data is stored here, NULL if no data loaded
|
// all data is stored here, NULL if no data loaded
|
||||||
size_t8 *m_pData;
|
size_t8 *m_pData;
|
||||||
|
|
||||||
|
// amount of memory pointed to by m_pData.
|
||||||
|
size_t32 m_nSize;
|
||||||
|
|
||||||
// data description
|
// data description
|
||||||
size_t32 m_numStrings; // number of strings in this domain
|
size_t32 m_numStrings; // number of strings in this domain
|
||||||
wxMsgTableEntry *m_pOrigTable, // pointer to original strings
|
wxMsgTableEntry *m_pOrigTable, // pointer to original strings
|
||||||
*m_pTransTable; // translated
|
*m_pTransTable; // translated
|
||||||
|
|
||||||
const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const
|
// swap the 2 halves of 32 bit integer if needed
|
||||||
{ return (const char *)(m_pData + Swap(pTable[index].ofsString)); }
|
size_t32 Swap(size_t32 ui) const
|
||||||
|
{
|
||||||
|
return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
|
||||||
|
((ui >> 8) & 0xff00) | (ui >> 24)
|
||||||
|
: ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const
|
||||||
|
{
|
||||||
|
const wxMsgTableEntry * const ent = pTable + n;
|
||||||
|
|
||||||
|
// this check could fail for a corrupt message catalog
|
||||||
|
size_t32 ofsString = Swap(ent->ofsString);
|
||||||
|
if ( ofsString + Swap(ent->nLen) > m_nSize)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return (const char *)(m_pData + ofsString);
|
||||||
|
}
|
||||||
|
|
||||||
wxString GetCharset() const;
|
wxString GetCharset() const;
|
||||||
|
|
||||||
// utility functions
|
bool m_bSwapped; // wrong endianness?
|
||||||
// big<->little endian
|
|
||||||
inline size_t32 Swap(size_t32 ui) const;
|
|
||||||
|
|
||||||
bool m_bSwapped; // wrong endianness?
|
|
||||||
|
|
||||||
DECLARE_NO_COPY_CLASS(wxMsgCatalogFile)
|
DECLARE_NO_COPY_CLASS(wxMsgCatalogFile)
|
||||||
};
|
};
|
||||||
@@ -250,22 +266,15 @@ static wxArrayString s_searchPrefixes;
|
|||||||
// wxMsgCatalogFile class
|
// wxMsgCatalogFile class
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// swap the 2 halves of 32 bit integer if needed
|
|
||||||
size_t32 wxMsgCatalogFile::Swap(size_t32 ui) const
|
|
||||||
{
|
|
||||||
return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
|
|
||||||
((ui >> 8) & 0xff00) | (ui >> 24)
|
|
||||||
: ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxMsgCatalogFile::wxMsgCatalogFile()
|
wxMsgCatalogFile::wxMsgCatalogFile()
|
||||||
{
|
{
|
||||||
m_pData = NULL;
|
m_pData = NULL;
|
||||||
|
m_nSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMsgCatalogFile::~wxMsgCatalogFile()
|
wxMsgCatalogFile::~wxMsgCatalogFile()
|
||||||
{
|
{
|
||||||
wxDELETEA(m_pData);
|
wxDELETEA(m_pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return all directories to search for given prefix
|
// return all directories to search for given prefix
|
||||||
@@ -414,6 +423,7 @@ bool wxMsgCatalogFile::Load(const wxChar *szDirPrefix, const wxChar *szName0)
|
|||||||
Swap(pHeader->ofsOrigTable));
|
Swap(pHeader->ofsOrigTable));
|
||||||
m_pTransTable = (wxMsgTableEntry *)(m_pData +
|
m_pTransTable = (wxMsgTableEntry *)(m_pData +
|
||||||
Swap(pHeader->ofsTransTable));
|
Swap(pHeader->ofsTransTable));
|
||||||
|
m_nSize = nSize;
|
||||||
|
|
||||||
// everything is fine
|
// everything is fine
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
Reference in New Issue
Block a user