|
commit 30cd01cbfd40201f3abe246216a85c69352aa79c
|
|
Author: Emeric Brun <ebrun@haproxy.com>
|
|
Date: Thu Jan 10 10:51:13 2019 +0100
|
|
|
|
BUG/MEDIUM: ssl: missing allocation failure checks loading tls key file
|
|
|
|
This patch fixes missing allocation checks loading tls key file
|
|
and avoid memory leak in some error cases.
|
|
|
|
This patch should be backport on branches 1.9 and 1.8
|
|
|
|
(cherry picked from commit 09852f70e0ed0f23cf9287b1ce55bb6a60112f32)
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
(cherry picked from commit a1dc55a63cfbc8f440b72b6def3957bf1fad12b2)
|
|
Signed-off-by: William Lallemand <wlallemand@haproxy.org>
|
|
|
|
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
|
|
index 11655533..7884c411 100644
|
|
--- a/src/ssl_sock.c
|
|
+++ b/src/ssl_sock.c
|
|
@@ -7627,15 +7627,36 @@ static int bind_parse_tls_ticket_keys(char **args, int cur_arg, struct proxy *px
|
|
}
|
|
|
|
keys_ref = malloc(sizeof(*keys_ref));
|
|
+ if (!keys_ref) {
|
|
+ if (err)
|
|
+ memprintf(err, "'%s' : allocation error", args[cur_arg+1]);
|
|
+ return ERR_ALERT | ERR_FATAL;
|
|
+ }
|
|
+
|
|
keys_ref->tlskeys = malloc(TLS_TICKETS_NO * sizeof(struct tls_sess_key));
|
|
+ if (!keys_ref->tlskeys) {
|
|
+ free(keys_ref);
|
|
+ if (err)
|
|
+ memprintf(err, "'%s' : allocation error", args[cur_arg+1]);
|
|
+ return ERR_ALERT | ERR_FATAL;
|
|
+ }
|
|
|
|
if ((f = fopen(args[cur_arg + 1], "r")) == NULL) {
|
|
+ free(keys_ref->tlskeys);
|
|
+ free(keys_ref);
|
|
if (err)
|
|
memprintf(err, "'%s' : unable to load ssl tickets keys file", args[cur_arg+1]);
|
|
return ERR_ALERT | ERR_FATAL;
|
|
}
|
|
|
|
keys_ref->filename = strdup(args[cur_arg + 1]);
|
|
+ if (!keys_ref->filename) {
|
|
+ free(keys_ref->tlskeys);
|
|
+ free(keys_ref);
|
|
+ if (err)
|
|
+ memprintf(err, "'%s' : allocation error", args[cur_arg+1]);
|
|
+ return ERR_ALERT | ERR_FATAL;
|
|
+ }
|
|
|
|
while (fgets(thisline, sizeof(thisline), f) != NULL) {
|
|
int len = strlen(thisline);
|
|
@@ -7647,6 +7668,9 @@ static int bind_parse_tls_ticket_keys(char **args, int cur_arg, struct proxy *px
|
|
thisline[--len] = 0;
|
|
|
|
if (base64dec(thisline, len, (char *) (keys_ref->tlskeys + i % TLS_TICKETS_NO), sizeof(struct tls_sess_key)) != sizeof(struct tls_sess_key)) {
|
|
+ free(keys_ref->filename);
|
|
+ free(keys_ref->tlskeys);
|
|
+ free(keys_ref);
|
|
if (err)
|
|
memprintf(err, "'%s' : unable to decode base64 key on line %d", args[cur_arg+1], i + 1);
|
|
fclose(f);
|
|
@@ -7656,6 +7680,9 @@ static int bind_parse_tls_ticket_keys(char **args, int cur_arg, struct proxy *px
|
|
}
|
|
|
|
if (i < TLS_TICKETS_NO) {
|
|
+ free(keys_ref->filename);
|
|
+ free(keys_ref->tlskeys);
|
|
+ free(keys_ref);
|
|
if (err)
|
|
memprintf(err, "'%s' : please supply at least %d keys in the tls-tickets-file", args[cur_arg+1], TLS_TICKETS_NO);
|
|
fclose(f);
|