diff --git a/apps/unit_tests/cast_helpers_unit_tests.c b/apps/unit_tests/cast_helpers_unit_tests.c index 61e5f7b2b..0724e398c 100644 --- a/apps/unit_tests/cast_helpers_unit_tests.c +++ b/apps/unit_tests/cast_helpers_unit_tests.c @@ -58,6 +58,12 @@ castTestUlongToInt(unsigned long src, int* dst) { return(0); } +static int +castTestUlongLongToInt(unsigned long long src, int* dst) { + XMLSEC_SAFE_CAST_ULLONG_TO_INT(src, (*dst), return(-1), NULL); + return(0); +} + static int castTestLongToInt(long src, int* dst) { XMLSEC_SAFE_CAST_LONG_TO_INT(src, (*dst), return(-1), NULL); @@ -366,6 +372,44 @@ test_safe_cast_ulong_to_int(void) { testFinishedFailure(); } +static void +test_safe_cast_ulonglong_to_int(void) { + int dst = 0; + int ret; + + testStart("XMLSEC_SAFE_CAST_ULLONG_TO_INT"); + + /* valid values: min and max */ + ret = castTestUlongLongToInt(0, &dst); + if((ret != 0) || (dst != 0)) { + testLog("Error: valid value 0 was rejected or mis-cast\n"); + goto failed; + } + ret = castTestUlongLongToInt((unsigned long long)INT_MAX, &dst); + if((ret != 0) || (dst != INT_MAX)) { + testLog("Error: valid value INT_MAX was rejected or mis-cast\n"); + goto failed; + } + + /* out-of-range values must be rejected and leave dst unmodified (only + * testable when unsigned long long is wider than int so that the value + * is representable) */ +#if (ULLONG_MAX > INT_MAX) + dst = 0; + ret = castTestUlongLongToInt(((unsigned long long)INT_MAX) + 1ULL, &dst); + if((ret == 0) || (dst != 0)) { + testLog("Error: value INT_MAX+1 (above the destination max) was not rejected\n"); + goto failed; + } +#endif /* (ULLONG_MAX > INT_MAX) */ + + testFinishedSuccess(); + return; + +failed: + testFinishedFailure(); +} + static void test_safe_cast_long_to_int(void) { #if (LONG_MIN < INT_MIN) || (LONG_MAX > INT_MAX) @@ -1200,6 +1244,7 @@ test_cast_helpers(void) { /* to int */ test_safe_cast_uint_to_int(); test_safe_cast_ulong_to_int(); + test_safe_cast_ulonglong_to_int(); test_safe_cast_long_to_int(); test_safe_cast_size_t_to_int(); test_safe_cast_size_to_int(); diff --git a/src/bn.c b/src/bn.c index d98641ec4..431207501 100644 --- a/src/bn.c +++ b/src/bn.c @@ -457,7 +457,7 @@ xmlSecBnDiv(xmlSecBnPtr bn, int divider, int* mod) { data[ii] = (xmlSecByte)(over / dividerULL); over = over % dividerULL; } - (*mod) = (int)over; + XMLSEC_SAFE_CAST_ULLONG_TO_INT(over, (*mod), return(-1), NULL); /* remove leading zeros */ for(ii = 0; ii < size; ii++) { diff --git a/src/cast_helpers.h b/src/cast_helpers.h index 26bb99ad7..5ebbf6201 100644 --- a/src/cast_helpers.h +++ b/src/cast_helpers.h @@ -106,6 +106,23 @@ int, (dstVal), "%d", INT_MIN, INT_MAX, \ errorAction, (errorObject)) +/* Safe cast with limits check: unsigned long long -> int (unsigned long long is non-negative, so only the max is checked) */ +#if (ULLONG_MAX > INT_MAX) + +#define XMLSEC_SAFE_CAST_ULLONG_TO_INT(srcVal, dstVal, errorAction, errorObject) \ + XMLSEC_SAFE_CAST_MAX_CHECK(unsigned long long, (srcVal), "%llu", \ + int, (dstVal), "%d", INT_MIN, INT_MAX, \ + errorAction, (errorObject)) + +#else /* (ULLONG_MAX > INT_MAX) */ + +#define XMLSEC_SAFE_CAST_ULLONG_TO_INT(srcVal, dstVal, errorAction, errorObject) \ + do { \ + (dstVal) = (srcVal); /* errorAction/errorObject unused: cast always fits */ \ + } while(0) + +#endif /* (ULLONG_MAX > INT_MAX) */ + /* Safe cast with limits check: long -> int (checks both min and max) */ #define XMLSEC_SAFE_CAST_LONG_TO_INT(srcVal, dstVal, errorAction, errorObject) \ XMLSEC_SAFE_CAST_MIN_MAX_CHECK(long, (srcVal), "%ld", \ diff --git a/src/gnutls/x509vfy.c b/src/gnutls/x509vfy.c index b8aef6222..f5f17f3c3 100644 --- a/src/gnutls/x509vfy.c +++ b/src/gnutls/x509vfy.c @@ -338,15 +338,16 @@ xmlSecGnuTLSX509StoreGetCrls( return(-1); } - /* verify caller-supplied crl (time + signature); drop it if it fails */ + /* verify caller-supplied crl (time + signature); fail closed if it fails */ ret = xmlSecGnuTLSX509StoreVerifyCrlInternal(store, crl, extra_certs, keyInfoCtx); if(ret < 0) { xmlSecInternalError("xmlSecGnuTLSX509StoreVerifyCrlInternal", NULL); xmlFree(res); return(-1); } else if(ret != 1) { - /* crl failed verification, drop it */ - continue; + /* crl failed verification: this is a hard failure because we expect CRLs to be valid */ + xmlFree(res); + return(-1); } res[res_pos] = crl; ++res_pos; diff --git a/src/mscng/app.c b/src/mscng/app.c index 0fc5a7f3f..a181ad932 100644 --- a/src/mscng/app.c +++ b/src/mscng/app.c @@ -70,9 +70,11 @@ xmlSecMSCngAppParseConfig(const char* config, LPTSTR* pCurrentUserStoreName, LPT } } else { /* two-part format: : */ - size_t currentUserLen = (size_t)(colonPos - config); + xmlSecSize currentUserLen; const char* localMachinePart = colonPos + 1; + XMLSEC_SAFE_CAST_PTRDIFF_TO_SIZE((colonPos - config), currentUserLen, return(-1), NULL); + if(currentUserLen > 0) { char* tmp = (char*)xmlMalloc(currentUserLen + 1); if(tmp == NULL) { @@ -284,7 +286,7 @@ xmlSecMSCngAppKeyLoadEx(const char *filename, xmlSecKeyDataType type, xmlSecKeyD XMLSEC_SAFE_CAST_SIZE_TO_ULONG(bufSize, dwDataSize, {xmlSecBufferFinalize(&buffer); return(NULL);}, NULL); /* Try to read private key first and if no luck, try public key - * + * * Note: xmlSecMSCngAppKeyReadPrivKeyFromDer() only supports DH and X25519 PKCS#8 * private keys; other private key types (RSA/EC/DSA) are not supported in DER form * by this backend. Public-key DER files are handled by xmlSecMSCngAppKeyReadPubKeyFromDer(). */ diff --git a/src/mscng/x509vfy.c b/src/mscng/x509vfy.c index 9ca209472..e204214db 100644 --- a/src/mscng/x509vfy.c +++ b/src/mscng/x509vfy.c @@ -558,7 +558,7 @@ xmlSecMSCngX509StoreContainsCert(HCERTSTORE store, CERT_NAME_BLOB* name, PCCERT_ while (TRUE) { /* storeCert will be released in the next CertFindCertificateInStore() call - * (see https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certfindcertificateinstore) */ + * (see https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certfindcertificateinstore) */ storeCert = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, @@ -708,7 +708,7 @@ struct xmlSecMSCngX509StoreVerifyCertificateChainStep { BOOL freeCert; }; #define XMLSEC_MSCNG_X509_STORE_VERIFY_CERTIFICATE_CHAIN_STEP_SIZE 32 -#define XMLSEC_MSCNG_X509_STORE_VERIFY_CERTIFICATE_CHAIN_MAX_DEPTH 1000 +#define XMLSEC_MSCNG_X509_STORE_VERIFY_CERTIFICATE_CHAIN_MAX_DEPTH 100 #define XMLSEC_MSCNG_X509_CERT_HASH_SIZE 20 /* Returns the SHA1 hash of @p pCert in @p pHash. Returns 0 on success, -1 on error. */ diff --git a/src/mscrypto/x509vfy.c b/src/mscrypto/x509vfy.c index 5b64b64cc..08e57b72a 100644 --- a/src/mscrypto/x509vfy.c +++ b/src/mscrypto/x509vfy.c @@ -431,7 +431,7 @@ struct xmlSecMSCryptoBuildCertChainStep { BOOL freeCert; }; #define XMLSEC_MSCRYPTO_BUILD_CERT_CHAIN_STEP_SIZE 32 -#define XMLSEC_MSCRYPTO_BUILD_CERT_CHAIN_MAX_DEPTH 1000 +#define XMLSEC_MSCRYPTO_BUILD_CERT_CHAIN_MAX_DEPTH 100 #define XMLSEC_MSCRYPTO_X509_CERT_HASH_SIZE 20 /* Returns the SHA1 hash of @p pCert in @p pHash. Returns 0 on success, -1 on error. */ diff --git a/src/nss/app.c b/src/nss/app.c index cd1a5d816..450222014 100644 --- a/src/nss/app.c +++ b/src/nss/app.c @@ -194,16 +194,11 @@ xmlSecNssAppReadSECItem(SECItem *contents, const char *fn) { goto done; } /* - * info.size is PROffset32 (int) in this NSPR; ensure it is non-negative - * before casting to unsigned int (the limit for a single PR_Read call and - * for the SECItem.len field). + * info.size is PROffset32 (int) in this NSPR; check that it fits into + * unsigned int (the limit for a single PR_Read call and for the + * SECItem.len field). */ - if (info.size < 0) { - xmlSecNssError2("PR_GetOpenFileInfo", NULL, - "filename=%s", xmlSecErrorsSafeString(fn)); - goto done; - } - ulen = (unsigned int)info.size; + XMLSEC_SAFE_CAST_INT_TO_UINT(info.size, ulen, goto done, NULL); contents->data = 0; if (!SECITEM_AllocItem(NULL, contents, ulen)) { diff --git a/src/openssl/private.h b/src/openssl/private.h index f3f03e50a..9b725899b 100644 --- a/src/openssl/private.h +++ b/src/openssl/private.h @@ -97,8 +97,11 @@ X509* xmlSecOpenSSLX509CertLoadBIO (BIO* bio, X509_CRL* xmlSecOpenSSLX509CrlLoadBIO (BIO* bio, xmlSecKeyDataFormat format); -int xmlSecOpenSSLX509Asn1TimeToTime (const ASN1_TIME * t, time_t * res); -void xmlSecOpenSSLX509NameToString (XMLSEC_OPENSSL400_CONST X509_NAME* name, char* buf, int bufLen); +int xmlSecOpenSSLX509Asn1TimeToTime (const ASN1_TIME * t, + time_t * res); +int xmlSecOpenSSLX509NameToString (XMLSEC_OPENSSL400_CONST X509_NAME* name, + char* buf, + int bufLen); STACK_OF(X509)* xmlSecOpenSSLKeyDataX509GetCerts (xmlSecKeyDataPtr data); diff --git a/src/openssl/signatures_legacy.c b/src/openssl/signatures_legacy.c index 0c82bc81f..f6373c7e7 100644 --- a/src/openssl/signatures_legacy.c +++ b/src/openssl/signatures_legacy.c @@ -707,7 +707,7 @@ xmlSecOpenSSLSignatureLegacyEcdsa_OpenSSLToXmlDsig( xmlSecOpenSSLError("i2d_ECDSA_SIG", NULL); return(-1); } - outSize = (xmlSecSize)ret; + XMLSEC_SAFE_CAST_INT_TO_SIZE(ret, outSize, return(-1), NULL); ret = xmlSecBufferSetData(out, outData, outSize); if(ret < 0) { diff --git a/src/openssl/x509.c b/src/openssl/x509.c index 1988958f4..5c658f525 100644 --- a/src/openssl/x509.c +++ b/src/openssl/x509.c @@ -1877,47 +1877,77 @@ xmlSecOpenSSLX509CrlDerRead(const xmlSecByte* buf, xmlSecSize size) { return(res); } -void +int xmlSecOpenSSLX509NameToString(XMLSEC_OPENSSL400_CONST X509_NAME* name, char* buf, int bufLen) { - BIO* mem; + BIO* mem = NULL; char* data = NULL; long len; + size_t lenSize; + int res = -1; + + xmlSecAssert2(buf != NULL, -1); + xmlSecAssert2(bufLen > 0, -1); - if(buf == NULL || bufLen <= 0) { - return; - } buf[0] = '\0'; if(name == NULL) { - return; + /* no name: leave buf empty */ + return(0); } + mem = BIO_new(BIO_s_mem()); if(mem == NULL) { - return; + xmlSecOpenSSLError("BIO_new", NULL); + goto done; + } + if(X509_NAME_print_ex(mem, name, 0, XN_FLAG_RFC2253) <= 0) { + xmlSecOpenSSLError("X509_NAME_print_ex", NULL); + goto done; } - X509_NAME_print_ex(mem, name, 0, XN_FLAG_RFC2253); len = BIO_get_mem_data(mem, &data); - if(data != NULL && len > 0) { - if(len > bufLen - 1) { - len = bufLen - 1; - } - memcpy(buf, data, (size_t)len); - buf[len] = '\0'; + if((data == NULL) || (len <= 0)) { + xmlSecOpenSSLError("BIO_get_mem_data", NULL); + goto done; + } + + /* truncate the name if needed */ + if(len > bufLen - 1) { + len = bufLen - 1; } - BIO_free(mem); + XMLSEC_SAFE_CAST_LONG_TO_SIZE(len, lenSize, goto done, NULL); + memcpy(buf, data, lenSize); + buf[len] = '\0'; + + /* success */ + res = 0; + +done: + if(mem != NULL) { + BIO_free(mem); + } + return(res); } static void xmlSecOpenSSLX509CertDebugDump(X509* cert, FILE* output) { char buf[1024]; BIGNUM *bn = NULL; + int ret; xmlSecAssert(cert != NULL); xmlSecAssert(output != NULL); - xmlSecOpenSSLX509NameToString(X509_get_subject_name(cert), buf, sizeof(buf)); - fprintf(output, "==== Subject Name: %s\n", buf); - xmlSecOpenSSLX509NameToString(X509_get_issuer_name(cert), buf, sizeof(buf)); - fprintf(output, "==== Issuer Name: %s\n", buf); + ret = xmlSecOpenSSLX509NameToString(X509_get_subject_name(cert), buf, sizeof(buf)); + if(ret >= 0) { + fprintf(output, "==== Subject Name: %s\n", buf); + } else { + fprintf(output, "==== Subject Name: unknown\n"); + } + ret = xmlSecOpenSSLX509NameToString(X509_get_issuer_name(cert), buf, sizeof(buf)); + if(ret >= 0) { + fprintf(output, "==== Issuer Name: %s\n", buf); + } else { + fprintf(output, "==== Issuer Name: unknown\n"); + } fprintf(output, "==== Issuer Serial: "); bn = ASN1_INTEGER_to_BN(X509_get_serialNumber(cert),NULL); if(bn != NULL) { @@ -1934,19 +1964,24 @@ static void xmlSecOpenSSLX509CertDebugXmlDump(X509* cert, FILE* output) { char buf[1024]; BIGNUM *bn = NULL; + int ret; xmlSecAssert(cert != NULL); xmlSecAssert(output != NULL); fprintf(output, ""); - xmlSecOpenSSLX509NameToString(X509_get_subject_name(cert), buf, sizeof(buf)); - xmlSecPrintXmlString(output, BAD_CAST buf); + ret = xmlSecOpenSSLX509NameToString(X509_get_subject_name(cert), buf, sizeof(buf)); + if(ret >= 0) { + xmlSecPrintXmlString(output, BAD_CAST buf); + } fprintf(output, "\n"); fprintf(output, ""); - xmlSecOpenSSLX509NameToString(X509_get_issuer_name(cert), buf, sizeof(buf)); - xmlSecPrintXmlString(output, BAD_CAST buf); + ret = xmlSecOpenSSLX509NameToString(X509_get_issuer_name(cert), buf, sizeof(buf)); + if(ret >= 0) { + xmlSecPrintXmlString(output, BAD_CAST buf); + } fprintf(output, "\n"); fprintf(output, ""); diff --git a/src/openssl/x509vfy.c b/src/openssl/x509vfy.c index 6b378a83e..93df00625 100644 --- a/src/openssl/x509vfy.c +++ b/src/openssl/x509vfy.c @@ -374,8 +374,11 @@ xmlSecOpenSSLX509StoreVerifyAndCopyCrls(X509_STORE* xst, X509_STORE_CTX* xsc, ST sk_X509_CRL_free(verified_crls); return(-1); } else if (ret != 1) { - /* crl failed verification */ - continue; + /* crl failed verification: this is a hard failure because we expect CRLs to be valid */ + xmlSecOtherError(XMLSEC_ERRORS_R_CRL_VERIFY_FAILED, NULL, + "xmlSecOpenSSLX509VerifyCRL"); + sk_X509_CRL_free(verified_crls); + return(-1); } /* don't duplicate or up_ref the crl since we own * pointer to it */ @@ -480,7 +483,6 @@ xmlSecOpenSSLX509StoreVerifyCertAgainstRevoked(X509 * cert, STACK_OF(X509_REVOKE /* ret > 0: revocationDate is later than the verification time */ if (ret > 0) { XMLSEC_OPENSSL400_CONST X509_NAME *issuer; - char issuer_name[256]; time_t ts; /* revocationDate > certsVerificationTime, we are good */ @@ -491,9 +493,12 @@ xmlSecOpenSSLX509StoreVerifyCertAgainstRevoked(X509 * cert, STACK_OF(X509_REVOKE } issuer = X509_get_issuer_name(cert); if(issuer != NULL) { - xmlSecOpenSSLX509NameToString(issuer, issuer_name, sizeof(issuer_name)); + char issuer_name[256]; + ret = xmlSecOpenSSLX509NameToString(issuer, issuer_name, sizeof(issuer_name)); xmlSecOtherError3(XMLSEC_ERRORS_R_CRL_NOT_YET_VALID, NULL, - "issuer=%s; revocationDate=%lf", issuer_name, (double)ts); + "issuer=%s; revocationDate=%lf", + ((ret >= 0) ? issuer_name : "unknown"), + (double)ts); } else { xmlSecOtherError2(XMLSEC_ERRORS_R_CRL_NOT_YET_VALID, NULL, "revocationDate=%lf", (double)ts); @@ -637,11 +642,15 @@ xmlSecOpenSSLX509StoreVerifyCertAgainstCrls(STACK_OF(X509_CRL) *crls, X509* cert return(-1); } else if(ret != 1) { char subject[256], issuer[256]; + int retSubject, retIssuer; /* cert is revoked, fail */ - xmlSecOpenSSLX509NameToString(X509_get_subject_name(cert), subject, sizeof(subject)); - xmlSecOpenSSLX509NameToString(X509_get_issuer_name(cert), issuer, sizeof(issuer)); - xmlSecOtherError3(XMLSEC_ERRORS_R_CERT_REVOKED, NULL, "subject=%s; issuer=%s", subject, issuer); + retSubject = xmlSecOpenSSLX509NameToString(X509_get_subject_name(cert), subject, sizeof(subject)); + retIssuer = xmlSecOpenSSLX509NameToString(X509_get_issuer_name(cert), issuer, sizeof(issuer)); + xmlSecOtherError3(XMLSEC_ERRORS_R_CERT_REVOKED, NULL, + "subject=%s; issuer=%s", + ((retSubject >= 0) ? subject : "unknown"), + ((retIssuer >= 0) ? issuer : "unknown")); return(0); } @@ -764,33 +773,46 @@ xmlSecOpenSSLX509StoreVerifyCert(X509_STORE* xst, X509_STORE_CTX* xsc, X509* cer if((err != 0) && (err_cert != NULL)) { const char* err_msg; char subject[256], issuer[256]; + int retSubject, retIssuer; - xmlSecOpenSSLX509NameToString(X509_get_subject_name(err_cert), subject, sizeof(subject)); - xmlSecOpenSSLX509NameToString(X509_get_issuer_name(err_cert), issuer, sizeof(issuer)); + retSubject = xmlSecOpenSSLX509NameToString(X509_get_subject_name(err_cert), subject, sizeof(subject)); + retIssuer = xmlSecOpenSSLX509NameToString(X509_get_issuer_name(err_cert), issuer, sizeof(issuer)); err_msg = X509_verify_cert_error_string(err); switch (err) { case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: xmlSecOtherError5(XMLSEC_ERRORS_R_CERT_ISSUER_FAILED, NULL, - "subject=%s; issuer=%s; err=%d; msg=%s", - subject, issuer, err, xmlSecErrorsSafeString(err_msg)); + "subject=%s; issuer=%s; err=%d; msg=%s", + ((retSubject >= 0) ? subject : "unknown"), + ((retIssuer >= 0) ? issuer : "unknown"), + err, + xmlSecErrorsSafeString(err_msg)); break; case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: xmlSecOtherError5(XMLSEC_ERRORS_R_CERT_NOT_YET_VALID, NULL, - "subject=%s; issuer=%s; err=%d; msg=%s", - subject, issuer, err, xmlSecErrorsSafeString(err_msg)); + "subject=%s; issuer=%s; err=%d; msg=%s", + ((retSubject >= 0) ? subject : "unknown"), + ((retIssuer >= 0) ? issuer : "unknown"), + err, + xmlSecErrorsSafeString(err_msg)); break; case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: xmlSecOtherError5(XMLSEC_ERRORS_R_CERT_HAS_EXPIRED, NULL, - "subject=%s; issuer=%s; err=%d; msg=%s", - subject, issuer, err, xmlSecErrorsSafeString(err_msg)); + "subject=%s; issuer=%s; err=%d; msg=%s", + ((retSubject >= 0) ? subject : "unknown"), + ((retIssuer >= 0) ? issuer : "unknown"), + err, + xmlSecErrorsSafeString(err_msg)); break; default: xmlSecOtherError5(XMLSEC_ERRORS_R_CERT_VERIFY_FAILED, NULL, - "subject=%s; issuer=%s; err=%d; msg=%s", - subject, issuer, err, xmlSecErrorsSafeString(err_msg)); + "subject=%s; issuer=%s; err=%d; msg=%s", + ((retSubject >= 0) ? subject : "unknown"), + ((retIssuer >= 0) ? issuer : "unknown"), + err, + xmlSecErrorsSafeString(err_msg)); break; } } else if(err != 0) { @@ -1652,9 +1674,10 @@ xmlSecOpenSSLX509VerifyCRLTimeValidity(X509_CRL *crl, xmlSecKeyInfoCtx* keyInfoC if(ret > 0) { /* thisUpdate > verification_time: CRL not yet valid */ char issuer[256]; - xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); + + ret = xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); xmlSecOtherError2(XMLSEC_ERRORS_R_CRL_NOT_YET_VALID, NULL, - "issuer=%s", issuer); + "issuer=%s", ((ret >= 0) ? issuer : "unknown")); return(0); } } @@ -1669,8 +1692,10 @@ xmlSecOpenSSLX509VerifyCRLTimeValidity(X509_CRL *crl, xmlSecKeyInfoCtx* keyInfoC if(ret == 0) { /* nextUpdate is before or equal to verification_time: CRL expired */ char issuer[256]; - xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); - xmlSecOtherError2(XMLSEC_ERRORS_R_CRL_HAS_EXPIRED, NULL, "issuer=%s", issuer); + + ret = xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); + xmlSecOtherError2(XMLSEC_ERRORS_R_CRL_HAS_EXPIRED, NULL, + "issuer=%s", ((ret >= 0) ? issuer : "unknown")); return(0); } } @@ -1695,8 +1720,11 @@ xmlSecOpenSSLX509VerifyCRLSignature(X509_STORE* xst, X509_STORE_CTX* xsc, STACK_ issuer_cert = xmlSecOpenSSLX509FindIssuer(X509_CRL_get_issuer(crl), xst, xsc, untrusted, keyInfoCtx); if(issuer_cert == NULL) { char issuer[256]; - xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); - xmlSecOtherError2(XMLSEC_ERRORS_R_CERT_NOT_FOUND, NULL, "issuer=%s", issuer); + + ret = xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); + + xmlSecOtherError2(XMLSEC_ERRORS_R_CERT_NOT_FOUND, NULL, + "issuer=%s", ((ret >= 0) ? issuer : "unknown")); res = 0; /* not verified */ goto done; } @@ -1715,8 +1743,9 @@ xmlSecOpenSSLX509VerifyCRLSignature(X509_STORE* xst, X509_STORE_CTX* xsc, STACK_ char issuer[256]; /* the CRL signature was not verified */ - xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); - xmlSecOtherError2(XMLSEC_ERRORS_R_CRL_VERIFY_FAILED, NULL, "issuer=%s", issuer); + ret = xmlSecOpenSSLX509NameToString(X509_CRL_get_issuer(crl), issuer, sizeof(issuer)); + xmlSecOtherError2(XMLSEC_ERRORS_R_CRL_VERIFY_FAILED, NULL, + "issuer=%s", ((ret >= 0) ? issuer : "unknown")); /* not verified */ res = 0;