[Sanitizer] Remove some calls to libc malloc from symbolizer
llvm-svn: 162987
This commit is contained in:
parent
6bab9113b0
commit
e70ed73d1f
|
@ -182,6 +182,8 @@ class ExternalSymbolizer {
|
|||
uptr times_restarted_;
|
||||
};
|
||||
|
||||
static LowLevelAllocator symbolizer_allocator; // Linker initialized.
|
||||
|
||||
class Symbolizer {
|
||||
public:
|
||||
uptr SymbolizeCode(uptr addr, AddressInfo *frames, uptr max_frames) {
|
||||
|
@ -206,7 +208,6 @@ class Symbolizer {
|
|||
if (!external_symbolizer_->Restart()) {
|
||||
ReportExternalSymbolizerError(
|
||||
"WARNING: Failed to use and restart external symbolizer!\n");
|
||||
InternalFree(external_symbolizer_);
|
||||
external_symbolizer_ = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -220,7 +221,7 @@ class Symbolizer {
|
|||
int input_fd, output_fd;
|
||||
if (!StartSymbolizerSubprocess(path_to_symbolizer, &input_fd, &output_fd))
|
||||
return false;
|
||||
void *mem = InternalAlloc(sizeof(ExternalSymbolizer));
|
||||
void *mem = symbolizer_allocator.Allocate(sizeof(ExternalSymbolizer));
|
||||
external_symbolizer_ = new(mem) ExternalSymbolizer(path_to_symbolizer,
|
||||
input_fd, output_fd);
|
||||
return true;
|
||||
|
@ -229,8 +230,8 @@ class Symbolizer {
|
|||
private:
|
||||
LoadedModule *FindModuleForAddress(uptr address) {
|
||||
if (modules_ == 0) {
|
||||
modules_ = (LoadedModule*)InternalAlloc(
|
||||
kMaxNumberOfModuleContexts * sizeof(LoadedModule));
|
||||
modules_ = (LoadedModule*)(symbolizer_allocator.Allocate(
|
||||
kMaxNumberOfModuleContexts * sizeof(LoadedModule)));
|
||||
CHECK(modules_);
|
||||
n_modules_ = GetListOfModules(modules_, kMaxNumberOfModuleContexts);
|
||||
CHECK_GT(n_modules_, 0);
|
||||
|
@ -254,11 +255,10 @@ class Symbolizer {
|
|||
}
|
||||
|
||||
static const uptr kMaxNumberOfModuleContexts = 4096;
|
||||
// Array of module descriptions is leaked.
|
||||
LoadedModule *modules_;
|
||||
LoadedModule *modules_; // Array of module descriptions is leaked.
|
||||
uptr n_modules_;
|
||||
|
||||
ExternalSymbolizer *external_symbolizer_;
|
||||
ExternalSymbolizer *external_symbolizer_; // Leaked.
|
||||
};
|
||||
|
||||
static Symbolizer symbolizer; // Linker initialized.
|
||||
|
|
|
@ -121,19 +121,19 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {
|
|||
DlIteratePhdrData *data = (DlIteratePhdrData*)arg;
|
||||
if (data->current_n == data->max_n)
|
||||
return 0;
|
||||
char *module_name = 0;
|
||||
InternalScopedBuffer<char> module_name(kMaxPathLength);
|
||||
module_name[0] = '\0';
|
||||
if (data->current_n == 0) {
|
||||
// First module is the binary itself.
|
||||
module_name = (char*)InternalAlloc(kMaxPathLength);
|
||||
uptr module_name_len = readlink("/proc/self/exe",
|
||||
module_name, kMaxPathLength);
|
||||
module_name, module_name.size());
|
||||
CHECK_NE(module_name_len, (uptr)-1);
|
||||
CHECK_LT(module_name_len, kMaxPathLength);
|
||||
CHECK_LT(module_name_len, module_name.size());
|
||||
module_name[module_name_len] = '\0';
|
||||
} else if (info->dlpi_name) {
|
||||
module_name = internal_strdup(info->dlpi_name);
|
||||
internal_strncpy(module_name, info->dlpi_name, module_name.size());
|
||||
}
|
||||
if (module_name == 0 || module_name[0] == '\0')
|
||||
if (module_name[0] == '\0')
|
||||
return 0;
|
||||
void *mem = &data->modules[data->current_n];
|
||||
LoadedModule *cur_module = new(mem) LoadedModule(module_name,
|
||||
|
@ -147,7 +147,6 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {
|
|||
cur_module->addAddressRange(cur_beg, cur_end);
|
||||
}
|
||||
}
|
||||
InternalFree(module_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue