]> granicus.if.org Git - p11-kit/commitdiff
trust: Support using the parser without an asn1_cache
authorStef Walter <stef@thewalter.net>
Mon, 8 Jul 2013 14:36:50 +0000 (16:36 +0200)
committerStef Walter <stef@thewalter.net>
Mon, 8 Jul 2013 14:43:41 +0000 (16:43 +0200)
trust/asn1.c
trust/parser.c
trust/tests/test-parser.c

index 653d81635b0a7e92841d864b9fd68ad2d722c529..7ed3b0188439c213670ca7debc0582bcd8627470 100644 (file)
@@ -302,7 +302,9 @@ p11_asn1_cache_get (p11_asn1_cache *cache,
 {
        asn1_item *item;
 
-       return_val_if_fail (cache != NULL, NULL);
+       if (cache == NULL)
+               return NULL;
+
        return_val_if_fail (struct_name != NULL, NULL);
        return_val_if_fail (der != NULL, NULL);
 
@@ -325,7 +327,9 @@ p11_asn1_cache_take (p11_asn1_cache *cache,
 {
        asn1_item *item;
 
-       return_if_fail (cache != NULL);
+       if (cache == NULL)
+               return;
+
        return_if_fail (struct_name != NULL);
        return_if_fail (der != NULL);
        return_if_fail (der_len != 0);
@@ -345,7 +349,8 @@ p11_asn1_cache_take (p11_asn1_cache *cache,
 void
 p11_asn1_cache_flush (p11_asn1_cache *cache)
 {
-       return_if_fail (cache != NULL);
+       if (cache == NULL)
+               return;
        p11_dict_clear (cache->items);
 }
 
index 26d911b027ce5628404015856716c987f6173dfd..0d250fc5250aaa8d67a24cf79af33640da17eb85 100644 (file)
@@ -66,6 +66,7 @@
 struct _p11_parser {
        p11_asn1_cache *asn1_cache;
        p11_dict *asn1_defs;
+       bool asn1_owned;
        p11_persist *persist;
        char *basename;
        p11_array *parsed;
@@ -659,10 +660,14 @@ p11_parser_new (p11_asn1_cache *asn1_cache)
 {
        p11_parser parser = { 0, };
 
-       return_val_if_fail (asn1_cache != NULL, NULL);
-
-       parser.asn1_defs = p11_asn1_cache_defs (asn1_cache);
-       parser.asn1_cache = asn1_cache;
+       if (asn1_cache == NULL) {
+               parser.asn1_owned = true;
+               parser.asn1_defs = p11_asn1_defs_load ();
+       } else {
+               parser.asn1_defs = p11_asn1_cache_defs (asn1_cache);
+               parser.asn1_cache = asn1_cache;
+               parser.asn1_owned = false;
+       }
 
        parser.parsed = p11_array_new (p11_attrs_free);
        return_val_if_fail (parser.parsed != NULL, NULL);
@@ -676,6 +681,8 @@ p11_parser_free (p11_parser *parser)
        return_if_fail (parser != NULL);
        p11_persist_free (parser->persist);
        p11_array_free (parser->parsed);
+       if (parser->asn1_owned)
+               p11_dict_free (parser->asn1_defs);
        free (parser);
 }
 
index cc71d1d82b49aef2a3cd2276e1259c29dc399c92..c8cac03869699b2311c80d015566b0921b147d58 100644 (file)
@@ -414,6 +414,24 @@ test_parse_unrecognized (void)
        p11_message_loud ();
 }
 
+static void
+test_parse_no_asn1_cache (void)
+{
+       p11_parser *parser;
+       int ret;
+
+       parser = p11_parser_new (NULL);
+       assert_ptr_not_null (parser);
+
+       ret = p11_parse_file (parser, SRCDIR "/files/cacert3.der", P11_PARSE_FLAG_NONE);
+       assert_num_eq (P11_PARSE_SUCCESS, ret);
+
+       /* Should have gotten certificate  */
+       assert_num_eq (1, p11_parser_parsed (parser)->num);
+
+       p11_parser_free (parser);
+}
+
 int
 main (int argc,
       char *argv[])
@@ -428,5 +446,9 @@ main (int argc,
        p11_test (test_parse_thawte, "/parser/parse_thawte");
        p11_test (test_parse_invalid_file, "/parser/parse_invalid_file");
        p11_test (test_parse_unrecognized, "/parser/parse_unrecognized");
+
+       p11_fixture (NULL, NULL);
+       p11_test (test_parse_no_asn1_cache, "/parser/null-asn1-cache");
+
        return p11_test_run (argc, argv);
 }