Linux: LAD_client: Fix Race Condition with Command FIFO
authorAngela Stegmaier <angelabaker@ti.com>
Fri, 6 Oct 2017 18:38:07 +0000 (13:38 -0500)
committerAngela Stegmaier <angelabaker@ti.com>
Wed, 18 Oct 2017 19:10:38 +0000 (14:10 -0500)
With the current implementation, there is a small window
where the FIFO is closed by the client for writing while it is
still open by the LAD daemon for reading. In this small window,
if the LAD daemon attempts to do a read on the FIFO, it will get
EOF and the LAD daemon will close it's own FIFO and re-open it.

If the client then is able to open the FIFO again after
the LAD daemon has received EOF from the read call, but before
the LAD daemon has closed the FIFO, then there is now a situation
where the client has a handle to a stale FIFO. If all these
things happen, then when the client tries to write/flush to the
FIFO, a SIGPIPE signal will happen, resulting in the client
crash.

To avoid this race condition, we must close the window where
the FIFO is not open for writing by the client while it is already
open for reading by the daemon.

This patch closes the window by modifiying the client code to
delay closing it's non-blocking FIFO handle (used for handshaking)
until after it has successfully opened the regular FIFO.

Signed-off-by: Angela Stegmaier <angelabaker@ti.com>
linux/src/utils/LAD_client.c

index 390e9c5b0c94c4aef05bea8165e2af870a1b79fd..9c858c4b047d89c974f8fe32ec181e6a15775cd6 100644 (file)
@@ -403,7 +403,6 @@ static Bool openCommandFIFO(Void)
             /* open a file for writing to FIFO, non-blocking */
             commandFIFOFd = open(commandFIFOFileName, O_WRONLY | O_TRUNC | O_NONBLOCK);
             if (commandFIFOFd != -1) {
-                close(commandFIFOFd);
                 break;
             }
         }
@@ -421,6 +420,8 @@ static Bool openCommandFIFO(Void)
     /* open a file for writing to FIFO */
     commandFIFOFilePtr = fopen(commandFIFOFileName, "w");
 
+    close(commandFIFOFd);
+
     if (commandFIFOFilePtr == NULL) {
         PRINTVERBOSE2("\nERROR: failed to open %s, errno = %x\n",
             commandFIFOFileName, errno)