aboutsummaryrefslogtreecommitdiff
path: root/src/processor/simple_symbol_supplier.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/processor/simple_symbol_supplier.cc')
-rw-r--r--src/processor/simple_symbol_supplier.cc23
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) {