[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.
This commit is contained in:
Willy Tarreau 2010-05-20 11:49:03 +02:00
parent 21475e3215
commit d45b3d5aff

View File

@ -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.