A tiny patch for a giant function. This kind of looks right, based on
some other examples in the function, but it's hard to say for sure
since this one function (X509_verify_cert; is that important?) has
about a dozen different exit points which free or don't free any
number of variables, stacks, chains, etc.

Index: x509_vfy.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/x509/x509_vfy.c,v
retrieving revision 1.27
diff -u -p -r1.27 x509_vfy.c
--- x509_vfy.c  12 Jun 2014 15:49:31 -0000      1.27
+++ x509_vfy.c  18 Jun 2014 18:09:51 -0000
@@ -313,7 +313,11 @@ X509_verify_cert(X509_STORE_CTX *ctx)
                        ctx->current_cert = x;
                } else {
 
-                       sk_X509_push(ctx->chain, chain_ss);
+                       if (!sk_X509_push(ctx->chain, chain_ss)) {
+                               X509_free(chain_ss);
+                               X509err(X509_F_X509_VERIFY_CERT, 
ERR_R_MALLOC_FAILURE);
+                               return 0;
+                       }
                        num++;
                        ctx->last_untrusted = num;
                        ctx->current_cert = chain_ss;

Reply via email to