Improve error handling in backend OpenSSL implementation
authorMagnus Hagander <magnus@hagander.net>
Tue, 3 Nov 2020 08:55:51 +0000 (09:55 +0100)
committerMagnus Hagander <magnus@hagander.net>
Tue, 3 Nov 2020 08:55:51 +0000 (09:55 +0100)
Commit d94c36a45ab introduced error handling to sslinfo to handle
OpenSSL errors gracefully. This ports this errorhandling to the
backend TLS implementation.

Author: Daniel Gustafsson <daniel@yesql.se>

src/backend/libpq/be-secure-openssl.c

index 8b21ff4065c54c181d4854869a363d0a2fa3c85b..9231a1470cf4b7cb2e9610107d8549f82fd700fc 100644 (file)
@@ -1298,15 +1298,28 @@ X509_NAME_to_cstring(X509_NAME *name)
        char       *dp;
        char       *result;
 
+       if (membuf == NULL)
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("failed to create BIO")));
+
        (void) BIO_set_close(membuf, BIO_CLOSE);
        for (i = 0; i < count; i++)
        {
                e = X509_NAME_get_entry(name, i);
                nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e));
+               if (nid == NID_undef)
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                                        errmsg("could not get NID for ASN1_OBJECT object")));
                v = X509_NAME_ENTRY_get_data(e);
                field_name = OBJ_nid2sn(nid);
-               if (!field_name)
+               if (field_name == NULL)
                        field_name = OBJ_nid2ln(nid);
+               if (field_name == NULL)
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                                        errmsg("could not convert NID %d to an ASN1_OBJECT structure", nid)));
                BIO_printf(membuf, "/%s=", field_name);
                ASN1_STRING_print_ex(membuf, v,
                                                         ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB)
@@ -1322,7 +1335,8 @@ X509_NAME_to_cstring(X509_NAME *name)
        result = pstrdup(dp);
        if (dp != sp)
                pfree(dp);
-       BIO_free(membuf);
+       if (BIO_free(membuf) != 1)
+               elog(ERROR, "could not free OpenSSL BIO structure");
 
        return result;
 }