Move CIPHER_CTX cleanups to _Final routines instead of _Init, which avoids
authorBen Laurie <ben@openssl.org>
Sat, 11 Aug 2001 11:32:54 +0000 (11:32 +0000)
committerBen Laurie <ben@openssl.org>
Sat, 11 Aug 2001 11:32:54 +0000 (11:32 +0000)
problems with leaks and uninitialised structures.

crypto/evp/evp_enc.c

index e3ed556f2610dabd1c82aa1daf109ecd737ebc46..9abb9855ff4ecdfd30a96c84bc2ed7d7fc789f29 100644 (file)
@@ -78,8 +78,6 @@ int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
        if(enc && (enc != -1)) enc = 1;
        if (cipher)
                {
        if(enc && (enc != -1)) enc = 1;
        if (cipher)
                {
-               if(ctx->cipher)
-                       EVP_CIPHER_CTX_cleanup(ctx);
                ctx->cipher=cipher;
                ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
                ctx->key_len = cipher->key_len;
                ctx->cipher=cipher;
                ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
                ctx->key_len = cipher->key_len;
@@ -219,7 +217,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
 
 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
        {
 
 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
        {
-       int i,n,b,bl;
+       int i,n,b,bl,ret;
 
        b=ctx->cipher->block_size;
        if (b == 1)
 
        b=ctx->cipher->block_size;
        if (b == 1)
@@ -230,6 +228,7 @@ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
        bl=ctx->buf_len;
        if (ctx->flags & EVP_CIPH_NO_PADDING)
                {
        bl=ctx->buf_len;
        if (ctx->flags & EVP_CIPH_NO_PADDING)
                {
+               EVP_CIPHER_CTX_cleanup(ctx);
                if(bl)
                        {
                        EVPerr(EVP_F_EVP_ENCRYPTFINAL,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
                if(bl)
                        {
                        EVPerr(EVP_F_EVP_ENCRYPTFINAL,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
@@ -238,12 +237,18 @@ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
                *outl = 0;
                return 1;
                }
                *outl = 0;
                return 1;
                }
+
        n=b-bl;
        for (i=bl; i<b; i++)
                ctx->buf[i]=n;
        n=b-bl;
        for (i=bl; i<b; i++)
                ctx->buf[i]=n;
-       if(!ctx->cipher->do_cipher(ctx,out,ctx->buf,b)) return 0;
-       *outl=b;
-       return 1;
+       ret=ctx->cipher->do_cipher(ctx,out,ctx->buf,b);
+
+       EVP_CIPHER_CTX_cleanup(ctx);
+
+       if(ret)
+               *outl=b;
+
+       return ret;
        }
 
 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
        }
 
 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,