@@ -26,7 +26,7 @@ SYMBOL_PARSER::~SYMBOL_PARSER()
2626 }
2727}
2828
29- bool SYMBOL_PARSER::VerifyExistingPdb (GUID guid)
29+ bool SYMBOL_PARSER::VerifyExistingPdb (const GUID & guid)
3030{
3131 std::ifstream f (m_szPdbPath.c_str (), std::ios::binary | std::ios::ate);
3232 if (f.bad ())
@@ -63,16 +63,31 @@ bool SYMBOL_PARSER::VerifyExistingPdb(GUID guid)
6363
6464 auto * pPDBHeader = ReCa<PDBHeader7*>(pdb_raw);
6565
66- int min_file_size = (int )pPDBHeader->root_stream_page_number_list_number * pPDBHeader->page_size + pPDBHeader->root_stream_size ;
67- if (size_on_disk < (size_t )min_file_size)
66+ if (memcmp (pPDBHeader->signature , " Microsoft C/C++ MSF 7.00\r\n\x1A " " DS\0\0\0 " , sizeof (PDBHeader7::signature)))
6867 {
6968 delete[] pdb_raw;
7069
7170 return false ;
7271 }
7372
74- int * pRootPageNumber = ReCa<int *>(pdb_raw + (size_t )pPDBHeader->root_stream_page_number_list_number * pPDBHeader->page_size );
75- auto * pRootStream = ReCa<RootStream7*>(pdb_raw + (size_t )(*pRootPageNumber) * pPDBHeader->page_size );
73+ if (size_on_disk < (size_t )pPDBHeader->page_size * pPDBHeader->file_page_count )
74+ {
75+ delete[] pdb_raw;
76+
77+ return false ;
78+ }
79+
80+ int * pRootPageNumber = ReCa<int *>(pdb_raw + (size_t )pPDBHeader->root_stream_page_number_list_number * pPDBHeader->page_size );
81+ auto * pRootStream = ReCa<RootStream7*>(pdb_raw + (size_t )(*pRootPageNumber) * pPDBHeader->page_size );
82+
83+ int size = 0 ;
84+ for (int i = 0 ; i < pRootStream->num_streams ; ++i)
85+ {
86+ if (pRootStream->stream_sizes [i] == 0xFFFFFFFF )
87+ continue ;
88+
89+ size += pRootStream->stream_sizes [i];
90+ }
7691
7792 std::map<int , std::vector<int >> streams;
7893 int current_page_number = 0 ;
@@ -100,9 +115,9 @@ bool SYMBOL_PARSER::VerifyExistingPdb(GUID guid)
100115 auto pdb_info_stream = streams.at (1 );
101116 auto pdb_info_page_index = pdb_info_stream.at (0 );
102117
103- auto * stram_data = ReCa<GUID_StreamData*>(pdb_raw + (size_t )(pdb_info_page_index) * pPDBHeader->page_size );
118+ auto * stream_data = ReCa<GUID_StreamData*>(pdb_raw + (size_t )(pdb_info_page_index) * pPDBHeader->page_size );
104119
105- int guid_eq = memcmp (&stram_data ->guid , &guid, sizeof (GUID));
120+ int guid_eq = memcmp (&stream_data ->guid , &guid, sizeof (GUID));
106121
107122 delete[] pdb_raw;
108123
0 commit comments