]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[BUG] checks: don't report an error when recv() returns an error after data
authorWilly Tarreau <w@1wt.eu>
Tue, 16 Mar 2010 19:55:43 +0000 (20:55 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 16 Mar 2010 21:57:27 +0000 (22:57 +0100)
This happens when a server immediately closes the connection after
the response without lingering or when we close before the end of
the data. We get an RST which translates into a late error. We must
not declare an error without checking that the contents are OK.

src/checks.c

index eeed75af4028c9865b3563f27413a43784c978f3..cba49f8b23e407085cc61b2e06d308ed575d9c24 100644 (file)
@@ -898,10 +898,17 @@ static int event_srv_chk_r(int fd)
                        fdtab[fd].ev &= ~FD_POLL_IN;
                        return 0;
                }
-               /* network error, report it */
-               if (!(s->result & SRV_CHK_ERROR))
-                       set_server_check_status(s, HCHK_STATUS_SOCKERR, NULL);
-               goto out_wakeup;
+
+               /* Report network errors only if we got no other data. Otherwise
+                * we'll let the upper layers decide whether the response is OK
+                * or not. It is very common that an RST sent by the server is
+                * reported as an error just after the last data chunk.
+                */
+               if (!s->check_data_len) {
+                       if (!(s->result & SRV_CHK_ERROR))
+                               set_server_check_status(s, HCHK_STATUS_SOCKERR, NULL);
+                       goto out_wakeup;
+               }
        }
 
        /* Full response received.