On Fri, Nov 07, 2025 at 10:03:30AM +0100, Michal Prívozník wrote:
> On 11/6/25 15:50, Daniel P. Berrangé via Devel wrote:
> > From: Daniel P. Berrangé <[email protected]>
> > 
> > Future patches will make it possible to load multiple certificate
> > files. This prepares the sanity checking code to support that by
> > taking a NUL terminated array of cert filenames.
> > 
> > Signed-off-by: Daniel P. Berrangé <[email protected]>
> > ---
> >  src/rpc/virnettlscert.c    | 35 ++++++++++++++++++++++-------------
> >  src/rpc/virnettlscert.h    |  2 +-
> >  src/rpc/virnettlscontext.c |  6 ++++--
> >  tools/virt-pki-validate.c  |  3 ++-
> >  4 files changed, 29 insertions(+), 17 deletions(-)
> > 
> > diff --git a/src/rpc/virnettlscert.c b/src/rpc/virnettlscert.c
> > index 3efc4f0716..6f20b2601b 100644
> > --- a/src/rpc/virnettlscert.c
> > +++ b/src/rpc/virnettlscert.c
> > @@ -440,40 +440,49 @@ int virNetTLSCertLoadListFromFile(const char 
> > *certFile,
> >  #define MAX_CERTS 16
> >  int virNetTLSCertSanityCheck(bool isServer,
> >                               const char *cacertFile,
> > -                             const char *certFile)
> > +                             const char *const *certFiles)
> >  {
> > -    gnutls_x509_crt_t cert = NULL;
> > +    gnutls_x509_crt_t *certs = NULL;
> 
> This ^^ needs to be g_autofree so that it doesn't leak.

I'll do a manual free for this one - since we have to manually
free the elements, IMHO it would be confusing to have a mix
of manual free and auto-free.

> 
> >      gnutls_x509_crt_t cacerts[MAX_CERTS] = { 0 };
> >      size_t ncacerts = 0;
> >      size_t i;
> >      int ret = -1;
> >  
> > -    if ((access(certFile, R_OK) == 0) &&
> > -        !(cert = virNetTLSCertLoadFromFile(certFile, isServer)))
> > -        goto cleanup;
> > +    certs = g_new0(gnutls_x509_crt_t, g_strv_length((gchar **)certFiles));
> > +    for (i = 0; certFiles[i] != NULL; i++) {
> > +        if ((access(certFiles[i], R_OK) == 0) &&
> > +            !(certs[i] = virNetTLSCertLoadFromFile(certFiles[i], 
> > isServer)))
> > +            goto cleanup;
> > +    }
> >      if ((access(cacertFile, R_OK) == 0) &&
> >          virNetTLSCertLoadListFromFile(cacertFile, cacerts,
> >                                        MAX_CERTS, &ncacerts) < 0)
> >          goto cleanup;
> >  
> > -    if (cert &&
> > -        virNetTLSCertCheck(cert, certFile, isServer, false) < 0)
> > -        goto cleanup;
> > +    for (i = 0; certFiles[i] != NULL; i++) {
> > +        if (certs[i] &&
> > +            virNetTLSCertCheck(certs[i], certFiles[i], isServer, false) < 
> > 0)
> > +            goto cleanup;
> > +    }
> >  
> >      for (i = 0; i < ncacerts; i++) {
> >          if (virNetTLSCertCheck(cacerts[i], cacertFile, isServer, true) < 0)
> >              goto cleanup;
> >      }
> >  
> > -    if (cert && ncacerts &&
> > -        virNetTLSCertCheckPair(cert, certFile, cacerts, ncacerts, 
> > cacertFile, isServer) < 0)
> > -        goto cleanup;
> > +    for (i = 0; certFiles[i] != NULL && ncacerts; i++) {
> > +        if (certs[i] && ncacerts &&
> > +            virNetTLSCertCheckPair(certs[i], certFiles[i], cacerts, 
> > ncacerts, cacertFile, isServer) < 0)
> > +            goto cleanup;
> > +    }
> >  
> >      ret = 0;
> >  
> >   cleanup:
> > -    if (cert)
> > -        gnutls_x509_crt_deinit(cert);
> > +    for (i = 0; certFiles[i] != NULL; i++) {
> > +        if (certs[i])
> > +            gnutls_x509_crt_deinit(certs[i]);
> > +    }
> >      for (i = 0; i < ncacerts; i++)
> >          gnutls_x509_crt_deinit(cacerts[i]);
> >      return ret;
> 
> Michal
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Reply via email to