]> git.saurik.com Git - apple/security.git/blobdiff - sec/Security/Regressions/secitem/si-11-update-data.c
Security-55471.tar.gz
[apple/security.git] / sec / Security / Regressions / secitem / si-11-update-data.c
diff --git a/sec/Security/Regressions/secitem/si-11-update-data.c b/sec/Security/Regressions/secitem/si-11-update-data.c
new file mode 100644 (file)
index 0000000..840a3f6
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2006-2010 Apple Inc. All Rights Reserved.
+ */
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/SecItem.h>
+#include <Security/SecItemPriv.h>
+#include <Security/SecBase.h>
+#include <utilities/array_size.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "Security_regressions.h"
+
+/* Test basic add delete update copy matching stuff. */
+static void tests(void)
+{
+    const char *v_data = "test";
+    CFDataRef pwdata = CFDataCreate(NULL, (UInt8 *)v_data, strlen(v_data));
+    const void *keys[] = {
+               kSecClass,
+               kSecAttrAccount,
+               kSecAttrService,
+               kSecValueData
+    };
+    const void *values[] = {
+               kSecClassGenericPassword,
+               CFSTR("dankeen"),
+               CFSTR("iTools"),
+               pwdata
+    };
+    CFDictionaryRef item = CFDictionaryCreate(NULL, keys, values,
+       array_size(keys), NULL, NULL);
+    ok_status(SecItemAdd(item, NULL), "add generic password");
+
+    CFTypeRef results = NULL;
+    /* Create a dict with all attrs except the data. */
+    CFDictionaryRef query = CFDictionaryCreate(NULL, keys, values,
+       (array_size(keys)) - 1, NULL, NULL);
+    ok_status(SecItemCopyMatching(query, &results), "find generic password");
+    if (results) {
+        CFRelease(results);
+        results = NULL;
+    }
+
+    /* Modify the data of the item. */
+    const char *v_data2 = "different password data this time";
+    CFDataRef pwdata2 = CFDataCreate(NULL, (UInt8 *)v_data2, strlen(v_data2));
+    CFMutableDictionaryRef changes = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
+    CFDictionarySetValue(changes, kSecValueData, pwdata2);
+    ok_status(SecItemUpdate(query, changes), "update generic password");
+
+    CFDictionarySetValue(changes, kSecValueData, NULL);
+    is_status(SecItemUpdate(query, changes), errSecParam, "update NULL data");
+
+    /* This seems to be what we were seeing in
+       <rdar://problem/6940041> 466 Crashes in securityd: kc_encrypt_data (SecItemServer.c:971).
+       which is now fixed. */
+    CFDictionarySetValue(changes, kSecValueData, CFSTR("bogus"));
+    is_status(SecItemUpdate(query, changes), errSecParam, "update string data");
+
+    ok_status(SecItemDelete(query), "delete generic password");
+
+    if (changes) {
+        CFRelease(changes);
+        changes = NULL;
+    }
+
+    if (item) {
+        CFRelease(item);
+        item = NULL;
+    }
+
+    if (query) {
+        CFRelease(query);
+        query = NULL;
+    }
+
+    if (pwdata) {
+        CFRelease(pwdata);
+        pwdata = NULL;
+    }
+
+    if (pwdata2) {
+        CFRelease(pwdata2);
+        pwdata = NULL;
+    }
+}
+
+int si_11_update_data(int argc, char *const *argv)
+{
+       plan_tests(6);
+
+       tests();
+
+       return 0;
+}