diff --git a/ChangeLog b/ChangeLog index b78039e3..5e089c83 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sun Jun 22 00:22:08 CEST 2014 + Lock on response if adding headers, needed if response + object is shared across threads and connections. -CG + Thu Jun 19 17:32:32 CEST 2014 Ensure that listen FD is bound to epoll FD even before MHD_run() is called if running with MHD_USE_EPOLL_LINUX_ONLY diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c index 6bb17d80..1121772a 100644 --- a/src/microhttpd/connection.c +++ b/src/microhttpd/connection.c @@ -2466,13 +2466,16 @@ MHD_connection_handle_idle (struct MHD_Connection *connection) continue; if (NULL == connection->response) break; /* try again next time */ + (void) MHD_mutex_lock_ (&connection->response->mutex); if (MHD_NO == build_header_response (connection)) { /* oops - close! */ + (void) MHD_mutex_unlock_ (&connection->response->mutex); CONNECTION_CLOSE_ERROR (connection, "Closing connection (failed to create response header)\n"); continue; } + (void) MHD_mutex_unlock_ (&connection->response->mutex); connection->state = MHD_CONNECTION_HEADERS_SENDING; #if HAVE_DECL_TCP_CORK @@ -2539,7 +2542,16 @@ MHD_connection_handle_idle (struct MHD_Connection *connection) (void) MHD_mutex_unlock_ (&connection->response->mutex); break; case MHD_CONNECTION_BODY_SENT: - build_header_response (connection); + (void) MHD_mutex_lock_ (&connection->response->mutex); + if (MHD_NO == build_header_response (connection)) + { + /* oops - close! */ + (void) MHD_mutex_unlock_ (&connection->response->mutex); + CONNECTION_CLOSE_ERROR (connection, + "Closing connection (failed to create response header)\n"); + continue; + } + (void) MHD_mutex_unlock_ (&connection->response->mutex); if ( (MHD_NO == connection->have_chunked_upload) || (connection->write_buffer_send_offset == connection->write_buffer_append_offset) )