|  | @@ -2013,8 +2013,6 @@ typedef int (*tSSL_next_protos_advertised_cb)(SSL *ssl,
 | 
	
		
			
				|  |  |  	SSL_CTX_callback_ctrl(ctx,                                                 \
 | 
	
		
			
				|  |  |  	                      SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,                   \
 | 
	
		
			
				|  |  |  	                      (void (*)(void))cb)
 | 
	
		
			
				|  |  | -#define SSL_CTX_set_tlsext_servername_arg(ctx, arg)                            \
 | 
	
		
			
				|  |  | -	SSL_CTX_ctrl(ctx, SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG, 0, (void *)arg)
 | 
	
		
			
				|  |  |  #define SSL_set_tlsext_host_name(ctx, arg)                                     \
 | 
	
		
			
				|  |  |  	SSL_ctrl(ctx, SSL_CTRL_SET_TLSEXT_HOSTNAME, 0, (void *)arg)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2213,8 +2211,6 @@ typedef int (*tSSL_next_protos_advertised_cb)(SSL *ssl,
 | 
	
		
			
				|  |  |  	SSL_CTX_callback_ctrl(ctx,                                                 \
 | 
	
		
			
				|  |  |  	                      SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,                   \
 | 
	
		
			
				|  |  |  	                      (void (*)(void))cb)
 | 
	
		
			
				|  |  | -#define SSL_CTX_set_tlsext_servername_arg(ctx, arg)                            \
 | 
	
		
			
				|  |  | -	SSL_CTX_ctrl(ctx, SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG, 0, (void *)arg)
 | 
	
		
			
				|  |  |  #define SSL_set_tlsext_host_name(ctx, arg)                                     \
 | 
	
		
			
				|  |  |  	SSL_ctrl(ctx, SSL_CTRL_SET_TLSEXT_HOSTNAME, 0, (void *)arg)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -16328,9 +16324,6 @@ ssl_info_callback(const SSL *ssl, int what, int ret)
 | 
	
		
			
				|  |  |  static int
 | 
	
		
			
				|  |  |  ssl_servername_callback(SSL *ssl, int *ad, void *arg)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	struct mg_context *ctx = (struct mg_context *)arg;
 | 
	
		
			
				|  |  | -	struct mg_domain_context *dom = ((ctx != NULL) ? &(ctx->dd) : NULL);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  #if defined(GCC_DIAGNOSTIC)
 | 
	
		
			
				|  |  |  #pragma GCC diagnostic push
 | 
	
		
			
				|  |  |  #pragma GCC diagnostic ignored "-Wcast-align"
 | 
	
	
		
			
				|  | @@ -16346,11 +16339,13 @@ ssl_servername_callback(SSL *ssl, int *ad, void *arg)
 | 
	
		
			
				|  |  |  	const char *servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	(void)ad;
 | 
	
		
			
				|  |  | +	(void)arg;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if ((ctx == NULL) || (conn->phys_ctx == ctx)) {
 | 
	
		
			
				|  |  | -		DEBUG_TRACE("%s", "internal error - assertion failed");
 | 
	
		
			
				|  |  | +	if ((conn == NULL) || (conn->phys_ctx == NULL)) {
 | 
	
		
			
				|  |  | +		DEBUG_ASSERT(0);
 | 
	
		
			
				|  |  |  		return SSL_TLSEXT_ERR_NOACK;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	conn->dom_ctx = &(conn->phys_ctx->dd);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	/* Old clients (Win XP) will not support SNI. Then, there
 | 
	
		
			
				|  |  |  	 * is no server name available in the request - we can
 | 
	
	
		
			
				|  | @@ -16360,30 +16355,29 @@ ssl_servername_callback(SSL *ssl, int *ad, void *arg)
 | 
	
		
			
				|  |  |  	 */
 | 
	
		
			
				|  |  |  	if ((servername == NULL) || (*servername == 0)) {
 | 
	
		
			
				|  |  |  		DEBUG_TRACE("%s", "SSL connection not supporting SNI");
 | 
	
		
			
				|  |  | -		conn->dom_ctx = &(ctx->dd);
 | 
	
		
			
				|  |  |  		SSL_set_SSL_CTX(ssl, conn->dom_ctx->ssl_ctx);
 | 
	
		
			
				|  |  |  		return SSL_TLSEXT_ERR_NOACK;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	DEBUG_TRACE("TLS connection to host %s", servername);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	while (dom) {
 | 
	
		
			
				|  |  | -		if (!mg_strcasecmp(servername, dom->config[AUTHENTICATION_DOMAIN])) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +	while (conn->dom_ctx) {
 | 
	
		
			
				|  |  | +		if (!mg_strcasecmp(servername,
 | 
	
		
			
				|  |  | +		                   conn->dom_ctx->config[AUTHENTICATION_DOMAIN])) {
 | 
	
		
			
				|  |  |  			/* Found matching domain */
 | 
	
		
			
				|  |  |  			DEBUG_TRACE("TLS domain %s found",
 | 
	
		
			
				|  |  | -			            dom->config[AUTHENTICATION_DOMAIN]);
 | 
	
		
			
				|  |  | -			SSL_set_SSL_CTX(ssl, dom->ssl_ctx);
 | 
	
		
			
				|  |  | -			conn->dom_ctx = dom;
 | 
	
		
			
				|  |  | -			return SSL_TLSEXT_ERR_OK;
 | 
	
		
			
				|  |  | +			            conn->dom_ctx->config[AUTHENTICATION_DOMAIN]);
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		dom = dom->next;
 | 
	
		
			
				|  |  | +		conn->dom_ctx = conn->dom_ctx->next;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	/* Default domain */
 | 
	
		
			
				|  |  | -	DEBUG_TRACE("TLS default domain %s used",
 | 
	
		
			
				|  |  | -	            ctx->dd.config[AUTHENTICATION_DOMAIN]);
 | 
	
		
			
				|  |  | -	conn->dom_ctx = &(ctx->dd);
 | 
	
		
			
				|  |  | +	if (conn->dom_ctx == NULL) {
 | 
	
		
			
				|  |  | +		/* Default domain */
 | 
	
		
			
				|  |  | +		DEBUG_TRACE("TLS default domain %s used",
 | 
	
		
			
				|  |  | +		            conn->phys_ctx->dd.config[AUTHENTICATION_DOMAIN]);
 | 
	
		
			
				|  |  | +		conn->dom_ctx = &(conn->phys_ctx->dd);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	SSL_set_SSL_CTX(ssl, conn->dom_ctx->ssl_ctx);
 | 
	
		
			
				|  |  |  	return SSL_TLSEXT_ERR_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -16559,7 +16553,6 @@ init_ssl_ctx_impl(struct mg_context *phys_ctx,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	SSL_CTX_set_tlsext_servername_callback(dom_ctx->ssl_ctx,
 | 
	
		
			
				|  |  |  	                                       ssl_servername_callback);
 | 
	
		
			
				|  |  | -	SSL_CTX_set_tlsext_servername_arg(dom_ctx->ssl_ctx, phys_ctx);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	/* If a callback has been specified, call it. */
 | 
	
		
			
				|  |  |  	callback_ret = (phys_ctx->callbacks.init_ssl == NULL)
 |