rizin/librz/bin/pdb/modi.c
NOT XVilka 851ab98455
Fix memory leaks across core, bin, and PDB parsing (#6579)
Co-authored-by: Anton Kochkov <anton.kochkov@gmail.com>
2026-06-30 19:04:28 +08:00

62 lines
1.5 KiB
C

// SPDX-FileCopyrightText: 2023 billow <billow.fun@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#include "modi.h"
static bool PDBModuleInfo_symbols(const PDBModuleInfo *modi, PDBSymbolIter *iter) {
RzBuffer *b = rz_buf_new_slice(modi->stream, 0, modi->symbols_size);
if (!b) {
return false;
}
if (modi->symbols_size > 0) {
ut32 sig = 0;
if (!rz_buf_read_le32(b, &sig)) {
goto err;
}
if (sig != CV_SIGNATURE_C13) {
RZ_LOG_ERROR("Unsupported symbol data format: 0x%" PFMT32x "\n", sig);
goto err;
}
}
iter->b = b;
return true;
err:
rz_buf_free(b);
return false;
}
RZ_IPI bool PDBModuleInfo_parse(const RzPdb *pdb, const PDB_DBIModule *m, PDBModuleInfo *modi) {
if (!(pdb && m && modi)) {
return false;
}
modi->stream_index = m->stream;
modi->symbols_size = m->symbols_size;
if (modi->symbols_size == 0) {
return true;
}
const RzPdbMsfStream *stream = pdb_raw_steam(pdb, modi->stream_index);
if (!stream) {
return false;
}
modi->stream = stream->stream_data;
PDBSymbolIter iter = { 0 };
if (!PDBModuleInfo_symbols(modi, &iter)) {
return false;
}
bool collected = PDBSymbolIter_collect(&iter, &modi->symbols);
rz_buf_free(iter.b);
return collected;
}
RZ_IPI void PDBModuleInfo_free(void *x) {
PDBModuleInfo *modi = (PDBModuleInfo *)x;
if (!modi) {
return;
}
// modi->stream is borrowed from the module's raw MSF stream, so only the
// collected symbols and the module info itself are owned here.
rz_pvector_free(modi->symbols);
free(modi);
}