Fix memory leak.
[openssl.git] / apps / pkcs12.c
index dd0d29bfaad48b9d369dc7b2a11a8f1a4ce46eb8..e08d75b265fb346778ca40ebfc51d0aee546fe56 100644 (file)
@@ -665,9 +665,10 @@ int MAIN(int argc, char **argv)
 int dump_certs_keys_p12 (BIO *out, PKCS12 *p12, char *pass,
             int passlen, int options, char *pempass)
 {
-       STACK_OF(PKCS7) *asafes;
+       STACK_OF(PKCS7) *asafes = NULL;
        STACK_OF(PKCS12_SAFEBAG) *bags;
        int i, bagnid;
+       int ret = 0;
        PKCS7 *p7;
 
        if (!( asafes = PKCS12_unpack_authsafes(p12))) return 0;
@@ -685,16 +686,22 @@ int dump_certs_keys_p12 (BIO *out, PKCS12 *p12, char *pass,
                        }
                        bags = PKCS12_unpack_p7encdata(p7, pass, passlen);
                } else continue;
-               if (!bags) return 0;
+               if (!bags) goto err;
                if (!dump_certs_pkeys_bags (out, bags, pass, passlen, 
                                                 options, pempass)) {
                        sk_PKCS12_SAFEBAG_pop_free (bags, PKCS12_SAFEBAG_free);
-                       return 0;
+                       goto err;
                }
                sk_PKCS12_SAFEBAG_pop_free (bags, PKCS12_SAFEBAG_free);
+               bags = NULL;
        }
-       sk_PKCS7_pop_free (asafes, PKCS7_free);
-       return 1;
+       ret = 1;
+
+       err:
+
+       if (asafes)
+               sk_PKCS7_pop_free (asafes, PKCS7_free);
+       return ret;
 }
 
 int dump_certs_pkeys_bags (BIO *out, STACK_OF(PKCS12_SAFEBAG) *bags,