diff options
Diffstat (limited to 'src/processor/simple_symbol_supplier.cc')
-rw-r--r-- | src/processor/simple_symbol_supplier.cc | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/processor/simple_symbol_supplier.cc b/src/processor/simple_symbol_supplier.cc index df77d72c..76820e12 100644 --- a/src/processor/simple_symbol_supplier.cc +++ b/src/processor/simple_symbol_supplier.cc @@ -107,13 +107,34 @@ SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetCStringSymbolData( if (s == FOUND) { unsigned int size = symbol_data_string.size() + 1; - *symbol_data = reinterpret_cast<char*>(operator new(size)); + *symbol_data = new char[size]; + if (*symbol_data == NULL) { + BPLOG(ERROR) << "Memory allocation for size " << size << " failed"; + return INTERRUPT; + } memcpy(*symbol_data, symbol_data_string.c_str(), size - 1); (*symbol_data)[size - 1] = '\0'; + memory_buffers_.insert(make_pair(module->code_file(), *symbol_data)); } return s; } +void SimpleSymbolSupplier::FreeSymbolData(const CodeModule *module) { + if (!module) { + BPLOG(INFO) << "Cannot free symbol data buffer for NULL module"; + return; + } + + map<string, char *>::iterator it = memory_buffers_.find(module->code_file()); + if (it == memory_buffers_.end()) { + BPLOG(INFO) << "Cannot find symbol data buffer for module " + << module->code_file(); + return; + } + delete [] it->second; + memory_buffers_.erase(it); +} + SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPathFromRoot( const CodeModule *module, const SystemInfo *system_info, const string &root_path, string *symbol_file) { |