diff options
| author | jsing <> | 2014-06-05 16:08:11 +0000 | 
|---|---|---|
| committer | jsing <> | 2014-06-05 16:08:11 +0000 | 
| commit | c96d876c2d1f9d3c4c187c531cac4434ff3e905d (patch) | |
| tree | 79e0fbefcde08dad4706f7b69afa20a750537019 /src | |
| parent | bcda896309b794c3373608e890f68c962197c4a3 (diff) | |
| download | openbsd-c96d876c2d1f9d3c4c187c531cac4434ff3e905d.tar.gz openbsd-c96d876c2d1f9d3c4c187c531cac4434ff3e905d.tar.bz2 openbsd-c96d876c2d1f9d3c4c187c531cac4434ff3e905d.zip | |
ssl_sess_cert_new() can return NULL. Fix two cases where the return value
is unchecked, which would result in a later null pointer dereference.
While here, RSA_free, DH_free and EC_KEY_free all have implicit NULL
checks, so avoid repeating them here.
ok beck@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/s3_clnt.c | 25 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s3_clnt.c | 25 | 
2 files changed, 24 insertions, 26 deletions
| diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index 60a17ce11b..2b538f21b4 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -1136,7 +1136,6 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1136 | sc = ssl_sess_cert_new(); | 1136 | sc = ssl_sess_cert_new(); | 
| 1137 | if (sc == NULL) | 1137 | if (sc == NULL) | 
| 1138 | goto err; | 1138 | goto err; | 
| 1139 | |||
| 1140 | if (s->session->sess_cert) | 1139 | if (s->session->sess_cert) | 
| 1141 | ssl_sess_cert_free(s->session->sess_cert); | 1140 | ssl_sess_cert_free(s->session->sess_cert); | 
| 1142 | s->session->sess_cert = sc; | 1141 | s->session->sess_cert = sc; | 
| @@ -1252,6 +1251,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1252 | */ | 1251 | */ | 
| 1253 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { | 1252 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { | 
| 1254 | s->session->sess_cert = ssl_sess_cert_new(); | 1253 | s->session->sess_cert = ssl_sess_cert_new(); | 
| 1254 | if (s->session->sess_cert == NULL) | ||
| 1255 | goto err; | ||
| 1255 | free(s->ctx->psk_identity_hint); | 1256 | free(s->ctx->psk_identity_hint); | 
| 1256 | s->ctx->psk_identity_hint = NULL; | 1257 | s->ctx->psk_identity_hint = NULL; | 
| 1257 | } | 1258 | } | 
| @@ -1262,20 +1263,18 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1262 | 1263 | ||
| 1263 | param = p = (unsigned char *)s->init_msg; | 1264 | param = p = (unsigned char *)s->init_msg; | 
| 1264 | if (s->session->sess_cert != NULL) { | 1265 | if (s->session->sess_cert != NULL) { | 
| 1265 | if (s->session->sess_cert->peer_rsa_tmp != NULL) { | 1266 | RSA_free(s->session->sess_cert->peer_rsa_tmp); | 
| 1266 | RSA_free(s->session->sess_cert->peer_rsa_tmp); | 1267 | s->session->sess_cert->peer_rsa_tmp = NULL; | 
| 1267 | s->session->sess_cert->peer_rsa_tmp = NULL; | 1268 | |
| 1268 | } | 1269 | DH_free(s->session->sess_cert->peer_dh_tmp); | 
| 1269 | if (s->session->sess_cert->peer_dh_tmp) { | 1270 | s->session->sess_cert->peer_dh_tmp = NULL; | 
| 1270 | DH_free(s->session->sess_cert->peer_dh_tmp); | 1271 | |
| 1271 | s->session->sess_cert->peer_dh_tmp = NULL; | 1272 | EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp); | 
| 1272 | } | 1273 | s->session->sess_cert->peer_ecdh_tmp = NULL; | 
| 1273 | if (s->session->sess_cert->peer_ecdh_tmp) { | ||
| 1274 | EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp); | ||
| 1275 | s->session->sess_cert->peer_ecdh_tmp = NULL; | ||
| 1276 | } | ||
| 1277 | } else { | 1274 | } else { | 
| 1278 | s->session->sess_cert = ssl_sess_cert_new(); | 1275 | s->session->sess_cert = ssl_sess_cert_new(); | 
| 1276 | if (s->session->sess_cert == NULL) | ||
| 1277 | goto err; | ||
| 1279 | } | 1278 | } | 
| 1280 | 1279 | ||
| 1281 | param_len = 0; | 1280 | param_len = 0; | 
| diff --git a/src/lib/libssl/src/ssl/s3_clnt.c b/src/lib/libssl/src/ssl/s3_clnt.c index 60a17ce11b..2b538f21b4 100644 --- a/src/lib/libssl/src/ssl/s3_clnt.c +++ b/src/lib/libssl/src/ssl/s3_clnt.c | |||
| @@ -1136,7 +1136,6 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1136 | sc = ssl_sess_cert_new(); | 1136 | sc = ssl_sess_cert_new(); | 
| 1137 | if (sc == NULL) | 1137 | if (sc == NULL) | 
| 1138 | goto err; | 1138 | goto err; | 
| 1139 | |||
| 1140 | if (s->session->sess_cert) | 1139 | if (s->session->sess_cert) | 
| 1141 | ssl_sess_cert_free(s->session->sess_cert); | 1140 | ssl_sess_cert_free(s->session->sess_cert); | 
| 1142 | s->session->sess_cert = sc; | 1141 | s->session->sess_cert = sc; | 
| @@ -1252,6 +1251,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1252 | */ | 1251 | */ | 
| 1253 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { | 1252 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { | 
| 1254 | s->session->sess_cert = ssl_sess_cert_new(); | 1253 | s->session->sess_cert = ssl_sess_cert_new(); | 
| 1254 | if (s->session->sess_cert == NULL) | ||
| 1255 | goto err; | ||
| 1255 | free(s->ctx->psk_identity_hint); | 1256 | free(s->ctx->psk_identity_hint); | 
| 1256 | s->ctx->psk_identity_hint = NULL; | 1257 | s->ctx->psk_identity_hint = NULL; | 
| 1257 | } | 1258 | } | 
| @@ -1262,20 +1263,18 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1262 | 1263 | ||
| 1263 | param = p = (unsigned char *)s->init_msg; | 1264 | param = p = (unsigned char *)s->init_msg; | 
| 1264 | if (s->session->sess_cert != NULL) { | 1265 | if (s->session->sess_cert != NULL) { | 
| 1265 | if (s->session->sess_cert->peer_rsa_tmp != NULL) { | 1266 | RSA_free(s->session->sess_cert->peer_rsa_tmp); | 
| 1266 | RSA_free(s->session->sess_cert->peer_rsa_tmp); | 1267 | s->session->sess_cert->peer_rsa_tmp = NULL; | 
| 1267 | s->session->sess_cert->peer_rsa_tmp = NULL; | 1268 | |
| 1268 | } | 1269 | DH_free(s->session->sess_cert->peer_dh_tmp); | 
| 1269 | if (s->session->sess_cert->peer_dh_tmp) { | 1270 | s->session->sess_cert->peer_dh_tmp = NULL; | 
| 1270 | DH_free(s->session->sess_cert->peer_dh_tmp); | 1271 | |
| 1271 | s->session->sess_cert->peer_dh_tmp = NULL; | 1272 | EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp); | 
| 1272 | } | 1273 | s->session->sess_cert->peer_ecdh_tmp = NULL; | 
| 1273 | if (s->session->sess_cert->peer_ecdh_tmp) { | ||
| 1274 | EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp); | ||
| 1275 | s->session->sess_cert->peer_ecdh_tmp = NULL; | ||
| 1276 | } | ||
| 1277 | } else { | 1274 | } else { | 
| 1278 | s->session->sess_cert = ssl_sess_cert_new(); | 1275 | s->session->sess_cert = ssl_sess_cert_new(); | 
| 1276 | if (s->session->sess_cert == NULL) | ||
| 1277 | goto err; | ||
| 1279 | } | 1278 | } | 
| 1280 | 1279 | ||
| 1281 | param_len = 0; | 1280 | param_len = 0; | 
