From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/dbghelp/pdb.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index 2ff1ca119cb..b2daa6bab0f 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -108,7 +108,8 @@ struct pdb_compiland { pdbsize_t stream_offset; /* in DBI stream for compiland description */ unsigned short are_symbols_loaded; - unsigned short stream_id; /* for all symbols of given compiland */ + unsigned short compiland_stream_id; + pdbsize_t compiland_symbols_size; struct symt_compiland* compiland; };
@@ -1902,8 +1903,9 @@ static enum pdb_result pdb_reader_init_DBI(struct pdb_reader *pdb) { pdb->compilands[i].stream_offset = compiland_iter.dbi_walker.offset; pdb->compilands[i].compiland = NULL; - pdb->compilands[i].stream_id = compiland_iter.dbi_cu_header.stream; - pdb->compilands[i].are_symbols_loaded = pdb->compilands[i].stream_id == 0xffff; + pdb->compilands[i].compiland_stream_id = compiland_iter.dbi_cu_header.stream; + pdb->compilands[i].compiland_symbols_size = compiland_iter.dbi_cu_header.symbol_size; + pdb->compilands[i].are_symbols_loaded = pdb->compilands[i].compiland_stream_id == 0xffff; result = pdb_reader_compiland_iterator_next(pdb, &compiland_iter); if ((result == R_PDB_SUCCESS) != (i + 1 < pdb->num_compilands)) return result ? result : R_PDB_INVALID_PDB_FILE; } @@ -4284,6 +4286,10 @@ static enum pdb_result pdb_reader_load_compiland_symbols(struct pdb_reader *pdb, unsigned top_frame_size = -1; DWORD64 address; symref_t type_symref; + + /* skip first DWORD, always 4 AFAICT */ + walker->offset += sizeof(UINT32); + /* * Loop over the different types of records and whenever we * find something we are interested in, record it and move on. @@ -4633,8 +4639,9 @@ static enum pdb_result pdb_reader_ensure_symbols_loaded_from_compiland(struct pd compiland->compiland = symt_new_compiland(pdb->module, obj_name); pdb_reader_free(pdb, obj_name);
- if ((result = pdb_reader_walker_init(pdb, compiland->stream_id, &walker))) return result; - walker.offset = sizeof(UINT32); + if ((result = pdb_reader_walker_init(pdb, compiland->compiland_stream_id, &walker))) return result; + if ((result = pdb_reader_walker_narrow(&walker, 0, compiland->compiland_symbols_size))) return result; + if ((result = pdb_reader_load_compiland_symbols(pdb, (struct symt_compiland *)compiland->compiland, &walker))) return result; compiland->are_symbols_loaded = TRUE; } @@ -4685,7 +4692,7 @@ static enum pdb_result pdb_reader_dereference_procedure(struct pdb_reader *pdb,
if (!compiland_id || compiland_id > pdb->num_compilands) return R_PDB_INVALID_ARGUMENT; compiland_id--; - stream_id = pdb->compilands[compiland_id].stream_id; + stream_id = pdb->compilands[compiland_id].compiland_stream_id;
if ((result = pdb_reader_walker_init(pdb, stream_id, &walker))) return result; walker.offset = stream_offset;