From d45b3d5aff4b4c7c42dc4fd4cc69804566810b53 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 20 May 2010 11:49:03 +0200 Subject: [PATCH] [BUG] http: dispatch and http_proxy modes were broken for a long time Both dispatch and http_proxy modes were broken since 1.4-dev5 when the adjustment of server health based on response codes was introduced. In fact, in these modes, s->srv == NULL. The result is a plain segfault. It should have been noted critical, but the fact that it remained 6 months without being noticed indicates that almost nobody uses these modes anymore. Also, the crash is immediate upon first request. Further versions should not be affected anymore since it's planned to have a dummy server instead of these annoying NULL pointers. --- src/proto_http.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index 0209391b1..3c5cf73bb 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -4493,7 +4493,8 @@ int http_wait_for_response(struct session *s, struct buffer *rep, int an_bit) n = msg->sol[msg->sl.st.c] - '0'; if (n < 1 || n > 5) n = 0; - s->srv->counters.p.http.rsp[n]++; + if (s->srv) + s->srv->counters.p.http.rsp[n]++; /* check if the response is HTTP/1.1 or above */ if ((msg->sl.st.v_l == 8) && @@ -4514,10 +4515,12 @@ int http_wait_for_response(struct session *s, struct buffer *rep, int an_bit) * and 505 are triggered on demand by client request, so we must not * count them as server failures. */ - if (txn->status >= 100 && (txn->status < 500 || txn->status == 501 || txn->status == 505)) - health_adjust(s->srv, HANA_STATUS_HTTP_OK); - else - health_adjust(s->srv, HANA_STATUS_HTTP_STS); + if (s->srv) { + if (txn->status >= 100 && (txn->status < 500 || txn->status == 501 || txn->status == 505)) + health_adjust(s->srv, HANA_STATUS_HTTP_OK); + else + health_adjust(s->srv, HANA_STATUS_HTTP_STS); + } /* * 2: check for cacheability.