PRBool nsPluginsDir::IsPluginFile(nsIFile* file) { nsCString temp; file->GetNativeLeafName(temp); /* * Don't load the VDP fake plugin, to avoid tripping a bad bug in OS X * 10.5.3 (see bug 436575). */ if (!strcmp(temp.get(), "VerifiedDownloadPlugin.plugin")) { NS_WARNING("Preventing load of VerifiedDownloadPlugin.plugin (see bug 436575)"); return PR_FALSE; } // If we're running on OS X Lion (10.7) or later, don't load the Java Embedding // Plugin (any version). If/when Steven Michaud releases a version of the JEP that // works on Lion, we'll need to revise this code. See bug 670655. if (OnLionOrLater() && !strcmp(temp.get(), "MRJPlugin.plugin")) { NS_WARNING("Preventing load of Java Embedding Plugin (MRJPlugin.plugin) on OS X Lion (see bug 670655)"); return PR_FALSE; } CFURLRef pluginURL = NULL; if (NS_FAILED(toCFURLRef(file, pluginURL))) return PR_FALSE; PRBool isPluginFile = PR_FALSE; CFBundleRef pluginBundle = CFBundleCreate(kCFAllocatorDefault, pluginURL); if (pluginBundle) { UInt32 packageType, packageCreator; CFBundleGetPackageInfo(pluginBundle, &packageType, &packageCreator); if (packageType == 'BRPL' || packageType == 'IEPL' || packageType == 'NSPL') { CFURLRef executableURL = CFBundleCopyExecutableURL(pluginBundle); if (executableURL) { isPluginFile = IsLoadablePlugin(executableURL); ::CFRelease(executableURL); } } ::CFRelease(pluginBundle); } else { LSItemInfoRecord info; if (LSCopyItemInfoForURL(pluginURL, kLSRequestTypeCreator, &info) == noErr) { if ((info.filetype == 'shlb' && info.creator == 'MOSS') || info.filetype == 'NSPL' || info.filetype == 'BRPL' || info.filetype == 'IEPL') { isPluginFile = IsLoadablePlugin(pluginURL); } } } ::CFRelease(pluginURL); return isPluginFile; }
PRBool nsPluginsDir::IsPluginFile(nsIFile* file) { CFURLRef pluginURL = NULL; if (NS_FAILED(toCFURLRef(file, pluginURL))) return PR_FALSE; PRBool isPluginFile = PR_FALSE; CFBundleRef pluginBundle = CFBundleCreate(kCFAllocatorDefault, pluginURL); if (pluginBundle) { UInt32 packageType, packageCreator; CFBundleGetPackageInfo(pluginBundle, &packageType, &packageCreator); if (packageType == 'BRPL' || packageType == 'IEPL' || packageType == 'NSPL') { CFURLRef executableURL = CFBundleCopyExecutableURL(pluginBundle); if (executableURL) { isPluginFile = IsLoadablePlugin(executableURL); CFRelease(executableURL); } } // some safari plugins that we can't use don't have resource forks short refNum; if (isPluginFile) { refNum = OpenPluginResourceFork(file); if (refNum < 0) { isPluginFile = PR_FALSE; } else { ::CloseResFile(refNum); } } CFRelease(pluginBundle); } else { LSItemInfoRecord info; if (LSCopyItemInfoForURL(pluginURL, kLSRequestTypeCreator, &info) == noErr) { if ((info.filetype == 'shlb' && info.creator == 'MOSS') || info.filetype == 'NSPL' || info.filetype == 'BRPL' || info.filetype == 'IEPL') { isPluginFile = IsLoadablePlugin(pluginURL); } } } CFRelease(pluginURL); return isPluginFile; }
static bool IsCompatibleArch(nsIFile *file) { CFURLRef pluginURL = NULL; if (NS_FAILED(toCFURLRef(file, pluginURL))) return false; bool isPluginFile = false; CFBundleRef pluginBundle = ::CFBundleCreate(kCFAllocatorDefault, pluginURL); if (pluginBundle) { UInt32 packageType, packageCreator; ::CFBundleGetPackageInfo(pluginBundle, &packageType, &packageCreator); if (packageType == 'BRPL' || packageType == 'IEPL' || packageType == 'NSPL') { // Get path to plugin as a C string. char executablePath[PATH_MAX]; executablePath[0] = '\0'; if (!::CFURLGetFileSystemRepresentation(pluginURL, true, (UInt8*)&executablePath, PATH_MAX)) { executablePath[0] = '\0'; } uint32_t pluginLibArchitectures; nsresult rv = mozilla::ipc::GeckoChildProcessHost::GetArchitecturesForBinary(executablePath, &pluginLibArchitectures); if (NS_FAILED(rv)) { return false; } uint32_t supportedArchitectures = #ifdef __LP64__ mozilla::ipc::GeckoChildProcessHost::GetSupportedArchitecturesForProcessType(GeckoProcessType_Plugin); #else base::GetCurrentProcessArchitecture(); #endif // Consider the plugin architecture valid if there is any overlap in the masks. isPluginFile = !!(supportedArchitectures & pluginLibArchitectures); } ::CFRelease(pluginBundle); } ::CFRelease(pluginURL); return isPluginFile; }