diff options
Diffstat (limited to 'src/lib/libssl/s23_clnt.c')
-rw-r--r-- | src/lib/libssl/s23_clnt.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c index 019e9aecee..64ee4269ec 100644 --- a/src/lib/libssl/s23_clnt.c +++ b/src/lib/libssl/s23_clnt.c | |||
@@ -87,18 +87,25 @@ SSL_METHOD *SSLv23_client_method(void) | |||
87 | 87 | ||
88 | if (init) | 88 | if (init) |
89 | { | 89 | { |
90 | memcpy((char *)&SSLv23_client_data, | 90 | CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD); |
91 | (char *)sslv23_base_method(),sizeof(SSL_METHOD)); | 91 | |
92 | SSLv23_client_data.ssl_connect=ssl23_connect; | 92 | if (init) |
93 | SSLv23_client_data.get_ssl_method=ssl23_get_client_method; | 93 | { |
94 | init=0; | 94 | memcpy((char *)&SSLv23_client_data, |
95 | (char *)sslv23_base_method(),sizeof(SSL_METHOD)); | ||
96 | SSLv23_client_data.ssl_connect=ssl23_connect; | ||
97 | SSLv23_client_data.get_ssl_method=ssl23_get_client_method; | ||
98 | init=0; | ||
99 | } | ||
100 | |||
101 | CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD); | ||
95 | } | 102 | } |
96 | return(&SSLv23_client_data); | 103 | return(&SSLv23_client_data); |
97 | } | 104 | } |
98 | 105 | ||
99 | int ssl23_connect(SSL *s) | 106 | int ssl23_connect(SSL *s) |
100 | { | 107 | { |
101 | BUF_MEM *buf; | 108 | BUF_MEM *buf=NULL; |
102 | unsigned long Time=time(NULL); | 109 | unsigned long Time=time(NULL); |
103 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 110 | void (*cb)(const SSL *ssl,int type,int val)=NULL; |
104 | int ret= -1; | 111 | int ret= -1; |
@@ -152,6 +159,7 @@ int ssl23_connect(SSL *s) | |||
152 | goto end; | 159 | goto end; |
153 | } | 160 | } |
154 | s->init_buf=buf; | 161 | s->init_buf=buf; |
162 | buf=NULL; | ||
155 | } | 163 | } |
156 | 164 | ||
157 | if (!ssl3_setup_buffers(s)) { ret= -1; goto end; } | 165 | if (!ssl3_setup_buffers(s)) { ret= -1; goto end; } |
@@ -200,6 +208,8 @@ int ssl23_connect(SSL *s) | |||
200 | } | 208 | } |
201 | end: | 209 | end: |
202 | s->in_handshake--; | 210 | s->in_handshake--; |
211 | if (buf != NULL) | ||
212 | BUF_MEM_free(buf); | ||
203 | if (cb != NULL) | 213 | if (cb != NULL) |
204 | cb(s,SSL_CB_CONNECT_EXIT,ret); | 214 | cb(s,SSL_CB_CONNECT_EXIT,ret); |
205 | return(ret); | 215 | return(ret); |
@@ -363,7 +373,7 @@ static int ssl23_get_server_hello(SSL *s) | |||
363 | 373 | ||
364 | if (s->s3 != NULL) ssl3_free(s); | 374 | if (s->s3 != NULL) ssl3_free(s); |
365 | 375 | ||
366 | if (!BUF_MEM_grow(s->init_buf, | 376 | if (!BUF_MEM_grow_clean(s->init_buf, |
367 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) | 377 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) |
368 | { | 378 | { |
369 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB); | 379 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB); |