Cygwin: Fix racy read to detect applications sockets close
authorChristian Babeux <christian.babeux@efficios.com>
Thu, 6 Dec 2012 04:33:17 +0000 (23:33 -0500)
committerChristian Babeux <christian.babeux@efficios.com>
Fri, 7 Dec 2012 20:17:55 +0000 (15:17 -0500)
The mechanism to detect the applications sockets close is racy and
could potentially discard data. A read(3) is performed on the application
socket and the returned len is compared to 0 to detect the case where an
application closed the socket. If a read(3) occur in the thread_manage_apps
*before* the consumption of the data in the consumer, one byte of data would
be discarded.

To fix this race, perform a recv(3) on the socket with the MSG_PEEK flag.
This has no impact on the data delivery to the consumer and can successfully
detect the applications sockets close.

src/bin/lttng-sessiond/main.c

index 7225495547b2276d0df20dfaac64f415fb434b54..236341d2737fc21e06d74509c4e13a7d945455d2 100644 (file)
@@ -1293,9 +1293,10 @@ static void *thread_manage_apps(void *data)
                                        char dummy;
 
                                        do {
-                                               readlen = read(pollfd, &dummy, 1);
+                                               readlen = recv(pollfd, &dummy, 1, MSG_PEEK);
                                        } while (readlen == -1 && errno == EINTR);
 
+                                       /* Peer has performed an orderly shutdown */
                                        if (readlen == 0) {
                                                /* Removing from the poll set */
                                                ret = lttng_poll_del(&events, pollfd);
This page took 0.029182 seconds and 4 git commands to generate.