Skip to content

Commit 97c3c41

Browse files
EPouechjulliard
authored andcommitted
winedump: Better detect whether IPI stream is present.
Old version of PDB files can have a stream wine-mirror#4 which is not an IPI stream Available documentation isn't 100% clear about when IPI has been introduced. So decide that IPI is present when header of stream looks like a type stream header. Signed-off-by: Eric Pouech <eric.pouech@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
1 parent 0c3274b commit 97c3c41

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

tools/winedump/pdb.c

+32-5
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,21 @@ struct pdb_reader
5454
DWORD file_used[1024];
5555
};
5656

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+
5772
static void* pdb_jg_read(const struct PDB_JG_HEADER* pdb, const WORD* block_list, int size)
5873
{
5974
int i, nBlocks;
@@ -78,7 +93,7 @@ static void* pdb_jg_read_file(struct pdb_reader* reader, DWORD file_nr)
7893

7994
if (!reader->u.jg.toc || file_nr >= reader->u.jg.toc->num_files) return NULL;
8095

81-
reader->file_used[file_nr / 32] |= 1 << (file_nr % 32);
96+
mark_file_been_read(reader, file_nr);
8297
if (reader->u.jg.toc->file[file_nr].size == 0 ||
8398
reader->u.jg.toc->file[file_nr].size == 0xFFFFFFFF)
8499
return NULL;
@@ -125,7 +140,7 @@ static void pdb_exit(struct pdb_reader* reader)
125140

126141
for (i = 0; i < pdb_get_num_files(reader); i++)
127142
{
128-
if (reader->file_used[i / 32] & (1 << (i % 32))) continue;
143+
if (has_file_been_read(reader, i)) continue;
129144

130145
file = reader->read_file(reader, i);
131146
if (!file) continue;
@@ -615,7 +630,14 @@ static void pdb_dump_types_hash(struct pdb_reader* reader, unsigned file, const
615630
static void pdb_dump_types(struct pdb_reader* reader, unsigned strmidx, const char* strmname)
616631
{
617632
PDB_TYPES* types = NULL;
633+
BOOL used = has_file_been_read(reader, strmidx);
618634

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+
}
619641
types = reader->read_file(reader, strmidx);
620642
if (!types) return;
621643

@@ -628,7 +650,12 @@ static void pdb_dump_types(struct pdb_reader* reader, unsigned strmidx, const ch
628650
case 20040203: /* VC 8.0 */
629651
break;
630652
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;
632659
}
633660

634661
/* Read type table */
@@ -870,7 +897,7 @@ static void* pdb_ds_read_file(struct pdb_reader* reader, DWORD file_number)
870897

871898
if (!reader->u.ds.toc || file_number >= reader->u.ds.toc->num_files) return NULL;
872899

873-
reader->file_used[file_number / 32] |= 1 << (file_number % 32);
900+
mark_file_been_read(reader, file_number);
874901
if (reader->u.ds.toc->file_size[file_number] == 0 ||
875902
reader->u.ds.toc->file_size[file_number] == 0xFFFFFFFF)
876903
return NULL;
@@ -932,7 +959,7 @@ static void pdb_ds_dump(void)
932959
* - segments
933960
* - extended FPO data
934961
*/
935-
reader.file_used[0] |= 1; /* mark stream #0 as read */
962+
mark_file_been_read(&reader, 0); /* mark stream #0 as read */
936963
reader.u.ds.root = reader.read_file(&reader, 1);
937964
if (reader.u.ds.root)
938965
{

0 commit comments

Comments
 (0)