auth: Correctly write empty keyfiles
authorSimon Wilkinson <sxw@your-file-system.com>
Fri, 25 Feb 2011 01:23:38 +0000 (01:23 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 26 Feb 2011 12:00:25 +0000 (04:00 -0800)
The new key handling code was creating empty keyfiles that were 0
bytes in length. The correct format for an empty keyfile is a file
containing a single 0 word (the number of keys in the file). Update
the code to write this form of empty KeyFile.

Change-Id: I93bf23f6044a70a74f52b94c4656cbd4bc4fc35b
Reviewed-on: http://gerrit.openafs.org/4051
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/auth/keys.c
tests/auth/keys-t.c

index aa265f1..0a3723f 100644 (file)
@@ -415,14 +415,17 @@ _writeOriginalKeyFile(struct afsconf_dir *dir, char *fileName)
        return AFSCONF_FAILURE;
 
     typeEntry = findByType(dir, afsconf_rxkad);
-    if (typeEntry == NULL)
-       goto out;
-
-    nkeys = opr_queue_Count(&typeEntry->kvnoList);
+    if (typeEntry)
+       nkeys = opr_queue_Count(&typeEntry->kvnoList);
+    else
+       nkeys = 0;
 
     if (writeWord(fd, nkeys))
        goto fail;
 
+    if (typeEntry == NULL)
+       goto out;
+
     for (opr_queue_Scan(&typeEntry->kvnoList, cursor)) {
        struct kvnoList *kvnoEntry;
         struct subTypeList *subEntry;
index 2e32946..2e3dc6c 100644 (file)
@@ -105,7 +105,7 @@ int main(int argc, char **argv)
     int code;
     int i;
 
-    plan(123);
+    plan(127);
 
     /* Create a temporary afs configuration directory */
 
@@ -527,6 +527,33 @@ int main(int argc, char **argv)
        " ... with the right key in slot 1");
     afsconf_PutTypedKeyList(&typedKeyList);
 
+    afsconf_Close(dir);
+
+    unlinkTestConfig(dirname);
+    free(dirname);
+    free(keyfile);
+
+    /* Start a new test configuration */
+    dirname = buildTestConfig();
+    dir = afsconf_Open(dirname);
+    ok(dir != NULL, "Sucessfully opened brand new config directory");
+    if (dir == NULL)
+       goto out;
+
+    /* Check that directories with just new style keys work */
+    keyMaterial = rx_opaque_new("\x02\x03", 2);
+    typedKey = afsconf_typedKey_new(1, 2, 1, keyMaterial);
+    code = afsconf_AddTypedKey(dir, typedKey, 0);
+    afsconf_typedKey_put(&typedKey);
+    is_int(0, code,
+          "afsconf_AddTypedKey can add keys with different sub type");
+
+    /* Check the GetKeyByTypes returns one of the keys */
+    code = afsconf_GetKeyByTypes(dir, 1, 2, 1, &typedKey);
+    is_int(0, code, "afsconf_GetKeyByTypes returns it");
+    ok(keyMatches(typedKey, 1, 2, 1, "\x02\x03", 2),
+       " ... with the right key");
+
 out:
     unlinkTestConfig(dirname);