From: Vadim Zeitlin Date: Sat, 19 Feb 2005 16:53:49 +0000 (+0000) Subject: fixed hash collisions in ZIP files (patch 1082026) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/62d9eab60c5e363acecf3689f13aa2f552159722 fixed hash collisions in ZIP files (patch 1082026) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32193 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/fs_zip.h b/include/wx/fs_zip.h index d449cb072a..3276be7186 100644 --- a/include/wx/fs_zip.h +++ b/include/wx/fs_zip.h @@ -21,6 +21,10 @@ #include "wx/filesys.h" #include "wx/hashmap.h" + +WX_DECLARE_STRING_HASH_MAP(int, wxZipFilenameHashMap); + + //--------------------------------------------------------------------------- // wxZipFSHandler //--------------------------------------------------------------------------- @@ -40,7 +44,7 @@ class WXDLLIMPEXP_BASE wxZipFSHandler : public wxFileSystemHandler class wxZipInputStream *m_Archive; wxString m_Pattern, m_BaseDir, m_ZipFile; bool m_AllowDirs, m_AllowFiles; - wxLongToLongHashMap *m_DirsFound; + wxZipFilenameHashMap *m_DirsFound; wxString DoFind(); void CloseArchive(class wxZipInputStream *archive); diff --git a/src/common/fs_zip.cpp b/src/common/fs_zip.cpp index 136cbb9d37..d2210718ce 100644 --- a/src/common/fs_zip.cpp +++ b/src/common/fs_zip.cpp @@ -166,7 +166,7 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags) if (m_AllowDirs) { delete m_DirsFound; - m_DirsFound = new wxLongToLongHashMap(); + m_DirsFound = new wxZipFilenameHashMap(); } return DoFind(); } @@ -205,12 +205,9 @@ wxString wxZipFSHandler::DoFind() dir = namestr.BeforeLast(wxT('/')); while (!dir.IsEmpty()) { - long key = 0; - for (size_t i = 0; i < dir.Length(); i++) key += (wxUChar)dir[i]; - wxLongToLongHashMap::iterator it = m_DirsFound->find(key); - if (it == m_DirsFound->end()) + if( m_DirsFound->find(dir) == m_DirsFound->end() ) { - (*m_DirsFound)[key] = 1; + (*m_DirsFound)[dir] = 1; filename = dir.AfterLast(wxT('/')); dir = dir.BeforeLast(wxT('/')); if (!filename.IsEmpty() && m_BaseDir == dir &&