Stop rs_request_send() from leaking RSE_TIMEOUT_CONN and RSE_TIMEOUT_IO.
authorLinus Nordberg <linus@nordberg.se>
Mon, 18 Nov 2013 15:34:21 +0000 (16:34 +0100)
committerLinus Nordberg <linus@nordberg.se>
Mon, 18 Nov 2013 15:34:21 +0000 (16:34 +0100)
If sending or receiving time out, pop the error off the stack before
continuing the loop. Push a new error, RS_TIMEOUT, before timing out
for real.

Addresses LIBRADSEC-3.

lib/request.c

index 3a8b6dd..40ac56d 100644 (file)
@@ -119,17 +119,19 @@ rs_request_send (struct rs_request *request, struct rs_packet **resp_msg)
                                      resp_msg);
          if (r == RSE_OK)
            break;              /* Success.  */
-
-         if (r != RSE_TIMEOUT_CONN && r != RSE_TIMEOUT_IO)
-           break;              /* Error.  */
        }
-      else if (r != RSE_TIMEOUT_CONN && r != RSE_TIMEOUT_IO)
+      if (r != RSE_TIMEOUT_CONN && r != RSE_TIMEOUT_IO)
        break;                  /* Error.  */
 
+      /* Timing out reading or writing. Pop the timeout error from the
+         stack and continue the loop. */
+      rs_err_conn_pop (request->conn);
+
       gettimeofday (&now, NULL);
       if (++count > MRC || timercmp (&now, &end, >))
        {
-         r = RSE_TIMEOUT;
+         r = rs_err_conn_push_fl (request->conn, RSE_TIMEOUT,
+                                   __FILE__, __LINE__, NULL);
          break;                /* Timeout.  */
        }