aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/Analysis/keychainAPI.m73
1 files changed, 67 insertions, 6 deletions
diff --git a/test/Analysis/keychainAPI.m b/test/Analysis/keychainAPI.m
index 4a700e6b26..af0258a59b 100644
--- a/test/Analysis/keychainAPI.m
+++ b/test/Analysis/keychainAPI.m
@@ -10,6 +10,7 @@ typedef unsigned int CFTypeRef;
typedef unsigned int UInt16;
typedef unsigned int SecProtocolType;
typedef unsigned int SecAuthenticationType;
+typedef unsigned int SecKeychainAttributeInfo;
enum {
noErr = 0,
GenericError = 1
@@ -50,12 +51,24 @@ OSStatus SecKeychainFindInternetPassword (
void **passwordData,
SecKeychainItemRef *itemRef
);
+OSStatus SecKeychainItemCopyAttributesAndData (
+ SecKeychainItemRef itemRef,
+ SecKeychainAttributeInfo *info,
+ SecItemClass *itemClass,
+ SecKeychainAttributeList **attrList,
+ UInt32 *length,
+ void **outData
+);
-// Function which frees data.
+// Functions which free data.
OSStatus SecKeychainItemFreeContent (
SecKeychainAttributeList *attrList,
void *data
);
+OSStatus SecKeychainItemFreeAttributesAndData (
+ SecKeychainAttributeList *attrList,
+ void *data
+);
void errRetVal() {
unsigned int *ptr = 0;
@@ -63,8 +76,8 @@ void errRetVal() {
UInt32 length;
void *outData;
st = SecKeychainItemCopyContent(2, ptr, ptr, &length, &outData);
- if (st == GenericError) // expected-warning{{Missing a call to SecKeychainItemFreeContent}}
- SecKeychainItemFreeContent(ptr, outData);
+ if (st == GenericError) // expected-warning{{Allocated data is not released: missing a call to 'SecKeychainItemFreeContent'.}}
+ SecKeychainItemFreeContent(ptr, outData); // expected-warning{{Trying to free data which has not been allocated.}}
}
// If null is passed in, the data is not allocated, so no need for the matching free.
@@ -77,6 +90,15 @@ void fooDoNotReportNull() {
SecKeychainItemCopyContent(2, ptr, ptr, length, outData);
}// no-warning
+void doubleAlloc() {
+ unsigned int *ptr = 0;
+ OSStatus st = 0;
+ UInt32 *length = 0;
+ void **outData = 0;
+ SecKeychainItemCopyContent(2, ptr, ptr, length, outData);
+ SecKeychainItemCopyContent(2, ptr, ptr, length, outData);
+}// no-warning
+
void fooOnlyFree() {
unsigned int *ptr = 0;
OSStatus st = 0;
@@ -95,8 +117,8 @@ void fooOnlyFreeUndef() {
}// no-warning
// Do not warn if the address is a parameter in the enclosing function.
-void fooOnlyFreeParam(void* X) {
- SecKeychainItemFreeContent(X, X);
+void fooOnlyFreeParam(void *attrList, void* X) {
+ SecKeychainItemFreeContent(attrList, X);
}// no-warning
// If we are returning the value, no not report.
@@ -109,7 +131,46 @@ void* returnContent() {
return outData;
} // no-warning
-int foo () {
+int apiMismatch(SecKeychainItemRef itemRef,
+ SecKeychainAttributeInfo *info,
+ SecItemClass *itemClass) {
+ OSStatus st = 0;
+ SecKeychainAttributeList *attrList;
+ UInt32 length;
+ void *outData;
+
+ st = SecKeychainItemCopyAttributesAndData(itemRef, info, itemClass,
+ &attrList, &length, &outData);
+ if (st == noErr)
+ SecKeychainItemFreeContent(attrList, outData); // expected-warning{{Allocator doesn't match the deallocator}}
+ return 0;
+}
+
+int ErrorCodesFromDifferentAPISDoNotInterfere(SecKeychainItemRef itemRef,
+ SecKeychainAttributeInfo *info,
+ SecItemClass *itemClass) {
+ unsigned int *ptr = 0;
+ OSStatus st = 0;
+ UInt32 length;
+ void *outData;
+ OSStatus st2 = 0;
+ SecKeychainAttributeList *attrList;
+ UInt32 length2;
+ void *outData2;
+
+ st2 = SecKeychainItemCopyAttributesAndData(itemRef, info, itemClass,
+ &attrList, &length2, &outData2);
+ st = SecKeychainItemCopyContent(2, ptr, ptr, &length, &outData);
+ if (st == noErr) {
+ SecKeychainItemFreeContent(ptr, outData);
+ if (st2 == noErr) {
+ SecKeychainItemFreeAttributesAndData(attrList, outData2);
+ }
+ }
+ return 0; // expected-warning{{Allocated data is not released: missing a call to 'SecKeychainItemFreeAttributesAndData'}}
+}
+
+int foo() {
unsigned int *ptr = 0;
OSStatus st = 0;