ID:480 - Call EVP_CIPHER_CTX_free() instead of EVP_CIPHER_CTX_cleanup()

Call EVP_CIPHER_CTX_free() instead of EVP_CIPHER_CTX_cleanup() to fix memory
leak.
This commit is contained in:
Holger Liebig 2017-04-04 20:43:05 +02:00 committed by Zdenek Styblik
parent f004b4b719
commit 1664902525

View File

@ -165,13 +165,6 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
uint32_t * bytes_written) uint32_t * bytes_written)
{ {
EVP_CIPHER_CTX *ctx = NULL; EVP_CIPHER_CTX *ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL) {
*bytes_written = 0;
return;
}
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_set_padding(ctx, 0);
*bytes_written = 0; *bytes_written = 0;
@ -185,6 +178,14 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
printbuf(input, input_length, "encrypting this data"); printbuf(input, input_length, "encrypting this data");
} }
ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL) {
lprintf(LOG_DEBUG, "ERROR: EVP_CIPHER_CTX_new() failed");
return;
}
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_set_padding(ctx, 0);
/* /*
* The default implementation adds a whole block of padding if the input * The default implementation adds a whole block of padding if the input
@ -198,7 +199,6 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
{ {
/* Error */ /* Error */
*bytes_written = 0; *bytes_written = 0;
return;
} }
else else
{ {
@ -206,16 +206,17 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
if(!EVP_EncryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen)) if(!EVP_EncryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen))
{ {
/* Error */
*bytes_written = 0; *bytes_written = 0;
return; /* Error */
} }
else else
{ {
/* Success */ /* Success */
*bytes_written += tmplen; *bytes_written += tmplen;
EVP_CIPHER_CTX_cleanup(ctx);
} }
} }
/* performs cleanup and free */
EVP_CIPHER_CTX_free(ctx);
} }
@ -243,13 +244,6 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
uint32_t * bytes_written) uint32_t * bytes_written)
{ {
EVP_CIPHER_CTX *ctx = NULL; EVP_CIPHER_CTX *ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL) {
*bytes_written = 0;
return;
}
EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_set_padding(ctx, 0);
if (verbose >= 5) if (verbose >= 5)
{ {
@ -258,12 +252,20 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
printbuf(input, input_length, "decrypting this data"); printbuf(input, input_length, "decrypting this data");
} }
*bytes_written = 0; *bytes_written = 0;
if (input_length == 0) if (input_length == 0)
return; return;
ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL) {
lprintf(LOG_DEBUG, "ERROR: EVP_CIPHER_CTX_new() failed");
return;
}
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_set_padding(ctx, 0);
/* /*
* The default implementation adds a whole block of padding if the input * The default implementation adds a whole block of padding if the input
* data is perfectly aligned. We would like to keep that from happening. * data is perfectly aligned. We would like to keep that from happening.
@ -277,7 +279,6 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
/* Error */ /* Error */
lprintf(LOG_DEBUG, "ERROR: decrypt update failed"); lprintf(LOG_DEBUG, "ERROR: decrypt update failed");
*bytes_written = 0; *bytes_written = 0;
return;
} }
else else
{ {
@ -285,20 +286,21 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
if (!EVP_DecryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen)) if (!EVP_DecryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen))
{ {
/* Error */
char buffer[1000]; char buffer[1000];
ERR_error_string(ERR_get_error(), buffer); ERR_error_string(ERR_get_error(), buffer);
lprintf(LOG_DEBUG, "the ERR error %s", buffer); lprintf(LOG_DEBUG, "the ERR error %s", buffer);
lprintf(LOG_DEBUG, "ERROR: decrypt final failed"); lprintf(LOG_DEBUG, "ERROR: decrypt final failed");
*bytes_written = 0; *bytes_written = 0;
return; /* Error */
} }
else else
{ {
/* Success */ /* Success */
*bytes_written += tmplen; *bytes_written += tmplen;
EVP_CIPHER_CTX_cleanup(ctx);
} }
} }
/* performs cleanup and free */
EVP_CIPHER_CTX_free(ctx);
if (verbose >= 5) if (verbose >= 5)
{ {