diff options
Diffstat (limited to 'main/openssl/ssl/ssl_lib.c')
| -rw-r--r-- | main/openssl/ssl/ssl_lib.c | 46 | 
1 files changed, 25 insertions, 21 deletions
| diff --git a/main/openssl/ssl/ssl_lib.c b/main/openssl/ssl/ssl_lib.c index eb1ae782..3ea817ab 100644 --- a/main/openssl/ssl/ssl_lib.c +++ b/main/openssl/ssl/ssl_lib.c @@ -402,13 +402,7 @@ SSL *SSL_new(SSL_CTX *ctx)  	return(s);  err:  	if (s != NULL) -		{ -		if (s->cert != NULL) -			ssl_cert_free(s->cert); -		if (s->ctx != NULL) -			SSL_CTX_free(s->ctx); /* decrement reference count */ -		OPENSSL_free(s); -		} +		SSL_free(s);  	SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);  	return(NULL);  	} @@ -1108,19 +1102,6 @@ long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)  		l=s->max_cert_list;  		s->max_cert_list=larg;  		return(l); -	case SSL_CTRL_SET_MTU: -#ifndef OPENSSL_NO_DTLS1 -		if (larg < (long)dtls1_min_mtu()) -			return 0; -#endif - -		if (SSL_version(s) == DTLS1_VERSION || -		    SSL_version(s) == DTLS1_BAD_VER) -			{ -			s->d1->mtu = larg; -			return larg; -			} -		return 0;  	case SSL_CTRL_SET_MAX_SEND_FRAGMENT:  		if (larg < 512 || larg > SSL3_RT_MAX_PLAIN_LENGTH)  			return 0; @@ -1561,6 +1542,7 @@ STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,  					ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INAPPROPRIATE_FALLBACK);  				goto err;  				} +			p += n;  			continue;  			} @@ -2245,7 +2227,7 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)  #ifdef CIPHER_DEBUG -	printf("rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n", +	fprintf(stderr,"rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",  	        rsa_tmp,rsa_tmp_export,dh_tmp,have_ecdh_tmp,  		rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);  #endif @@ -3154,10 +3136,32 @@ SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx)  	if (ssl->cert != NULL)  		ssl_cert_free(ssl->cert);  	ssl->cert = ssl_cert_dup(ctx->cert); + +	/* +	 * Program invariant: |sid_ctx| has fixed size (SSL_MAX_SID_CTX_LENGTH), +	 * so setter APIs must prevent invalid lengths from entering the system. +	 */ +	OPENSSL_assert(ssl->sid_ctx_length <= sizeof(ssl->sid_ctx)); + +	/* +	 * If the session ID context matches that of the parent SSL_CTX, +	 * inherit it from the new SSL_CTX as well. If however the context does +	 * not match (i.e., it was set per-ssl with SSL_set_session_id_context), +	 * leave it unchanged. +	 */ +	if ((ssl->ctx != NULL) && +		(ssl->sid_ctx_length == ssl->ctx->sid_ctx_length) && +		(memcmp(ssl->sid_ctx, ssl->ctx->sid_ctx, ssl->sid_ctx_length) == 0)) +		{ +		ssl->sid_ctx_length = ctx->sid_ctx_length; +		memcpy(&ssl->sid_ctx, &ctx->sid_ctx, sizeof(ssl->sid_ctx)); +		} +  	CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);  	if (ssl->ctx != NULL)  		SSL_CTX_free(ssl->ctx); /* decrement reference count */  	ssl->ctx = ctx; +  	return(ssl->ctx);  	} | 
