|  | @@ -4136,35 +4136,36 @@ static void worker_thread(struct mg_context *ctx) {
 | 
											
												
													
														|  |    conn = (struct mg_connection *) calloc(1, sizeof(*conn) + buf_size);
 |  |    conn = (struct mg_connection *) calloc(1, sizeof(*conn) + buf_size);
 | 
											
												
													
														|  |    if (conn == NULL) {
 |  |    if (conn == NULL) {
 | 
											
												
													
														|  |      cry(fc(ctx), "%s", "Cannot create new connection struct, OOM");
 |  |      cry(fc(ctx), "%s", "Cannot create new connection struct, OOM");
 | 
											
												
													
														|  | -    return;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  conn->buf_size = buf_size;
 |  | 
 | 
											
												
													
														|  | -  conn->buf = (char *) (conn + 1);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  // Call consume_socket() even when ctx->stop_flag > 0, to let it signal
 |  | 
 | 
											
												
													
														|  | -  // sq_empty condvar to wake up the master waiting in produce_socket()
 |  | 
 | 
											
												
													
														|  | -  while (consume_socket(ctx, &conn->client)) {
 |  | 
 | 
											
												
													
														|  | -    conn->birth_time = time(NULL);
 |  | 
 | 
											
												
													
														|  | -    conn->ctx = ctx;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Fill in IP, port info early so even if SSL setup below fails,
 |  | 
 | 
											
												
													
														|  | -    // error handler would have the corresponding info.
 |  | 
 | 
											
												
													
														|  | -    // Thanks to Johannes Winkelmann for the patch.
 |  | 
 | 
											
												
													
														|  | -    // TODO(lsm): Fix IPv6 case
 |  | 
 | 
											
												
													
														|  | -    conn->request_info.remote_port = ntohs(conn->client.rsa.sin.sin_port);
 |  | 
 | 
											
												
													
														|  | -    memcpy(&conn->request_info.remote_ip,
 |  | 
 | 
											
												
													
														|  | -           &conn->client.rsa.sin.sin_addr.s_addr, 4);
 |  | 
 | 
											
												
													
														|  | -    conn->request_info.remote_ip = ntohl(conn->request_info.remote_ip);
 |  | 
 | 
											
												
													
														|  | -    conn->request_info.is_ssl = conn->client.is_ssl;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    if (!conn->client.is_ssl ||
 |  | 
 | 
											
												
													
														|  | -        (conn->client.is_ssl && sslize(conn, conn->ctx->ssl_ctx, SSL_accept))) {
 |  | 
 | 
											
												
													
														|  | -      process_new_connection(conn);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  } else {
 | 
											
												
													
														|  | 
 |  | +    conn->buf_size = buf_size;
 | 
											
												
													
														|  | 
 |  | +    conn->buf = (char *) (conn + 1);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    close_connection(conn);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Call consume_socket() even when ctx->stop_flag > 0, to let it signal
 | 
											
												
													
														|  | 
 |  | +    // sq_empty condvar to wake up the master waiting in produce_socket()
 | 
											
												
													
														|  | 
 |  | +    while (consume_socket(ctx, &conn->client)) {
 | 
											
												
													
														|  | 
 |  | +      conn->birth_time = time(NULL);
 | 
											
												
													
														|  | 
 |  | +      conn->ctx = ctx;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      // Fill in IP, port info early so even if SSL setup below fails,
 | 
											
												
													
														|  | 
 |  | +      // error handler would have the corresponding info.
 | 
											
												
													
														|  | 
 |  | +      // Thanks to Johannes Winkelmann for the patch.
 | 
											
												
													
														|  | 
 |  | +      // TODO(lsm): Fix IPv6 case
 | 
											
												
													
														|  | 
 |  | +      conn->request_info.remote_port = ntohs(conn->client.rsa.sin.sin_port);
 | 
											
												
													
														|  | 
 |  | +      memcpy(&conn->request_info.remote_ip,
 | 
											
												
													
														|  | 
 |  | +             &conn->client.rsa.sin.sin_addr.s_addr, 4);
 | 
											
												
													
														|  | 
 |  | +      conn->request_info.remote_ip = ntohl(conn->request_info.remote_ip);
 | 
											
												
													
														|  | 
 |  | +      conn->request_info.is_ssl = conn->client.is_ssl;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (!conn->client.is_ssl ||
 | 
											
												
													
														|  | 
 |  | +          (conn->client.is_ssl &&
 | 
											
												
													
														|  | 
 |  | +           sslize(conn, conn->ctx->ssl_ctx, SSL_accept))) {
 | 
											
												
													
														|  | 
 |  | +        process_new_connection(conn);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      close_connection(conn);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    free(conn);
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | -  free(conn);
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |    // Signal master that we're done with connection and exiting
 |  |    // Signal master that we're done with connection and exiting
 | 
											
												
													
														|  |    (void) pthread_mutex_lock(&ctx->mutex);
 |  |    (void) pthread_mutex_lock(&ctx->mutex);
 |