The code instrumented with ASan may have its own instance of the
mach_override library. In this case chances are that functions from it will be called from mach_override_ptr() during ASan initialization. This may lead to crashes (if those functions are instrumented) or incorrect behavior (if the implementations differ). The attached patch renames mach_override_ptr() into __asan_mach_override_ptr() and makes the rest of the mach_override internals hidden. The corresponding AddressSanitizer bug is http://code.google.com/p/address-sanitizer/issues/detail?id=22 Patch by glider@google.com llvm-svn: 147303
This commit is contained in:
		
							parent
							
								
									46c70d33d7
								
							
						
					
					
						commit
						8b981c2564
					
				| 
						 | 
				
			
			@ -39,15 +39,15 @@
 | 
			
		|||
#define WRAPPER_NAME(x) "wrap_"#x
 | 
			
		||||
 | 
			
		||||
#define OVERRIDE_FUNCTION(oldfunc, newfunc)                             \
 | 
			
		||||
  CHECK(0 == mach_override_ptr((void*)(oldfunc),                        \
 | 
			
		||||
                               (void*)(newfunc),                        \
 | 
			
		||||
                               (void**)&real_##oldfunc));               \
 | 
			
		||||
  CHECK(0 == __asan_mach_override_ptr((void*)(oldfunc),                        \
 | 
			
		||||
                                      (void*)(newfunc),                        \
 | 
			
		||||
                                      (void**)&real_##oldfunc));               \
 | 
			
		||||
  CHECK(real_##oldfunc != NULL);
 | 
			
		||||
 | 
			
		||||
#define OVERRIDE_FUNCTION_IF_EXISTS(oldfunc, newfunc)                   \
 | 
			
		||||
  do { mach_override_ptr((void*)(oldfunc),                              \
 | 
			
		||||
                         (void*)(newfunc),                              \
 | 
			
		||||
                         (void**)&real_##oldfunc); } while (0)
 | 
			
		||||
  do { __asan_mach_override_ptr((void*)(oldfunc),                              \
 | 
			
		||||
                                (void*)(newfunc),                              \
 | 
			
		||||
                                (void**)&real_##oldfunc); } while (0)
 | 
			
		||||
 | 
			
		||||
#define INTERCEPT_FUNCTION(func)                                        \
 | 
			
		||||
  OVERRIDE_FUNCTION(func, WRAP(func))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,4 +4,6 @@
 | 
			
		|||
-- The files are guarded with #ifdef __APPLE__
 | 
			
		||||
-- some opcodes are added in order to parse the library functions on Lion
 | 
			
		||||
-- fixupInstructions() is extended to relocate relative calls, not only jumps
 | 
			
		||||
-- mach_override_ptr is renamed to __asan_mach_override_ptr and
 | 
			
		||||
 other functions are marked as hidden.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,18 +108,18 @@ typedef	struct	{
 | 
			
		|||
allocateBranchIsland(
 | 
			
		||||
		BranchIsland	**island,
 | 
			
		||||
		int				allocateHigh,
 | 
			
		||||
		void *originalFunctionAddress);
 | 
			
		||||
		void *originalFunctionAddress) __attribute__((visibility("hidden")));
 | 
			
		||||
 | 
			
		||||
	mach_error_t
 | 
			
		||||
freeBranchIsland(
 | 
			
		||||
		BranchIsland	*island );
 | 
			
		||||
		BranchIsland	*island ) __attribute__((visibility("hidden")));
 | 
			
		||||
 | 
			
		||||
#if defined(__ppc__) || defined(__POWERPC__)
 | 
			
		||||
	mach_error_t
 | 
			
		||||
setBranchIslandTarget(
 | 
			
		||||
		BranchIsland	*island,
 | 
			
		||||
		const void		*branchTo,
 | 
			
		||||
		long			instruction );
 | 
			
		||||
		long			instruction ) __attribute__((visibility("hidden")));
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
#if defined(__i386__) || defined(__x86_64__)
 | 
			
		||||
| 
						 | 
				
			
			@ -127,11 +127,11 @@ mach_error_t
 | 
			
		|||
setBranchIslandTarget_i386(
 | 
			
		||||
						   BranchIsland	*island,
 | 
			
		||||
						   const void		*branchTo,
 | 
			
		||||
						   char*			instructions );
 | 
			
		||||
						   char*			instructions ) __attribute__((visibility("hidden")));
 | 
			
		||||
void 
 | 
			
		||||
atomic_mov64(
 | 
			
		||||
		uint64_t *targetAddress,
 | 
			
		||||
		uint64_t value );
 | 
			
		||||
		uint64_t value ) __attribute__((visibility("hidden")));
 | 
			
		||||
 | 
			
		||||
	static Boolean 
 | 
			
		||||
eatKnownInstructions( 
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +140,7 @@ eatKnownInstructions(
 | 
			
		|||
	int				*howManyEaten, 
 | 
			
		||||
	char			*originalInstructions,
 | 
			
		||||
	int				*originalInstructionCount, 
 | 
			
		||||
	uint8_t			*originalInstructionSizes );
 | 
			
		||||
	uint8_t			*originalInstructionSizes ) __attribute__((visibility("hidden")));
 | 
			
		||||
 | 
			
		||||
	static void
 | 
			
		||||
fixupInstructions(
 | 
			
		||||
| 
						 | 
				
			
			@ -148,7 +148,7 @@ fixupInstructions(
 | 
			
		|||
    void		*escapeIsland,
 | 
			
		||||
    void		*instructionsToFix,
 | 
			
		||||
	int			instructionCount,
 | 
			
		||||
	uint8_t		*instructionSizes );
 | 
			
		||||
	uint8_t		*instructionSizes ) __attribute__((visibility("hidden")));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +176,7 @@ mach_error_t makeIslandExecutable(void *address) {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
    mach_error_t
 | 
			
		||||
mach_override_ptr(
 | 
			
		||||
__asan_mach_override_ptr(
 | 
			
		||||
	void *originalFunctionAddress,
 | 
			
		||||
    const void *overrideFunctionAddress,
 | 
			
		||||
    void **originalFunctionReentryIsland )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,8 +77,10 @@
 | 
			
		|||
 | 
			
		||||
	************************************************************************************/
 | 
			
		||||
 | 
			
		||||
// We're prefixing mach_override_ptr() with "__asan_" to avoid name conflicts with other
 | 
			
		||||
// mach_override_ptr() implementations that may appear in the client program.
 | 
			
		||||
    mach_error_t
 | 
			
		||||
mach_override_ptr(
 | 
			
		||||
__asan_mach_override_ptr(
 | 
			
		||||
	void *originalFunctionAddress,
 | 
			
		||||
    const void *overrideFunctionAddress,
 | 
			
		||||
    void **originalFunctionReentryIsland );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue