72 lines
3.1 KiB
Diff
72 lines
3.1 KiB
Diff
From 7f699cb663741a73cfe95214d4a39a1078c94294 Mon Sep 17 00:00:00 2001
|
|
From: "Dr. David von Oheimb" <David.von.Oheimb@siemens.com>
|
|
Date: Wed, 3 Jun 2020 07:49:27 +0200
|
|
Subject: [PATCH 014/147] Fix err checking and mem leaks of BIO_set_conn_port
|
|
and BIO_set_conn_address
|
|
|
|
Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
|
|
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
|
|
(Merged from https://github.com/openssl/openssl/pull/12036)
|
|
---
|
|
crypto/bio/bss_conn.c | 25 ++++++++++++++++++-------
|
|
1 file changed, 18 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c
|
|
index f4c6b85..807a82b 100644
|
|
--- a/crypto/bio/bss_conn.c
|
|
+++ b/crypto/bio/bss_conn.c
|
|
@@ -416,12 +416,13 @@ static long conn_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|
case BIO_C_SET_CONNECT:
|
|
if (ptr != NULL) {
|
|
b->init = 1;
|
|
- if (num == 0) {
|
|
+ if (num == 0) { /* BIO_set_conn_hostname */
|
|
char *hold_service = data->param_service;
|
|
/* We affect the hostname regardless. However, the input
|
|
* string might contain a host:service spec, so we must
|
|
* parse it, which might or might not affect the service
|
|
*/
|
|
+
|
|
OPENSSL_free(data->param_hostname);
|
|
data->param_hostname = NULL;
|
|
ret = BIO_parse_hostserv(ptr,
|
|
@@ -430,19 +431,29 @@ static long conn_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|
BIO_PARSE_PRIO_HOST);
|
|
if (hold_service != data->param_service)
|
|
OPENSSL_free(hold_service);
|
|
- } else if (num == 1) {
|
|
+ } else if (num == 1) { /* BIO_set_conn_port */
|
|
OPENSSL_free(data->param_service);
|
|
- data->param_service = BUF_strdup(ptr);
|
|
- } else if (num == 2) {
|
|
+ if ((data->param_service = OPENSSL_strdup(ptr)) == NULL)
|
|
+ ret = 0;
|
|
+ } else if (num == 2) { /* BIO_set_conn_address */
|
|
const BIO_ADDR *addr = (const BIO_ADDR *)ptr;
|
|
+ char *host = BIO_ADDR_hostname_string(addr, 1);
|
|
+ char *service = BIO_ADDR_service_string(addr, 1);
|
|
+
|
|
+ ret = host != NULL && service != NULL;
|
|
if (ret) {
|
|
- data->param_hostname = BIO_ADDR_hostname_string(addr, 1);
|
|
- data->param_service = BIO_ADDR_service_string(addr, 1);
|
|
+ OPENSSL_free(data->param_hostname);
|
|
+ data->param_hostname = host;
|
|
+ OPENSSL_free(data->param_service);
|
|
+ data->param_service = service;
|
|
BIO_ADDRINFO_free(data->addr_first);
|
|
data->addr_first = NULL;
|
|
data->addr_iter = NULL;
|
|
+ } else {
|
|
+ OPENSSL_free(host);
|
|
+ OPENSSL_free(service);
|
|
}
|
|
- } else if (num == 3) {
|
|
+ } else if (num == 3) { /* BIO_set_conn_ip_family */
|
|
data->connect_family = *(int *)ptr;
|
|
} else {
|
|
ret = 0;
|
|
--
|
|
1.8.3.1
|
|
|