mach_error_t mach_override( char *originalFunctionSymbolName, const char *originalFunctionLibraryNameHint, const void *overrideFunctionAddress, void **originalFunctionReentryIsland ) { assert( originalFunctionSymbolName ); assert( strlen( originalFunctionSymbolName ) ); assert( overrideFunctionAddress ); // Lookup the original function's code pointer. long *originalFunctionPtr; if( originalFunctionLibraryNameHint ) _dyld_lookup_and_bind_with_hint( originalFunctionSymbolName, originalFunctionLibraryNameHint, (void*) &originalFunctionPtr, NULL ); else _dyld_lookup_and_bind( originalFunctionSymbolName, (void*) &originalFunctionPtr, NULL ); //printf ("In mach_override\n"); return mach_override_ptr( originalFunctionPtr, overrideFunctionAddress, originalFunctionReentryIsland ); }
void PoisonWrite() { // Quick sanity check that we don't poison twice. static bool WritesArePoisoned = false; MOZ_ASSERT(!WritesArePoisoned); if (WritesArePoisoned) return; WritesArePoisoned = true; if (PoisoningDisabled) return; nsCOMPtr<nsIFile> mozFile; NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(mozFile)); if (mozFile) { nsAutoCString nativePath; nsresult rv = mozFile->GetNativePath(nativePath); if (NS_SUCCEEDED(rv)) { sProfileDirectory = PL_strdup(nativePath.get()); } } OldCleanup = __cleanup; __cleanup = FinalCleanup; for (int i = 0; i < NumFunctions; ++i) { FuncData *d = Functions[i]; if (!d->Function) d->Function = dlsym(RTLD_DEFAULT, d->Name); if (!d->Function) continue; mach_error_t t = mach_override_ptr(d->Function, d->Wrapper, &d->Buffer); MOZ_ASSERT(t == err_none); } }
bool IntelGLMallocWorkaround::Enable() { if ( m_pfnMallocReentry != NULL ) { return true; } mach_error_t error = mach_override_ptr( (void*)&malloc, (const void*)&ZeroingAlloc, (void**)&m_pfnMallocReentry ); if ( error == err_cannot_override ) { m_pfnMallocReentry = NULL; return false; } return true; }
void PoisonWrite() { // Quick sanity check that we don't poison twice. static bool WritesArePoisoned = false; MOZ_ASSERT(!WritesArePoisoned); if (WritesArePoisoned) return; WritesArePoisoned = true; if (!PoisonWriteEnabled()) return; for (int i = 0; i < NumFunctions; ++i) { FuncData *d = Functions[i]; if (!d->Function) d->Function = dlsym(RTLD_DEFAULT, d->Name); if (!d->Function) continue; DebugOnly<mach_error_t> t = mach_override_ptr(d->Function, d->Wrapper, &d->Buffer); MOZ_ASSERT(t == err_none); } }
void InitPoisonIOInterposer() { // Enable reporting from poisoned write methods sIsEnabled = true; // Make sure we only poison writes once! static bool WritesArePoisoned = false; if (WritesArePoisoned) { return; } WritesArePoisoned = true; // stdout and stderr are OK. MozillaRegisterDebugFD(1); MozillaRegisterDebugFD(2); #ifdef MOZ_REPLACE_MALLOC // The contract with InitDebugFd is that the given registry can be used // at any moment, so the instance needs to persist longer than the scope // of this functions. static DebugFdRegistry registry; ReplaceMalloc::InitDebugFd(registry); #endif for (int i = 0; i < NumFunctions; ++i) { FuncData* d = Functions[i]; if (!d->Function) { d->Function = dlsym(RTLD_DEFAULT, d->Name); } if (!d->Function) { continue; } DebugOnly<mach_error_t> t = mach_override_ptr(d->Function, d->Wrapper, &d->Buffer); MOZ_ASSERT(t == err_none); } }