提交 c20e3b28 编写于 作者: M Matt Caswell

Fix mem leak in sslapi test

The recent change in behaviour where you do not get a NewSessionTicket
message sent if you established the connection using a PSK caused a mem
leak to be triggered in sslapitest. It was actually a latent bug and we
were just lucky we never hit it before. The problem is due to complexity
with the way PSK sessions were set up in the early_data tests. PSK session
reference counting was handled differently to normal session reference
counting. This meant there were lots of special cases in the code where
we don't free a session if it is a PSK. It makes things easier if we just
handle PSK reference counts in the same way as other session reference
counts, and then we can remove all of the special case code.
Reviewed-by: NViktor Dukhovni <viktor@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6198)
上级 d0191fe0
......@@ -1769,8 +1769,15 @@ static int setupearly_data_test(SSL_CTX **cctx, SSL_CTX **sctx, SSL **clientssl,
}
serverpsk = clientpsk;
if (sess != NULL)
if (sess != NULL) {
if (!TEST_true(SSL_SESSION_up_ref(clientpsk))) {
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
return 0;
}
*sess = clientpsk;
}
return 1;
}
......@@ -1939,9 +1946,7 @@ static int test_early_data_read_write(int idx)
|| !TEST_mem_eq(buf, readbytes, MSG7, strlen(MSG7)))
goto end;
/* We keep the PSK session around if using PSK */
if (idx != 2)
SSL_SESSION_free(sess);
SSL_SESSION_free(sess);
sess = SSL_get1_session(clientssl);
use_session_cb_cnt = 0;
find_session_cb_cnt = 0;
......@@ -1991,8 +1996,7 @@ static int test_early_data_read_write(int idx)
testresult = 1;
end:
if (sess != clientpsk)
SSL_SESSION_free(sess);
SSL_SESSION_free(sess);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
......@@ -2043,8 +2047,7 @@ static int test_early_data_replay(int idx)
testresult = 1;
end:
if (sess != clientpsk)
SSL_SESSION_free(sess);
SSL_SESSION_free(sess);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
......@@ -2131,8 +2134,7 @@ static int early_data_skip_helper(int hrr, int idx)
testresult = 1;
end:
if (sess != clientpsk)
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
SSL_SESSION_free(sess);
......@@ -2219,8 +2221,8 @@ static int test_early_data_not_sent(int idx)
testresult = 1;
end:
/* If using PSK then clientpsk and sess are the same */
SSL_SESSION_free(sess);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
SSL_free(serverssl);
......@@ -2428,6 +2430,7 @@ static int test_early_data_psk(int idx)
testresult = 1;
end:
SSL_SESSION_free(sess);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
......@@ -2485,8 +2488,8 @@ static int test_early_data_not_expected(int idx)
testresult = 1;
end:
/* If using PSK then clientpsk and sess are the same */
SSL_SESSION_free(sess);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
SSL_free(serverssl);
......@@ -2559,7 +2562,6 @@ static int test_early_data_tls1_2(int idx)
testresult = 1;
end:
/* If using PSK then clientpsk and sess are the same */
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
......@@ -3705,8 +3707,7 @@ static int test_export_key_mat_early(int idx)
testresult = 1;
end:
if (sess != clientpsk)
SSL_SESSION_free(sess);
SSL_SESSION_free(sess);
SSL_SESSION_free(clientpsk);
SSL_SESSION_free(serverpsk);
clientpsk = serverpsk = NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册