Plug potential memory leak.
[openssl.git] / crypto / pem / pem_lib.c
index 52a36dc00dd1355a994a67610b26a0e6a21077c2..bfc43e90afea5e16aa1ccd3ea8414560bb6c0ba8 100644 (file)
@@ -193,7 +193,7 @@ static int check_pem(const char *nm, const char *name)
        if(!strcmp(nm,PEM_STRING_DSA) &&
                 !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
 
-       if(!strcmp(nm,PEM_STRING_ECDSA) &&
+       if(!strcmp(nm,PEM_STRING_ECPRIVATEKEY) &&
                 !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
        /* Permit older strings */
 
@@ -251,7 +251,7 @@ int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char
        ret = 1;
 
 err:
-       if (!pnm) OPENSSL_free(nm);
+       if (!ret || !pnm) OPENSSL_free(nm);
        OPENSSL_free(header);
        if (!ret) OPENSSL_free(data);
        return ret;
@@ -335,7 +335,7 @@ int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x,
                        kstr=(unsigned char *)buf;
                        }
                RAND_add(data,i,0);/* put in the RSA key. */
-               if (RAND_pseudo_bytes(iv,8) < 0)        /* Generate a salt */
+               if (RAND_pseudo_bytes(iv,enc->iv_len) < 0) /* Generate a salt */
                        goto err;
                /* The 'iv' is used as the iv and as a salt.  It is
                 * NOT taken from the BytesToKey function */
@@ -345,7 +345,7 @@ int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x,
 
                buf[0]='\0';
                PEM_proc_type(buf,PEM_TYPE_ENCRYPTED);
-               PEM_dek_info(buf,objstr,8,(char *)iv);
+               PEM_dek_info(buf,objstr,enc->iv_len,(char *)iv);
                /* k=strlen(buf); */
 
                EVP_CIPHER_CTX_init(&ctx);
@@ -368,8 +368,11 @@ err:
        memset(iv,0,sizeof(iv));
        memset((char *)&ctx,0,sizeof(ctx));
        memset(buf,0,PEM_BUFSIZE);
-       memset(data,0,(unsigned int)dsize);
-       OPENSSL_free(data);
+       if (data != NULL)
+               {
+               memset(data,0,(unsigned int)dsize);
+               OPENSSL_free(data);
+               }
        return(ret);
        }
 
@@ -471,7 +474,7 @@ int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher)
                PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO,PEM_R_UNSUPPORTED_ENCRYPTION);
                return(0);
                }
-       if (!load_iv((unsigned char **)&header,&(cipher->iv[0]),8)) return(0);
+       if (!load_iv((unsigned char **)&header,&(cipher->iv[0]),enc->iv_len)) return(0);
 
        return(1);
        }