+
+
+static bool precheckAccess(CFURLRef path, CFDictionaryRef context)
+{
+ CFTypeRef type = CFDictionaryGetValue(context, kSecAssessmentContextKeyOperation);
+ if (type == NULL || CFEqual(type, kSecAssessmentOperationTypeExecute)) {
+ CFRef<SecStaticCodeRef> code;
+ OSStatus rc = SecStaticCodeCreateWithPath(path, kSecCSDefaultFlags, &code.aref());
+ if (rc == errSecCSBadBundleFormat) // work around <rdar://problem/26075034>
+ return false;
+ CFRef<CFURLRef> exec;
+ MacOSError::check(SecCodeCopyPath(code, kSecCSDefaultFlags, &exec.aref()));
+ UnixError::check(::access(cfString(exec).c_str(), R_OK));
+ } else {
+ UnixError::check(access(cfString(path).c_str(), R_OK));
+ }
+ return true;
+}
+