There is no need to make a deep copy of the certificate that was
deserialized as part of the d2i_CMS_ContentInfo() call. We can as
well keep a reference to it.

While X509_dup() can actually fail, X509_up_ref() can't. It seems
cleaner to have a check.

Index: cms.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/cms.c,v
retrieving revision 1.20
diff -u -p -r1.20 cms.c
--- cms.c       31 May 2022 18:41:43 -0000      1.20
+++ cms.c       10 Aug 2022 14:33:02 -0000
@@ -222,7 +222,11 @@ cms_parse_validate(X509 **xp, const char
                    "want 1 signer, have %d", fn, sk_X509_num(certs));
                goto out;
        }
-       *xp = X509_dup(sk_X509_value(certs, 0));
+       *xp = sk_X509_value(certs, 0);
+       if (!X509_up_ref(*xp)) {
+               *xp = NULL;
+               goto out;
+       }
 
        /* Cache X509v3 extensions, see X509_check_ca(3). */
        if (X509_check_purpose(*xp, -1, -1) <= 0) {

Reply via email to