From: Alberto Leiva Popper Date: Fri, 10 May 2024 23:44:36 +0000 (-0600) Subject: Spread error messages in --mode=print's failure paths X-Git-Tag: 1.6.2~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fb802f60119d627e643d168d83ba86c4fc47708;p=thirdparty%2FFORT-validator.git Spread error messages in --mode=print's failure paths 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. --- diff --git a/src/asn1/asn1c/BOOLEAN.c b/src/asn1/asn1c/BOOLEAN.c index ba56217b..d646f7b1 100644 --- a/src/asn1/asn1c/BOOLEAN.c +++ b/src/asn1/asn1c/BOOLEAN.c @@ -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 diff --git a/src/asn1/asn1c/CMSAttribute.c b/src/asn1/asn1c/CMSAttribute.c index 91b23f1c..3b4b7223 100644 --- a/src/asn1/asn1c/CMSAttribute.c +++ b/src/asn1/asn1c/CMSAttribute.c @@ -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; } diff --git a/src/asn1/asn1c/CRL.c b/src/asn1/asn1c/CRL.c index 6b8afce4..89edd6b3 100644 --- a/src/asn1/asn1c/CRL.c +++ b/src/asn1/asn1c/CRL.c @@ -2,7 +2,9 @@ #include #include + #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; diff --git a/src/asn1/asn1c/Certificate.c b/src/asn1/asn1c/Certificate.c index c00d0797..76cb7e2f 100644 --- a/src/asn1/asn1c/Certificate.c +++ b/src/asn1/asn1c/Certificate.c @@ -2,7 +2,9 @@ #include #include + #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; diff --git a/src/asn1/asn1c/CertificateSet.c b/src/asn1/asn1c/CertificateSet.c index ff566f17..b627f29f 100644 --- a/src/asn1/asn1c/CertificateSet.c +++ b/src/asn1/asn1c/CertificateSet.c @@ -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; } diff --git a/src/asn1/asn1c/ContentInfo.c b/src/asn1/asn1c/ContentInfo.c index 1f226193..fbc05a30 100644 --- a/src/asn1/asn1c/ContentInfo.c +++ b/src/asn1/asn1c/ContentInfo.c @@ -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; diff --git a/src/asn1/asn1c/EncapsulatedContentInfo.c b/src/asn1/asn1c/EncapsulatedContentInfo.c index 7c5e851c..2bec8501 100644 --- a/src/asn1/asn1c/EncapsulatedContentInfo.c +++ b/src/asn1/asn1c/EncapsulatedContentInfo.c @@ -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; diff --git a/src/asn1/asn1c/GeneralizedTime.c b/src/asn1/asn1c/GeneralizedTime.c index 2de0f8f0..933fa20f 100644 --- a/src/asn1/asn1c/GeneralizedTime.c +++ b/src/asn1/asn1c/GeneralizedTime.c @@ -11,6 +11,7 @@ #include #include +#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 diff --git a/src/asn1/asn1c/INTEGER.c b/src/asn1/asn1c/INTEGER.c index ca0a984d..c95996ce 100644 --- a/src/asn1/asn1c/INTEGER.c +++ b/src/asn1/asn1c/INTEGER.c @@ -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 #include +#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); } } diff --git a/src/asn1/asn1c/OBJECT_IDENTIFIER.c b/src/asn1/asn1c/OBJECT_IDENTIFIER.c index e330ae82..b805f450 100644 --- a/src/asn1/asn1c/OBJECT_IDENTIFIER.c +++ b/src/asn1/asn1c/OBJECT_IDENTIFIER.c @@ -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 #include +#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 diff --git a/src/asn1/asn1c/OCTET_STRING.c b/src/asn1/asn1c/OCTET_STRING.c index c39d80da..bf081c82 100644 --- a/src/asn1/asn1c/OCTET_STRING.c +++ b/src/asn1/asn1c/OCTET_STRING.c @@ -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 #include #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 diff --git a/src/asn1/asn1c/ROAIPAddressFamily.c b/src/asn1/asn1c/ROAIPAddressFamily.c index a509f129..fbbcb7b6 100644 --- a/src/asn1/asn1c/ROAIPAddressFamily.c +++ b/src/asn1/asn1c/ROAIPAddressFamily.c @@ -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; } diff --git a/src/asn1/asn1c/UTCTime.c b/src/asn1/asn1c/UTCTime.c index c7c9a4cc..5409ba68 100644 --- a/src/asn1/asn1c/UTCTime.c +++ b/src/asn1/asn1c/UTCTime.c @@ -5,11 +5,13 @@ #include "asn1/asn1c/asn_internal.h" #include "asn1/asn1c/UTCTime.h" -#include "asn1/asn1c/GeneralizedTime.h" #include #include +#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 diff --git a/src/asn1/asn1c/constr_SEQUENCE.c b/src/asn1/asn1c/constr_SEQUENCE.c index 72a73b9f..64f402c3 100644 --- a/src/asn1/asn1c/constr_SEQUENCE.c +++ b/src/asn1/asn1c/constr_SEQUENCE.c @@ -4,10 +4,11 @@ * Redistribution and modifications are permitted subject to BSD license. */ -#include - #include "asn1/asn1c/asn_internal.h" #include "asn1/asn1c/constr_SEQUENCE.h" + +#include +#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; } diff --git a/src/asn1/asn1c/constr_SET_OF.c b/src/asn1/asn1c/constr_SET_OF.c index 72067ca2..cadbacf0 100644 --- a/src/asn1/asn1c/constr_SET_OF.c +++ b/src/asn1/asn1c/constr_SET_OF.c @@ -4,10 +4,11 @@ * Redistribution and modifications are permitted subject to BSD license. */ -#include - #include "asn1/asn1c/asn_internal.h" #include "asn1/asn1c/constr_SET_OF.h" + +#include +#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; } diff --git a/src/cache/local_cache.c b/src/cache/local_cache.c index 5ea743a5..802b5914 100644 --- a/src/cache/local_cache.c +++ b/src/cache/local_cache.c @@ -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) diff --git a/src/extension.c b/src/extension.c index 8e1888ba..66f8366a 100644 --- a/src/extension.c +++ b/src/extension.c @@ -3,8 +3,10 @@ #include #include #include + #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("") : json_null(); + return arg ? json_str_new("") : 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; } diff --git a/src/json_util.c b/src/json_util.c index be912401..7c60b903 100644 --- a/src/json_util.c +++ b/src/json_util.c @@ -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; +} diff --git a/src/json_util.h b/src/json_util.h index bb2df3ff..23afc304 100644 --- a/src/json_util.h +++ b/src/json_util.h @@ -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_ */ diff --git a/src/libcrypto_util.c b/src/libcrypto_util.c index eb0d4054..9f082b3d 100644 --- a/src/libcrypto_util.c +++ b/src/libcrypto_util.c @@ -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(""); + ? json_strn_new((char const *)str->data, str->length) + : json_str_new(""); } 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; }