|  | @@ -13181,6 +13181,23 @@ parse_port_string(const struct vec *vec, struct socket *so, int *ip_version)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/* Is there any SSL port in use? */
 | 
	
		
			
				|  |  | +static int
 | 
	
		
			
				|  |  | +is_ssl_port_used(const struct mg_context *ctx)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	const char *ports = ctx->config[LISTENING_PORTS];
 | 
	
		
			
				|  |  | +	if (ports) {
 | 
	
		
			
				|  |  | +		if (strchr(ports, 's')) {
 | 
	
		
			
				|  |  | +			return 1;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		if (strchr(ports, 'r')) {
 | 
	
		
			
				|  |  | +			return 1;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static int
 | 
	
		
			
				|  |  |  set_ports_option(struct mg_context *ctx)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -13226,10 +13243,7 @@ set_ports_option(struct mg_context *ctx)
 | 
	
		
			
				|  |  |  #if !defined(NO_SSL)
 | 
	
		
			
				|  |  |  		if (so.is_ssl && ctx->ssl_ctx == NULL) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			mg_cry(fc(ctx),
 | 
	
		
			
				|  |  | -			       "Cannot add SSL socket (entry %i). Is -ssl_certificate "
 | 
	
		
			
				|  |  | -			       "option set?",
 | 
	
		
			
				|  |  | -			       portsTotal);
 | 
	
		
			
				|  |  | +			mg_cry(fc(ctx), "Cannot add SSL socket (entry %i)", portsTotal);
 | 
	
		
			
				|  |  |  			continue;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  #endif
 | 
	
	
		
			
				|  | @@ -14237,15 +14251,28 @@ set_ssl_option(struct mg_context *ctx)
 | 
	
		
			
				|  |  |  	int protocol_ver;
 | 
	
		
			
				|  |  |  	char ebuf[128];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	/* If PEM file is not specified and the init_ssl callback
 | 
	
		
			
				|  |  | -	 * is not specified, skip SSL initialization. */
 | 
	
		
			
				|  |  |  	if (!ctx) {
 | 
	
		
			
				|  |  |  		return 0;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	if ((pem = ctx->config[SSL_CERTIFICATE]) == NULL
 | 
	
		
			
				|  |  | -	    && ctx->callbacks.init_ssl == NULL) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!is_ssl_port_used(ctx)) {
 | 
	
		
			
				|  |  | +		/* No SSL port is set. No need to setup SSL. */
 | 
	
		
			
				|  |  |  		return 1;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/* If PEM file is not specified and the init_ssl callback
 | 
	
		
			
				|  |  | +	 * is not specified, setup will fail. */
 | 
	
		
			
				|  |  | +	if (((pem = ctx->config[SSL_CERTIFICATE]) == NULL)
 | 
	
		
			
				|  |  | +	    && (ctx->callbacks.init_ssl == NULL)) {
 | 
	
		
			
				|  |  | +		/* No certificate and no callback:
 | 
	
		
			
				|  |  | +		 * Essential data to set up TLS is missing.
 | 
	
		
			
				|  |  | +		 */
 | 
	
		
			
				|  |  | +		mg_cry(fc(ctx),
 | 
	
		
			
				|  |  | +		       "Initializing SSL failed: -%s is not set",
 | 
	
		
			
				|  |  | +		       config_options[SSL_CERTIFICATE].name);
 | 
	
		
			
				|  |  | +		return 0;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	chain = ctx->config[SSL_CERTIFICATE_CHAIN];
 | 
	
		
			
				|  |  |  	if (chain == NULL) {
 | 
	
		
			
				|  |  |  		chain = pem;
 | 
	
	
		
			
				|  | @@ -14341,9 +14368,7 @@ set_ssl_option(struct mg_context *ctx)
 | 
	
		
			
				|  |  |  		return 0;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	if (callback_ret > 0) {
 | 
	
		
			
				|  |  | -		if (pem != NULL) {
 | 
	
		
			
				|  |  | -			(void)SSL_CTX_use_certificate_chain_file(ctx->ssl_ctx, pem);
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +		/* Callback did everything. */
 | 
	
		
			
				|  |  |  		return 1;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 |