@@ -54,6 +54,21 @@ struct pdb_reader
54
54
DWORD file_used [1024 ];
55
55
};
56
56
57
+ static inline BOOL has_file_been_read (struct pdb_reader * reader , unsigned file_nr )
58
+ {
59
+ return reader -> file_used [file_nr / 32 ] & (1 << (file_nr % 32 ));
60
+ }
61
+
62
+ static inline void mark_file_been_read (struct pdb_reader * reader , unsigned file_nr )
63
+ {
64
+ reader -> file_used [file_nr / 32 ] |= 1 << (file_nr % 32 );
65
+ }
66
+
67
+ static inline void clear_file_been_read (struct pdb_reader * reader , unsigned file_nr )
68
+ {
69
+ reader -> file_used [file_nr / 32 ] &= ~(1 << (file_nr % 32 ));
70
+ }
71
+
57
72
static void * pdb_jg_read (const struct PDB_JG_HEADER * pdb , const WORD * block_list , int size )
58
73
{
59
74
int i , nBlocks ;
@@ -78,7 +93,7 @@ static void* pdb_jg_read_file(struct pdb_reader* reader, DWORD file_nr)
78
93
79
94
if (!reader -> u .jg .toc || file_nr >= reader -> u .jg .toc -> num_files ) return NULL ;
80
95
81
- reader -> file_used [ file_nr / 32 ] |= 1 << ( file_nr % 32 );
96
+ mark_file_been_read ( reader , file_nr );
82
97
if (reader -> u .jg .toc -> file [file_nr ].size == 0 ||
83
98
reader -> u .jg .toc -> file [file_nr ].size == 0xFFFFFFFF )
84
99
return NULL ;
@@ -125,7 +140,7 @@ static void pdb_exit(struct pdb_reader* reader)
125
140
126
141
for (i = 0 ; i < pdb_get_num_files (reader ); i ++ )
127
142
{
128
- if (reader -> file_used [ i / 32 ] & ( 1 << ( i % 32 ) )) continue ;
143
+ if (has_file_been_read ( reader , i )) continue ;
129
144
130
145
file = reader -> read_file (reader , i );
131
146
if (!file ) continue ;
@@ -615,7 +630,14 @@ static void pdb_dump_types_hash(struct pdb_reader* reader, unsigned file, const
615
630
static void pdb_dump_types (struct pdb_reader * reader , unsigned strmidx , const char * strmname )
616
631
{
617
632
PDB_TYPES * types = NULL ;
633
+ BOOL used = has_file_been_read (reader , strmidx );
618
634
635
+ if (pdb_get_file_size (reader , strmidx ) < sizeof (* types ))
636
+ {
637
+ if (strmidx == 2 )
638
+ printf ("-Too small type header\n" );
639
+ return ;
640
+ }
619
641
types = reader -> read_file (reader , strmidx );
620
642
if (!types ) return ;
621
643
@@ -628,7 +650,12 @@ static void pdb_dump_types(struct pdb_reader* reader, unsigned strmidx, const ch
628
650
case 20040203 : /* VC 8.0 */
629
651
break ;
630
652
default :
631
- printf ("-Unknown type info version %d\n" , types -> version );
653
+ /* IPI stream is not always present in older PDB files */
654
+ if (strmidx == 2 )
655
+ printf ("-Unknown type info version %d\n" , types -> version );
656
+ free (types );
657
+ if (used ) clear_file_been_read (reader , strmidx );
658
+ return ;
632
659
}
633
660
634
661
/* Read type table */
@@ -870,7 +897,7 @@ static void* pdb_ds_read_file(struct pdb_reader* reader, DWORD file_number)
870
897
871
898
if (!reader -> u .ds .toc || file_number >= reader -> u .ds .toc -> num_files ) return NULL ;
872
899
873
- reader -> file_used [ file_number / 32 ] |= 1 << ( file_number % 32 );
900
+ mark_file_been_read ( reader , file_number );
874
901
if (reader -> u .ds .toc -> file_size [file_number ] == 0 ||
875
902
reader -> u .ds .toc -> file_size [file_number ] == 0xFFFFFFFF )
876
903
return NULL ;
@@ -932,7 +959,7 @@ static void pdb_ds_dump(void)
932
959
* - segments
933
960
* - extended FPO data
934
961
*/
935
- reader . file_used [ 0 ] |= 1 ; /* mark stream #0 as read */
962
+ mark_file_been_read ( & reader , 0 ) ; /* mark stream #0 as read */
936
963
reader .u .ds .root = reader .read_file (& reader , 1 );
937
964
if (reader .u .ds .root )
938
965
{
0 commit comments