]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Spread error messages in --mode=print's failure paths
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 10 May 2024 23:44:36 +0000 (17:44 -0600)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 10 May 2024 23:44:36 +0000 (17:44 -0600)
They're probably not very helpful themselves, but the stack traces
might serve as an admittedly inelegant way to infer the xpath to the
problem.

Otherwise, this could only be fixed by switching to a different JSON
library. But that's a problem for another decade.

20 files changed:
src/asn1/asn1c/BOOLEAN.c
src/asn1/asn1c/CMSAttribute.c
src/asn1/asn1c/CRL.c
src/asn1/asn1c/Certificate.c
src/asn1/asn1c/CertificateSet.c
src/asn1/asn1c/ContentInfo.c
src/asn1/asn1c/EncapsulatedContentInfo.c
src/asn1/asn1c/GeneralizedTime.c
src/asn1/asn1c/INTEGER.c
src/asn1/asn1c/OBJECT_IDENTIFIER.c
src/asn1/asn1c/OCTET_STRING.c
src/asn1/asn1c/ROAIPAddressFamily.c
src/asn1/asn1c/UTCTime.c
src/asn1/asn1c/constr_SEQUENCE.c
src/asn1/asn1c/constr_SET_OF.c
src/cache/local_cache.c
src/extension.c
src/json_util.c
src/json_util.h
src/libcrypto_util.c

index ba56217be041c5beb1b0d5c53c5c20d06cd20d49..d646f7b159e92ad81e69e7ef9c5854514e57bada 100644 (file)
@@ -136,11 +136,7 @@ json_t *
 BOOLEAN_encode_json(const struct asn_TYPE_descriptor_s *td, const void *sptr)
 {
        const BOOLEAN_t *st = (const BOOLEAN_t *)sptr;
-
-       if (st == NULL)
-               return json_null();
-
-       return (*st) ? json_true() : json_false();
+       return (st != NULL) ? json_boolean(*st) : json_null();
 }
 
 asn_enc_rval_t
index 91b23f1c912cb1499b6e7a083e82b578a8f34804..3b4b7223a40863d3b1bf74205d2a6890f23b2050 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "asn1/asn1c/CMSAttribute.h"
 
+#include "json_util.h"
 #include "asn1/asn1c/ContentType.h"
 #include "asn1/asn1c/MessageDigest.h"
 #include "asn1/asn1c/SigningTime.h"
@@ -39,14 +40,14 @@ CMSAttribute_encode_json(const asn_TYPE_descriptor_t *td, const void *sptr)
        if (!cattr)
                return json_null();
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
 
        tmp = OBJECT_IDENTIFIER_encode_json(NULL, &cattr->attrType);
-       if (json_object_set_new(root, "attrType", tmp))
+       if (json_object_add(root, "attrType", tmp))
                goto fail;
-       if (json_object_set_new(root, "attrValues", array = json_array()))
+       if (json_object_add(root, "attrValues", array = json_array_new()))
                goto fail;
 
        if (OBJECT_IDENTIFIER_is_ContentType(&cattr->attrType))
@@ -60,7 +61,7 @@ CMSAttribute_encode_json(const asn_TYPE_descriptor_t *td, const void *sptr)
 
        for (a = 0; a < cattr->attrValues.list.count; a++) {
                tmp = attr2json(td, cattr->attrValues.list.array[a]);
-               if (json_array_append_new(array, tmp))
+               if (json_array_add(array, tmp))
                        goto fail;
        }
 
index 6b8afce4bb0f57a24d823be35bd6f8108e4fc2ad..89edd6b398bf182773c07d35d2577dc6640d63b7 100644 (file)
@@ -2,7 +2,9 @@
 
 #include <openssl/x509v3.h>
 #include <openssl/pem.h>
+
 #include "extension.h"
+#include "json_util.h"
 #include "libcrypto_util.h"
 
 static json_t *
@@ -15,24 +17,24 @@ revokedCerts2json(X509_CRL *crl)
        X509_REVOKED *rv;
        int r;
 
-       root = json_array();
+       root = json_array_new();
        if (root == NULL)
                return NULL;
 
        for (r = 0; r < sk_X509_REVOKED_num(revokeds); r++) {
                rv = sk_X509_REVOKED_value(revokeds, r);
 
-               if (json_array_append_new(root, parent = json_object()))
+               if (json_array_add(root, parent = json_obj_new()))
                        goto fail;
 
                child = asn1int2json(X509_REVOKED_get0_serialNumber(rv));
-               if (json_object_set_new(parent, "userCertificate", child))
+               if (json_object_add(parent, "userCertificate", child))
                        goto fail;
                child = asn1time2json(X509_REVOKED_get0_revocationDate(rv));
-               if (json_object_set_new(parent, "revocationDate", child))
+               if (json_object_add(parent, "revocationDate", child))
                        goto fail;
                child = exts2json(X509_REVOKED_get0_extensions(rv));
-               if (json_object_set_new(parent, "crlEntryExtensions", child))
+               if (json_object_add(parent, "crlEntryExtensions", child))
                        goto fail;
        }
 
@@ -48,30 +50,30 @@ tbsCertList2json(X509_CRL *crl)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
-       child = json_integer(X509_CRL_get_version(crl));
-       if (json_object_set_new(parent, "version", child))
+       child = json_int_new(X509_CRL_get_version(crl));
+       if (json_object_add(parent, "version", child))
                goto fail;
-       child = json_string(OBJ_nid2sn(X509_CRL_get_signature_nid(crl)));
-       if (json_object_set_new(parent, "signature", child))
+       child = json_str_new(OBJ_nid2sn(X509_CRL_get_signature_nid(crl)));
+       if (json_object_add(parent, "signature", child))
                goto fail;
        child = name2json(X509_CRL_get_issuer(crl));
-       if (json_object_set_new(parent, "issuer", child))
+       if (json_object_add(parent, "issuer", child))
                goto fail;
        child = asn1time2json(X509_CRL_get0_lastUpdate(crl));
-       if (json_object_set_new(parent, "thisUpdate", child))
+       if (json_object_add(parent, "thisUpdate", child))
                goto fail;
        child = asn1time2json(X509_CRL_get0_nextUpdate(crl));
-       if (json_object_set_new(parent, "nextUpdate", child))
+       if (json_object_add(parent, "nextUpdate", child))
                goto fail;
        child = revokedCerts2json(crl);
-       if (json_object_set_new(parent, "revokedCertificates", child))
+       if (json_object_add(parent, "revokedCertificates", child))
                goto fail;
        child = exts2json(X509_CRL_get0_extensions(crl));
-       if (json_object_set_new(parent, "crlExtensions", child))
+       if (json_object_add(parent, "crlExtensions", child))
                goto fail;
 
        return parent;
@@ -106,18 +108,18 @@ crl2json(X509_CRL *crl)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = tbsCertList2json(crl);
-       if (json_object_set_new(parent, "tbsCertList", child))
+       if (json_object_add(parent, "tbsCertList", child))
                goto fail;
        child = sigAlgorithm2json(crl);
-       if (json_object_set_new(parent, "signatureAlgorithm", child))
+       if (json_object_add(parent, "signatureAlgorithm", child))
                goto fail;
        child = sigValue2json(crl);
-       if (json_object_set_new(parent, "signatureValue", child))
+       if (json_object_add(parent, "signatureValue", child))
                goto fail;
 
        return parent;
index c00d079709a63ad11a62c837abbea38113e74cee..76cb7e2fac36e289b7874e5da19a4e77d610f6d5 100644 (file)
@@ -2,7 +2,9 @@
 
 #include <openssl/x509v3.h>
 #include <openssl/pem.h>
+
 #include "extension.h"
+#include "json_util.h"
 #include "libcrypto_util.h"
 
 static json_t *
@@ -11,15 +13,15 @@ validity2json(X509 *x)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = asn1time2json(X509_get0_notBefore(x));
-       if (json_object_set_new(parent, "notBefore", child))
+       if (json_object_add(parent, "notBefore", child))
                goto fail;
        child = asn1time2json(X509_get0_notAfter(x));
-       if (json_object_set_new(parent, "notAfter", child))
+       if (json_object_add(parent, "notAfter", child))
                goto fail;
 
        return parent;
@@ -36,7 +38,7 @@ pk2json(X509 const *x)
        EVP_PKEY *pkey;
        BIO *bio;
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
 
@@ -50,7 +52,7 @@ pk2json(X509 const *x)
                BIO_free_all(bio);
                goto fail;
        }
-       if (json_object_set_new(root, "algorithm", bio2json(bio)))
+       if (json_object_add(root, "algorithm", bio2json(bio)))
                goto fail;
 
        /* Actual pk */
@@ -64,7 +66,7 @@ pk2json(X509 const *x)
                BIO_free_all(bio);
                goto fail;
        }
-       if (json_object_set_new(root, "subjectPublicKey", bio2json(bio)))
+       if (json_object_add(root, "subjectPublicKey", bio2json(bio)))
                goto fail;
 
        return root;
@@ -95,39 +97,39 @@ tbsCert2json(X509 *x)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
-       child = json_integer(X509_get_version(x));
-       if (json_object_set_new(parent, "version", child))
+       child = json_int_new(X509_get_version(x));
+       if (json_object_add(parent, "version", child))
                goto fail;
        child = asn1int2json(X509_get0_serialNumber(x));
-       if (json_object_set_new(parent, "serialNumber", child))
+       if (json_object_add(parent, "serialNumber", child))
                goto fail;
-       child = json_string(OBJ_nid2sn(X509_get_signature_nid(x)));
-       if (json_object_set_new(parent, "signature", child))
+       child = json_str_new(OBJ_nid2sn(X509_get_signature_nid(x)));
+       if (json_object_add(parent, "signature", child))
                goto fail;
        child = name2json(X509_get_issuer_name(x));
-       if (json_object_set_new(parent, "issuer", child))
+       if (json_object_add(parent, "issuer", child))
                goto fail;
        child = validity2json(x);
-       if (json_object_set_new(parent, "validity", child))
+       if (json_object_add(parent, "validity", child))
                goto fail;
        child = name2json(X509_get_subject_name(x));
-       if (json_object_set_new(parent, "subject", child))
+       if (json_object_add(parent, "subject", child))
                goto fail;
        child = pk2json(x);
-       if (json_object_set_new(parent, "subjectPublicKeyInfo", child))
+       if (json_object_add(parent, "subjectPublicKeyInfo", child))
                goto fail;
        child = iuid2json(x);
-       if (json_object_set_new(parent, "issuerUniqueID", child))
+       if (json_object_add(parent, "issuerUniqueID", child))
                goto fail;
        child = suid2json(x);
-       if (json_object_set_new(parent, "subjectUniqueID", child))
+       if (json_object_add(parent, "subjectUniqueID", child))
                goto fail;
        child = exts2json(X509_get0_extensions(x));
-       if (json_object_set_new(parent, "extensions", child))
+       if (json_object_add(parent, "extensions", child))
                goto fail;
 
        return parent;
@@ -162,18 +164,18 @@ x509_to_json(X509 *x)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = tbsCert2json(x);
-       if (json_object_set_new(parent, "tbsCertificate", child))
+       if (json_object_add(parent, "tbsCertificate", child))
                goto fail;
        child = sigAlgorithm2json(x);
-       if (json_object_set_new(parent, "signatureAlgorithm", child))
+       if (json_object_add(parent, "signatureAlgorithm", child))
                goto fail;
        child = sigValue2json(x);
-       if (json_object_set_new(parent, "signatureValue", child))
+       if (json_object_add(parent, "signatureValue", child))
                goto fail;
 
        return parent;
index ff566f178b864e265173141d2a2ab79ceb78d2c6..b627f29f27bcf41185cfc4fa357d89827d2c4005 100644 (file)
@@ -6,6 +6,8 @@
  */
 
 #include "asn1/asn1c/CertificateSet.h"
+
+#include "json_util.h"
 #include "asn1/asn1c/Certificate.h"
 
 static json_t *
@@ -20,7 +22,7 @@ CertificateSet_encode_json(const struct asn_TYPE_descriptor_s *td,
        if (!sptr)
                return json_null();
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
@@ -28,7 +30,7 @@ CertificateSet_encode_json(const struct asn_TYPE_descriptor_s *td,
 
        for (i = 0; i < list->count; i++) {
                child = Certificate_any2json(list->array[i]);
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
index 1f226193b991a3d0d24c427b539dfa02247a2847..fbc05a30723bd5a86ef35c43428f8eacfe7a54fc 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "asn1/asn1c/ContentInfo.h"
 
+#include "json_util.h"
 #include "asn1/asn1c/SignedData.h"
 
 json_t *
@@ -35,13 +36,13 @@ ContentInfo_encode_json(const asn_TYPE_descriptor_t *td, const void *sptr)
        if (!ci)
                return json_null();
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        td = &asn_DEF_ContentType;
        child = td->op->json_encoder(td, &ci->contentType);
-       if (json_object_set_new(parent, "contentType", child))
+       if (json_object_add(parent, "contentType", child))
                goto fail;
 
        if (OBJECT_IDENTIFIER_is_SignedData(&ci->contentType)) {
@@ -51,7 +52,7 @@ ContentInfo_encode_json(const asn_TYPE_descriptor_t *td, const void *sptr)
                td = &asn_DEF_ANY;
                child = td->op->json_encoder(td, &ci->content);
        }
-       if (json_object_set_new(parent, "content", child))
+       if (json_object_add(parent, "content", child))
                goto fail;
 
        return parent;
index 7c5e851cc02c758894412626eba0096de3c14411..2bec85014e25951bbfb2d7ccd5df5307e52fdf14 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "asn1/asn1c/EncapsulatedContentInfo.h"
 
+#include "json_util.h"
 #include "asn1/asn1c/Manifest.h"
 #include "asn1/asn1c/RouteOriginAttestation.h"
 
@@ -37,13 +38,13 @@ EncapsulatedContentInfo_encode_json(const asn_TYPE_descriptor_t *td,
        if (!eci)
                return json_null();
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        td = &asn_DEF_ContentType;
        child = td->op->json_encoder(td, &eci->eContentType);
-       if (json_object_set_new(parent, "eContentType", child))
+       if (json_object_add(parent, "eContentType", child))
                goto fail;
 
        if (OBJECT_IDENTIFIER_is_mft(&eci->eContentType)) {
@@ -59,7 +60,7 @@ EncapsulatedContentInfo_encode_json(const asn_TYPE_descriptor_t *td,
                td = &asn_DEF_OCTET_STRING;
                child = td->op->json_encoder(td, eci->eContent);
        }
-       if (json_object_set_new(parent, "eContent", child))
+       if (json_object_add(parent, "eContent", child))
                goto fail;
 
        return parent;
index 2de0f8f0ca0a26f85e0956754520f1a2f29b5a31..933fa20f950cde9a8403683d8904ca6bb40c029e 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <assert.h>
 #include <errno.h>
+#include "json_util.h"
 
 #define        ATZVARS do {                                                    \
        char tzoldbuf[64];                                              \
@@ -148,7 +149,7 @@ GeneralizedTime_encode_json(const struct asn_TYPE_descriptor_s *td, const void *
        if (GeneralizedTime2str(st, buf) < 0)
                return NULL;
 
-       return json_string(buf);
+       return json_str_new(buf);
 }
 
 #ifndef        ASN___INTERNAL_TEST_MODE
index ca0a984daf6e2a21cfa302fe308656be1c313fbf..c95996ce204f056b66005c2d03f5f892103fbe7a 100644 (file)
@@ -5,10 +5,13 @@
  */
 #include "asn1/asn1c/asn_internal.h"
 #include "asn1/asn1c/INTEGER.h"
-#include "asn1/asn1c/asn_codecs_prim.h"        /* Encoder and decoder of a primitive type */
+
 #include <assert.h>
 #include <errno.h>
 
+#include "json_util.h"
+#include "asn1/asn1c/asn_codecs_prim.h"        /* Encoder and decoder of a primitive type */
+
 /*
  * INTEGER basic type description.
  */
@@ -232,12 +235,12 @@ INTEGER_encode_json(const struct asn_TYPE_descriptor_s *td, const void *sptr)
        if (specs && specs->field_unsigned) {
                if (asn_INTEGER2umax(st, &uint) < 0)
                        return NULL;
-               return json_integer(uint);
+               return json_int_new(uint);
 
        } else {
                if (asn_INTEGER2imax(st, &sint) < 0)
                        return NULL;
-               return json_integer(sint);
+               return json_int_new(sint);
        }
 }
 
index e330ae82512fc58d1109de9d5e3ddc42ffc64ee8..b805f450a1e20072094d924d02e498cc3c9f9a46 100644 (file)
@@ -4,12 +4,15 @@
  */
 
 #include "asn1/asn1c/asn_internal.h"
-#include "asn1/asn1c/INTEGER.h"
 #include "asn1/asn1c/OBJECT_IDENTIFIER.h"
-#include "asn1/asn1c/OCTET_STRING.h"
+
 #include <assert.h>
 #include <errno.h>
 
+#include "json_util.h"
+#include "asn1/asn1c/INTEGER.h"
+#include "asn1/asn1c/OCTET_STRING.h"
+
 /*
  * OBJECT IDENTIFIER basic type description.
  */
@@ -287,7 +290,7 @@ OBJECT_IDENTIFIER_encode_json(const struct asn_TYPE_descriptor_s *td,
        char const *string;
 
        string = OBJECT_IDENTIFIER_to_string(oid, buf);
-       return (string != NULL) ? json_string(string) : NULL;
+       return (string != NULL) ? json_str_new(string) : NULL;
 }
 
 ssize_t
index c39d80dae81873e0322e88dda4772b939a7db2f2..bf081c82708cee648c4d11cd8b0cb994cb2fcea2 100644 (file)
@@ -5,11 +5,13 @@
  */
 #include "asn1/asn1c/asn_internal.h"
 #include "asn1/asn1c/OCTET_STRING.h"
-#include "asn1/asn1c/BIT_STRING.h"     /* for .bits_unused member */
+
 #include <assert.h>
 #include <errno.h>
 
 #include "alloc.h"
+#include "json_util.h"
+#include "asn1/asn1c/BIT_STRING.h"     /* for .bits_unused member */
 
 /*
  * OCTET STRING basic type description.
@@ -601,7 +603,7 @@ OCTET_STRING_encode_json(const struct asn_TYPE_descriptor_s *td,
                *r++ = H2C[(*buf     ) & 0x0F];
        }
 
-       json = json_stringn(result, 2 * os->size);
+       json = json_strn_new(result, 2 * os->size);
 
        free(result);
        return json;
@@ -612,7 +614,7 @@ OCTET_STRING_encode_json_utf8(const struct asn_TYPE_descriptor_s *td,
                         const void *sptr)
 {
        const OCTET_STRING_t *os = sptr;
-       return json_stringn((char const *) os->buf, os->size);
+       return json_strn_new((char const *) os->buf, os->size);
 }
 
 asn_enc_rval_t
index a509f1299964fc454279e3266c44bce9edfe8512..fbbcb7b67f3ee78d6007a76913763e5744260a1f 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "asn1/asn1c/ROAIPAddressFamily.h"
 
+#include "json_util.h"
 #include "types/address.h"
 
 static json_t *
@@ -14,12 +15,12 @@ prefix2json(char const *prefix, uint8_t length)
 {
        json_t *root;
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
-       if (json_object_set_new(root, "prefix", json_string(prefix)))
+       if (json_object_add(root, "prefix", json_str_new(prefix)))
                goto fail;
-       if (json_object_set_new(root, "length", json_integer(length)))
+       if (json_object_add(root, "length", json_int_new(length)))
                goto fail;
 
        return root;
@@ -65,25 +66,25 @@ AddrBlock2json(struct ROAIPAddressFamily const *riaf, char const *ipname,
        struct ROAIPAddress *src;
        int i;
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
 
-       if (json_object_set_new(root, "addressFamily", json_string(ipname)))
+       if (json_object_add(root, "addressFamily", json_str_new(ipname)))
                goto fail;
-       if (json_object_set_new(root, "addresses", addrs = json_array()))
+       if (json_object_add(root, "addresses", addrs = json_array_new()))
                goto fail;
 
        for (i = 0; i < riaf->addresses.list.count; i++) {
                src = riaf->addresses.list.array[i];
 
                pfx = pref2json(src);
-               if (json_array_append_new(addrs, pfx))
+               if (json_array_add(addrs, pfx))
                        goto fail;
 
                maxlen = asn_DEF_INTEGER.op->json_encoder(&asn_DEF_INTEGER,
                                                          src->maxLength);
-               if (json_object_set_new(pfx, "maxLength", maxlen))
+               if (json_object_add(pfx, "maxLength", maxlen))
                        goto fail;
        }
 
index c7c9a4cc2a4a78dbfedbc17e2faee976f91a904c..5409ba684d0e4490511a03d392db851df6d6a3d3 100644 (file)
@@ -5,11 +5,13 @@
 
 #include "asn1/asn1c/asn_internal.h"
 #include "asn1/asn1c/UTCTime.h"
-#include "asn1/asn1c/GeneralizedTime.h"
 
 #include <assert.h>
 #include <errno.h>
 
+#include "json_util.h"
+#include "asn1/asn1c/GeneralizedTime.h"
+
 #ifndef        ASN___INTERNAL_TEST_MODE
 
 /*
@@ -139,7 +141,7 @@ UTCTime_encode_json(const asn_TYPE_descriptor_t *td, const void *sptr)
        if (UTCTime2str(st, buf) < 0)
                return NULL;
 
-       return json_string(buf);
+       return json_str_new(buf);
 }
 
 time_t
index 72a73b9fb08937e34cced8cb1033f38e0e01d02b..64f402c38a7924af54ab4ac4df5474d14d03dbf1 100644 (file)
@@ -4,10 +4,11 @@
  * Redistribution and modifications are permitted subject to BSD license.
  */
 
-#include <assert.h>
-
 #include "asn1/asn1c/asn_internal.h"
 #include "asn1/asn1c/constr_SEQUENCE.h"
+
+#include <assert.h>
+#include "json_util.h"
 #include "asn1/asn1c/OPEN_TYPE.h"
 
 /*
@@ -621,7 +622,7 @@ SEQUENCE_encode_json(const struct asn_TYPE_descriptor_s *td, const void *sptr)
        if (!sptr)
                return json_null();
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
@@ -637,7 +638,7 @@ SEQUENCE_encode_json(const struct asn_TYPE_descriptor_s *td, const void *sptr)
                }
 
                child = elm->type->op->json_encoder(elm->type, memb_ptr);
-               if (json_object_set_new(parent, elm->name, child))
+               if (json_object_add(parent, elm->name, child))
                        goto fail;
        }
 
index 72067ca2f2fd822c43e6c57d66a62b78594f80b8..cadbacf0f243a8f2985138c0836f7898569696cf 100644 (file)
@@ -4,10 +4,11 @@
  * Redistribution and modifications are permitted subject to BSD license.
  */
 
-#include <assert.h>
-
 #include "asn1/asn1c/asn_internal.h"
 #include "asn1/asn1c/constr_SET_OF.h"
+
+#include <assert.h>
+#include "json_util.h"
 #include "asn1/asn1c/asn_SET_OF.h"
 
 /*
@@ -501,7 +502,7 @@ SET_OF_encode_json(const struct asn_TYPE_descriptor_s *td, const void *sptr)
        if (!sptr)
                return json_null();
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
@@ -510,7 +511,7 @@ SET_OF_encode_json(const struct asn_TYPE_descriptor_s *td, const void *sptr)
 
        for (i = 0; i < list->count; i++) {
                child = type->op->json_encoder(type, list->array[i]);
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
index 5ea743a587ee1e0c80045d10997a076101a6acac..802b5914bf120667147ce9867162b47fc45f4652 100644 (file)
@@ -381,11 +381,9 @@ node2json(struct cache_node *node)
 {
        json_t *json;
 
-       json = json_object();
-       if (json == NULL) {
-               pr_op_err("json object allocation failure.");
+       json = json_obj_new();
+       if (json == NULL)
                return NULL;
-       }
 
        if (json_add_str(json, TAGNAME_URL, uri_get_global(node->url)))
                goto cancel;
@@ -413,13 +411,13 @@ build_tal_json(struct rpki_cache *cache)
        struct cache_node *node, *tmp;
        json_t *root, *child;
 
-       root = json_array();
+       root = json_array_new();
        if (root == NULL)
-               enomem_panic();
+               return NULL;
 
        HASH_ITER(hh, cache->ht, node, tmp) {
                child = node2json(node);
-               if (json_array_append_new(root, child)) {
+               if (child != NULL && json_array_append_new(root, child)) {
                        pr_op_err("Cannot push %s json node into json root; unknown cause.",
                            uri_op_get_printable(node->url));
                        continue;
@@ -436,8 +434,10 @@ write_tal_json(struct rpki_cache *cache)
        struct json_t *json;
 
        json = build_tal_json(cache);
-       if (json == NULL)
+       if (json == NULL) {
+               pr_op_err("Unable to cache TAL's metadata; JSON conversion failed.");
                return;
+       }
 
        filename = get_tal_json_filename(cache);
        if (filename == NULL)
index 8e1888ba9c2b51c89a29f95242a4097e8ebbe4c7..66f8366ac6b40a5462858b98012bff5d168dae0f 100644 (file)
@@ -3,8 +3,10 @@
 #include <openssl/asn1t.h>
 #include <openssl/objects.h>
 #include <openssl/x509v3.h>
+
 #include "cert_stack.h"
 #include "common.h"
+#include "json_util.h"
 #include "libcrypto_util.h"
 #include "log.h"
 #include "nid.h"
@@ -14,7 +16,7 @@
 static json_t *
 unimplemented(void const *arg)
 {
-       return arg ? json_string("<Not implemented for now>") : json_null();
+       return arg ? json_str_new("<Not implemented for now>") : json_null();
 }
 
 static json_t *
@@ -24,15 +26,15 @@ bc2json(void const *ext)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = json_boolean(bc->ca);
-       if (json_object_set_new(parent, "cA", child))
+       if (json_object_add(parent, "cA", child))
                goto fail;
        child = asn1int2json(bc->pathlen);
-       if (json_object_set_new(parent, "pathLenConstraint", child))
+       if (json_object_add(parent, "pathLenConstraint", child))
                goto fail;
 
        return parent;
@@ -82,18 +84,18 @@ aki2json(void const *ext)
        json_t *parent;
        json_t *child;
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = asn1str2json(aki->keyid);
-       if (json_object_set_new(parent, "keyIdentifier", child))
+       if (json_object_add(parent, "keyIdentifier", child))
                goto fail;
        child = unimplemented(aki->issuer);
-       if (json_object_set_new(parent, "authorityCertIssuer", child))
+       if (json_object_add(parent, "authorityCertIssuer", child))
                goto fail;
        child = asn1int2json(aki->serial);
-       if (json_object_set_new(parent, "authorityCertSerialNumber", child))
+       if (json_object_add(parent, "authorityCertSerialNumber", child))
                goto fail;
 
        return parent;
@@ -129,36 +131,36 @@ ku2json(void const *ext)
        memset(data, 0, sizeof(data));
        memcpy(data, ku->data, ku->length);
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = json_boolean(data[0] & 0x80u);
-       if (json_object_set_new(parent, "digitalSignature", child))
+       if (json_object_add(parent, "digitalSignature", child))
                goto fail;
        child = json_boolean(data[0] & 0x40u);
-       if (json_object_set_new(parent, "contentCommitment", child))
+       if (json_object_add(parent, "contentCommitment", child))
                goto fail;
        child = json_boolean(data[0] & 0x20u);
-       if (json_object_set_new(parent, "keyEncipherment", child))
+       if (json_object_add(parent, "keyEncipherment", child))
                goto fail;
        child = json_boolean(data[0] & 0x10u);
-       if (json_object_set_new(parent, "dataEncipherment", child))
+       if (json_object_add(parent, "dataEncipherment", child))
                goto fail;
        child = json_boolean(data[0] & 0x08u);
-       if (json_object_set_new(parent, "keyAgreement", child))
+       if (json_object_add(parent, "keyAgreement", child))
                goto fail;
        child = json_boolean(data[0] & 0x04u);
-       if (json_object_set_new(parent, "keyCertSign", child))
+       if (json_object_add(parent, "keyCertSign", child))
                goto fail;
        child = json_boolean(data[0] & 0x02u);
-       if (json_object_set_new(parent, "cRLSign", child))
+       if (json_object_add(parent, "cRLSign", child))
                goto fail;
        child = json_boolean(data[0] & 0x01u);
-       if (json_object_set_new(parent, "encipherOnly", child))
+       if (json_object_add(parent, "encipherOnly", child))
                goto fail;
        child = json_boolean(data[1] & 0x80u);
-       if (json_object_set_new(parent, "decipherOnly", child))
+       if (json_object_add(parent, "decipherOnly", child))
                goto fail;
 
        return parent;
@@ -190,21 +192,21 @@ rdn2json(STACK_OF(X509_NAME_ENTRY) *rdn)
        X509_NAME_ENTRY *name;
        int n;
 
-       root = json_array();
+       root = json_array_new();
        if (root == NULL)
                return NULL;
 
        for (n = 0; n < sk_X509_NAME_ENTRY_num(rdn); n++) {
                name = sk_X509_NAME_ENTRY_value(rdn, n);
 
-               if (json_array_append_new(root, parent = json_object()))
+               if (json_array_add(root, parent = json_obj_new()))
                        goto fail;
 
                child = oid2json(X509_NAME_ENTRY_get_object(name));
-               if (json_object_set_new(parent, "type", child))
+               if (json_object_add(parent, "type", child))
                        goto fail;
                child = asn1str2json(X509_NAME_ENTRY_get_data(name));
-               if (json_object_set_new(parent, "value", child))
+               if (json_object_add(parent, "value", child))
                        goto fail;
        }
 
@@ -234,24 +236,24 @@ cdp2json(void const *ext)
        DIST_POINT *dp;
        int d;
 
-       root = json_array();
+       root = json_array_new();
        if (root == NULL)
                return NULL;
 
        for (d = 0; d < sk_DIST_POINT_num(crldp); d++) {
                dp = sk_DIST_POINT_value(crldp, d);
 
-               if (json_array_append_new(root, parent = json_object()))
+               if (json_array_add(root, parent = json_obj_new()))
                        goto fail;
 
                child = dpname2json(dp->distpoint);
-               if (json_object_set_new(parent, "distributionPoint", child))
+               if (json_object_add(parent, "distributionPoint", child))
                        goto fail;
                child = unimplemented(dp->reasons);
-               if (json_object_set_new(parent, "reasons", child))
+               if (json_object_add(parent, "reasons", child))
                        goto fail;
                child = gns2json(dp->CRLissuer);
-               if (json_object_set_new(parent, "cRLIssuer", child))
+               if (json_object_add(parent, "cRLIssuer", child))
                        goto fail;
        }
 
@@ -285,21 +287,21 @@ aia2json(void const *ext)
        json_t *child;
        int i;
 
-       root = json_array();
+       root = json_array_new();
        if (root == NULL)
                return NULL;
 
        for (i = 0; i < sk_ACCESS_DESCRIPTION_num(ia); i++) {
                ad = sk_ACCESS_DESCRIPTION_value(ia, i);
 
-               if (json_array_append_new(root, parent = json_object()))
+               if (json_array_add(root, parent = json_obj_new()))
                        goto fail;
 
                child = oid2json(ad->method);
-               if (json_object_set_new(parent, "accessMethod", child))
+               if (json_object_add(parent, "accessMethod", child))
                        goto fail;
                child = gn2json(ad->location);
-               if (json_object_set_new(parent, "accessLocation", child))
+               if (json_object_add(parent, "accessLocation", child))
                        goto fail;
        }
 
@@ -340,15 +342,15 @@ pq2json(POLICYQUALINFO const *pqi)
        if (pqi == NULL)
                return json_null();
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = oid2json(pqi->pqualid);
-       if (json_object_set_new(parent, "policyQualifierId", child))
+       if (json_object_add(parent, "policyQualifierId", child))
                goto fail;
        child = unimplemented(&pqi->d);
-       if (json_object_set_new(parent, "qualifier", child))
+       if (json_object_add(parent, "qualifier", child))
                goto fail;
 
        return NULL;
@@ -367,13 +369,13 @@ pqs2json(STACK_OF(POLICYQUALINFO) const *pqs)
        if (pqs == NULL)
                return json_null();
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
        for (i = 0; i < sk_POLICYQUALINFO_num(pqs); i++) {
                child = pq2json(sk_POLICYQUALINFO_value(pqs, i));
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
@@ -392,15 +394,15 @@ pi2json(POLICYINFO const *pi)
        if (pi == NULL)
                return json_null();
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
        child = oid2json(pi->policyid);
-       if (json_object_set_new(parent, "policyIdentifier", child))
+       if (json_object_add(parent, "policyIdentifier", child))
                goto fail;
        child = pqs2json(pi->qualifiers);
-       if (json_object_set_new(parent, "policyQualifiers", child))
+       if (json_object_add(parent, "policyQualifiers", child))
                goto fail;
 
        return parent;
@@ -417,13 +419,13 @@ cp2json(void const *ext)
        json_t *child;
        int i;
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
        for (i = 0; i < sk_POLICYINFO_num(cp); i++) {
                child = pi2json(sk_POLICYINFO_value(cp, i));
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
@@ -469,7 +471,7 @@ p2json(ASN1_BIT_STRING const *ap, int af)
                length -= ap->flags & 7;
 
        written = snprintf(full, INET6_ADDRSTRLEN + 4, "%s/%u", str, length);
-       return json_stringn(full, written);
+       return json_strn_new(full, written);
 }
 
 static json_t *
@@ -498,13 +500,13 @@ iaors2json(IPAddressOrRanges *iaor, int af)
        if (iaor == NULL)
                return json_null();
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
        for (i = 0; i < sk_IPAddressOrRange_num(iaor); i++) {
                child = iaor2json(sk_IPAddressOrRange_value(iaor, i), af);
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
@@ -522,7 +524,7 @@ iac2json(IPAddressChoice const *iac, int af)
 
        switch (iac->type) {
        case IPAddressChoice_inherit:
-               return json_string("inherit");
+               return json_str_new("inherit");
        case IPAddressChoice_addressesOrRanges:
                return iaors2json(iac->u.addressesOrRanges, af);
        }
@@ -542,7 +544,7 @@ iaf2json(IPAddressFamily const *iaf)
        if (iaf == NULL)
                return json_null();
 
-       parent = json_object();
+       parent = json_obj_new();
        if (parent == NULL)
                return NULL;
 
@@ -560,11 +562,11 @@ iaf2json(IPAddressFamily const *iaf)
                goto fail;
        }
 
-       child = json_string(family);
-       if (json_object_set_new(parent, "addressFamily", child))
+       child = json_str_new(family);
+       if (json_object_add(parent, "addressFamily", child))
                goto fail;
        child = iac2json(iaf->ipAddressChoice, afid);
-       if (json_object_set_new(parent, "ipAddressChoice", child))
+       if (json_object_add(parent, "ipAddressChoice", child))
                goto fail;
 
        return parent;
@@ -581,13 +583,13 @@ ir2json(void const *ext)
        json_t *child;
        int i;
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
        for (i = 0; i < sk_IPAddressFamily_num(iafs); i++) {
                child = iaf2json(sk_IPAddressFamily_value(iafs, i));
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
@@ -619,12 +621,12 @@ asr2json(ASRange const *range)
        if (range == NULL)
                return json_null();
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
-       if (json_object_set_new(root, "min", asn1int2json(range->min)))
+       if (json_object_add(root, "min", asn1int2json(range->min)))
                goto fail;
-       if (json_object_set_new(root, "max", asn1int2json(range->max)))
+       if (json_object_add(root, "max", asn1int2json(range->max)))
                goto fail;
 
        return root;
@@ -659,13 +661,13 @@ aior2json(ASIdOrRanges *aior)
        if (aior == NULL)
                return json_null();
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
        for (i = 0; i < sk_ASIdOrRange_num(aior); i++) {
                child = aor2json(sk_ASIdOrRange_value(aior, i));
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
        return parent;
@@ -682,7 +684,7 @@ asidc2json(ASIdentifierChoice const *asidc)
 
        switch (asidc->type) {
        case ASIdentifierChoice_inherit:
-               return json_string("inherit");
+               return json_str_new("inherit");
        case ASIdentifierChoice_asIdsOrRanges:
                return aior2json(asidc->u.asIdsOrRanges);
        }
@@ -699,12 +701,12 @@ ar2json(void const *ext)
        if (asid == NULL)
                return json_null();
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
-       if (json_object_set_new(root, "asnum", asidc2json(asid->asnum)))
+       if (json_object_add(root, "asnum", asidc2json(asid->asnum)))
                goto fail;
-       if (json_object_set_new(root, "rdi", asidc2json(asid->rdi)))
+       if (json_object_add(root, "rdi", asidc2json(asid->rdi)))
                goto fail;
 
        return root;
@@ -771,13 +773,13 @@ eku2json(void const *ext)
        json_t *child;
        int i;
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return parent;
 
        for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
                child = oid2json(sk_ASN1_OBJECT_value(eku, i));
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
index be91240118d602b29103b5cf371bdb816010a5de..7c60b903831657571b995828ce8cf09a07e21405 100644 (file)
@@ -263,3 +263,81 @@ json_add_ts(json_t *parent, char const *name, time_t value)
 
        return 0;
 }
+
+#define OOM_PFX " Likely out of memory (but there is no contract)."
+
+json_t *
+json_obj_new(void)
+{
+       json_t *json = json_object();
+       if (json == NULL)
+               pr_op_err_st("Cannot create JSON object." OOM_PFX);
+       return json;
+}
+
+json_t *
+json_array_new(void)
+{
+       json_t *json = json_array();
+       if (json == NULL)
+               pr_op_err_st("Cannot create JSON array." OOM_PFX);
+       return json;
+}
+
+json_t *
+json_int_new(json_int_t value)
+{
+       json_t *json = json_integer(value);
+       if (json == NULL)
+               pr_op_err_st("Cannot create JSON integer '%lld'."
+                            OOM_PFX, value);
+       return json;
+}
+
+json_t *
+json_str_new(const char *value)
+{
+       json_t *json = json_string(value);
+       if (json == NULL)
+               pr_op_err_st("Cannot create JSON string '%s'." OOM_PFX, value);
+       return json;
+}
+
+json_t *
+json_strn_new(const char *value, size_t len)
+{
+       json_t *json = json_stringn(value, len);
+       if (json == NULL)
+               pr_op_err_st("Cannot create JSON string '%.*s'."
+                            OOM_PFX, (int)len, value);
+       return json;
+}
+
+int
+json_object_add(json_t *parent, char const *name, json_t *value)
+{
+       int res;
+
+       if (value == NULL)
+               return -1; /* Already messaged */
+
+       res = json_object_set_new(parent, name, value);
+       if (res == -1)
+               pr_op_err_st("Cannot add JSON '%s' to parent; unknown error.",
+                            name);
+       return res;
+}
+
+int
+json_array_add(json_t *array, json_t *node)
+{
+       int res;
+
+       if (node == NULL)
+               return -1; /* Already messaged */
+
+       res = json_array_append_new(array, node);
+       if (res == -1)
+               pr_op_err_st("Cannot add JSON node to array; unknown error.");
+       return res;
+}
index bb2df3fff3f948306885501ffa3b0d0e3f6bd65e..23afc304e19ab96f1bc005636b616a7f1df8f215 100644 (file)
@@ -39,4 +39,12 @@ int json_add_int(json_t *, char const *, int);
 int json_add_str(json_t *, char const *, char const *);
 int json_add_ts(json_t *, char const *, time_t);
 
+json_t *json_obj_new(void);
+json_t *json_array_new(void);
+json_t *json_int_new(json_int_t);
+json_t *json_str_new(const char *);
+json_t *json_strn_new(const char *, size_t);
+int json_object_add(json_t *, char const *, json_t *);
+int json_array_add(json_t *, json_t *);
+
 #endif /* SRC_JSON_UTIL_H_ */
index eb0d4054201e891efa06cd722d8c1541f0f7e3af..9f082b3d52ee949dbb98dcf94b87cd6d4b6e49e6 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "alloc.h"
 #include "extension.h"
+#include "json_util.h"
 
 /* Swallows @bio. */
 char *
@@ -30,7 +31,7 @@ bio2json(BIO *bio)
        json_t *json;
 
        json = (BIO_get_mem_ptr(bio, &buffer) > 0)
-           ? json_stringn(buffer->data, buffer->length)
+           ? json_strn_new(buffer->data, buffer->length)
            : NULL;
 
        BIO_free_all(bio);
@@ -40,7 +41,7 @@ bio2json(BIO *bio)
 json_t *
 oid2json(ASN1_OBJECT const *oid)
 {
-       return oid ? json_string(OBJ_nid2sn(OBJ_obj2nid(oid))) : json_null();
+       return oid ? json_str_new(OBJ_nid2sn(OBJ_obj2nid(oid))) : json_null();
 }
 
 json_t *
@@ -56,7 +57,7 @@ asn1int2json(ASN1_INTEGER const *asn1int)
        bignum = ASN1_INTEGER_to_BN(asn1int, NULL);
        str = BN_bn2hex(bignum);
 
-       json = json_string(str);
+       json = json_str_new(str);
 
        OPENSSL_free(str);
        BN_free(bignum);
@@ -126,26 +127,26 @@ name2json(X509_NAME const *name)
        if (name == NULL)
                return json_null();
 
-       root = json_object();
+       root = json_obj_new();
        if (root == NULL)
                return NULL;
-       if (json_object_set_new(root, "rdnSequence", rdnSeq = json_array()))
+       if (json_object_add(root, "rdnSequence", rdnSeq = json_array_new()))
                goto fail;
 
        for (i = 0; i < X509_NAME_entry_count(name); i++) {
-               if (json_array_append_new(rdnSeq, typeval = json_object()))
+               if (json_array_add(rdnSeq, typeval = json_obj_new()))
                        goto fail;
 
                entry = X509_NAME_get_entry(name, i);
                nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(entry));
                data = X509_NAME_ENTRY_get_data(entry);
 
-               child = json_string(OBJ_nid2ln(nid));
-               if (json_object_set_new(typeval, "type", child))
+               child = json_str_new(OBJ_nid2ln(nid));
+               if (json_object_add(typeval, "type", child))
                        goto fail;
 
-               child = json_stringn((char *)data->data, data->length);
-               if (json_object_set_new(typeval, "value", child))
+               child = json_strn_new((char *)data->data, data->length);
+               if (json_object_add(typeval, "value", child))
                        goto fail;
        }
 
@@ -166,8 +167,8 @@ gn2json(GENERAL_NAME const *gn)
 
        str = GENERAL_NAME_get0_value(gn, &type);
        return (type == GEN_URI)
-           ? json_stringn((char const *)str->data, str->length)
-           : json_string("<Not implemented for now>");
+           ? json_strn_new((char const *)str->data, str->length)
+           : json_str_new("<Not implemented for now>");
 }
 
 json_t *
@@ -180,13 +181,13 @@ gns2json(GENERAL_NAMES const *gns)
        if (gns == NULL)
                return json_null();
 
-       parent = json_array();
+       parent = json_array_new();
        if (parent == NULL)
                return NULL;
 
        for (n = 0; n < sk_GENERAL_NAME_num(gns); n++) {
                child = gn2json(sk_GENERAL_NAME_value(gns, n));
-               if (json_array_append_new(parent, child))
+               if (json_array_add(parent, child))
                        goto fail;
        }
 
@@ -263,12 +264,12 @@ exts2json(const STACK_OF(X509_EXTENSION) *exts)
        if (sk_X509_EXTENSION_num(exts) <= 0)
                return json_null();
 
-       root = json_array();
+       root = json_array_new();
        if (root == NULL)
                return NULL;
 
        for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
-               if (json_array_append_new(root, parent = json_object()))
+               if (json_array_add(root, parent = json_obj_new()))
                        goto fail;
 
                ex = sk_X509_EXTENSION_value(exts, i);
@@ -283,16 +284,16 @@ exts2json(const STACK_OF(X509_EXTENSION) *exts)
                }
 
                name = bio2str(bio);
-               child = json_string(name);
+               child = json_str_new(name);
                free(name);
 
-               if (json_object_set_new(parent, "extnID", child))
+               if (json_object_add(parent, "extnID", child))
                        goto fail;
                child = json_boolean(X509_EXTENSION_get_critical(ex));
-               if (json_object_set_new(parent, "critical", child))
+               if (json_object_add(parent, "critical", child))
                        goto fail;
                child = ext2json(ex);
-               if (json_object_set_new(parent, "extnValue", child))
+               if (json_object_add(parent, "extnValue", child))
                        goto fail;
        }