1/* 2 * Copyright (c) 2005-2009 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23#include <stdio.h> 24#include <stdbool.h> 25#include <stdlib.h> 26#include <mach-o/dyld.h> 27#include <sys/types.h> 28#include <sys/stat.h> 29#include <sys/mman.h> 30#include <unistd.h> 31#include <fcntl.h> 32#include <Availability.h> 33 34#include "test.h" // PASS(), FAIL() 35 36extern void bar(); 37 38 39// NSCreateObjectFileImageFromMemory is only available on Mac OS X - not iPhone OS 40#if __MAC_OS_X_VERSION_MIN_REQUIRED 41 42void loadAsBundleFromMemory(const char* path) 43{ 44 int fd = open(path, O_RDONLY, 0); 45 if ( fd == -1 ) { 46 FAIL("bundle-v-dylib: open() failed"); 47 exit(0); 48 } 49 50 struct stat stat_buf; 51 if ( fstat(fd, &stat_buf) == -1) { 52 FAIL("bundle-v-dylib: fstat() failed"); 53 exit(0); 54 } 55 56 void* loadAddress = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0); 57 if ( loadAddress == ((void*)(-1)) ) { 58 FAIL("bundle-v-dylib: mmap() failed"); 59 exit(0); 60 } 61 62 close(fd); 63 64 NSObjectFileImage ofi; 65 if ( NSCreateObjectFileImageFromMemory(loadAddress, stat_buf.st_size, &ofi) == NSObjectFileImageSuccess ) { 66 FAIL("bundle-v-dylib: NSCreateObjectFileImageFromMemory() incorrectly allowed %s to be loaded", path); 67 exit(0); 68 } 69} 70 71void loadAsBundle(const char* path) 72{ 73 NSObjectFileImage ofi; 74 if ( NSCreateObjectFileImageFromFile(path, &ofi) == NSObjectFileImageSuccess ) { 75 FAIL("bundle-v-dylib: NSCreateObjectFileImageFromFile() incorrectly allowed %s to be loaded", path); 76 exit(0); 77 } 78} 79 80void loadAsDylib(const char* path) 81{ 82 if ( NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR) != NULL ) { 83 FAIL("bundle-v-dylib: NSAddImage() incorrectly allowed %s to be loaded", path); 84 exit(0); 85 } 86} 87 88#endif 89 90int main() 91{ 92#if __MAC_OS_X_VERSION_MIN_REQUIRED 93 int dummy; 94 95 // verify that NSAddImage fails to load MH_BUNDLE 96 loadAsDylib("foo.bundle"); 97 98 // verify that NSCreateObjectFileImageFromFile fails to load MH_DYLIB 99 loadAsBundle("foo.dylib"); 100 101 // verify that NSCreateObjectFileImageFromFile fails to load MH_DYLIB already linked against main 102 loadAsBundle("bar.dylib"); 103 104 // verify that bar.dylib was not unloaded when above failed 105 bar(); 106 107 // try loading a dylib from memory using bundle API's 108 loadAsBundleFromMemory("foo2.dylib"); 109 110 // verify that dyld data structures are not wanked by scanning all images 111 _dyld_get_image_header_containing_address(&dummy); 112#endif 113 PASS("bundle-v-dylib"); 114 return 0; 115}