hc
2024-07-16 5fbd6e2385615a225453562361c4bdab3b15fda1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
From d9d6e0bff831da03f4448f0cdb82fc3d143662c8 Mon Sep 17 00:00:00 2001
From: Holger Liebig <holger.liebig@ts.fujitsu.com>
Date: Tue, 4 Apr 2017 20:43:05 +0200
Subject: [PATCH] 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.
 
Upstream: https://github.com/ipmitool/ipmitool/commit/1664902525a1c3771b4d8b3ccab7ea1ba6b2bdd1
 
Signed-off-by: Matthew Weber <matthew.weber@rockwellcollins.com>
---
 src/plugins/lanplus/lanplus_crypt_impl.c | 44 +++++++++++++++++---------------
 1 file changed, 23 insertions(+), 21 deletions(-)
 
diff --git a/src/plugins/lanplus/lanplus_crypt_impl.c b/src/plugins/lanplus/lanplus_crypt_impl.c
index 0e330c1..9652a5e 100644
--- a/src/plugins/lanplus/lanplus_crypt_impl.c
+++ b/src/plugins/lanplus/lanplus_crypt_impl.c
@@ -165,13 +165,6 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
                             uint32_t        * bytes_written)
 {
     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;
 
@@ -185,6 +178,14 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
         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
@@ -198,7 +199,6 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
     {
         /* Error */
         *bytes_written = 0;
-        return;
     }
     else
     {
@@ -206,16 +206,17 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv,
 
         if(!EVP_EncryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen))
         {
+            /* Error */
             *bytes_written = 0;
-            return; /* Error */
         }
         else
         {
             /* Success */
             *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)
 {
     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)
     {
@@ -258,12 +252,20 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
         printbuf(input, input_length, "decrypting this data");
     }
 
-
     *bytes_written = 0;
 
     if (input_length == 0)
         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
      * 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 */
         lprintf(LOG_DEBUG, "ERROR: decrypt update failed");
         *bytes_written = 0;
-        return;
     }
     else
     {
@@ -285,20 +286,21 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
 
         if (!EVP_DecryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen))
         {
+            /* Error */
             char buffer[1000];
             ERR_error_string(ERR_get_error(), buffer);
             lprintf(LOG_DEBUG, "the ERR error %s", buffer);
             lprintf(LOG_DEBUG, "ERROR: decrypt final failed");
             *bytes_written = 0;
-            return; /* Error */
         }
         else
         {
             /* Success */
             *bytes_written += tmplen;
-            EVP_CIPHER_CTX_cleanup(ctx);
         }
     }
+    /* performs cleanup and free */
+    EVP_CIPHER_CTX_free(ctx);
 
     if (verbose >= 5)
     {
-- 
1.9.1