AddressSanitizer can't symbolize parts of the stack that contains dlclose()d modules. This makes some LSan suppressions not kick in and blocks launching the LSan bot for WebRTC. This "fix" excludes dlclose() in webrtc/modules/audio_device/linux/latebindingsymboltable_linux.cc which resolves this on the bot. R=xians@webrtc.org BUG=3402,chromium:375154 Review URL: https://webrtc-codereview.appspot.com/25499004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7157 4adac7df-926f-26a2-2b94-8c16560cd09d
126 lines
4.1 KiB
C++
126 lines
4.1 KiB
C++
/*
|
|
* libjingle
|
|
* Copyright 2004--2010, Google Inc.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include "webrtc/modules/audio_device/linux/latebindingsymboltable_linux.h"
|
|
|
|
#ifdef WEBRTC_LINUX
|
|
#include <dlfcn.h>
|
|
#endif
|
|
|
|
// TODO(grunell): Either put inside webrtc namespace or use webrtc:: instead.
|
|
using namespace webrtc;
|
|
|
|
namespace webrtc_adm_linux {
|
|
|
|
inline static const char *GetDllError() {
|
|
#ifdef WEBRTC_LINUX
|
|
char *err = dlerror();
|
|
if (err) {
|
|
return err;
|
|
} else {
|
|
return "No error";
|
|
}
|
|
#else
|
|
#error Not implemented
|
|
#endif
|
|
}
|
|
|
|
DllHandle InternalLoadDll(const char dll_name[]) {
|
|
#ifdef WEBRTC_LINUX
|
|
DllHandle handle = dlopen(dll_name, RTLD_NOW);
|
|
#else
|
|
#error Not implemented
|
|
#endif
|
|
if (handle == kInvalidDllHandle) {
|
|
WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, -1,
|
|
"Can't load %s : %s", dll_name, GetDllError());
|
|
}
|
|
return handle;
|
|
}
|
|
|
|
void InternalUnloadDll(DllHandle handle) {
|
|
#ifdef WEBRTC_LINUX
|
|
// TODO(pbos): Remove this dlclose() exclusion when leaks and suppressions from
|
|
// here are gone (or AddressSanitizer can display them properly).
|
|
//
|
|
// Skip dlclose() on AddressSanitizer as leaks including this module in the
|
|
// stack trace gets displayed as <unknown module> instead of the actual library
|
|
// -> it can not be suppressed.
|
|
// https://code.google.com/p/address-sanitizer/issues/detail?id=89
|
|
#if !defined(ADDRESS_SANITIZER)
|
|
if (dlclose(handle) != 0) {
|
|
WEBRTC_TRACE(kTraceError, kTraceAudioDevice, -1,
|
|
"%s", GetDllError());
|
|
}
|
|
#endif // !defined(ADDRESS_SANITIZER)
|
|
#else
|
|
#error Not implemented
|
|
#endif
|
|
}
|
|
|
|
static bool LoadSymbol(DllHandle handle,
|
|
const char *symbol_name,
|
|
void **symbol) {
|
|
#ifdef WEBRTC_LINUX
|
|
*symbol = dlsym(handle, symbol_name);
|
|
char *err = dlerror();
|
|
if (err) {
|
|
WEBRTC_TRACE(kTraceError, kTraceAudioDevice, -1,
|
|
"Error loading symbol %s : %d", symbol_name, err);
|
|
return false;
|
|
} else if (!*symbol) {
|
|
WEBRTC_TRACE(kTraceError, kTraceAudioDevice, -1,
|
|
"Symbol %s is NULL", symbol_name);
|
|
return false;
|
|
}
|
|
return true;
|
|
#else
|
|
#error Not implemented
|
|
#endif
|
|
}
|
|
|
|
// This routine MUST assign SOME value for every symbol, even if that value is
|
|
// NULL, or else some symbols may be left with uninitialized data that the
|
|
// caller may later interpret as a valid address.
|
|
bool InternalLoadSymbols(DllHandle handle,
|
|
int num_symbols,
|
|
const char *const symbol_names[],
|
|
void *symbols[]) {
|
|
#ifdef WEBRTC_LINUX
|
|
// Clear any old errors.
|
|
dlerror();
|
|
#endif
|
|
for (int i = 0; i < num_symbols; ++i) {
|
|
if (!LoadSymbol(handle, symbol_names[i], &symbols[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace webrtc_adm_linux
|