[BUG] http: the request URI pointer is relative to the buffer

The rq.u field is relative to buf->data, not to msg->sol. We have
to subtract msg->som everywhere this error was made. Maybe it will
be simpler to have a pointer to the buffer in the message and find
appropriate data there.
This commit is contained in:
Willy Tarreau 2010-01-03 13:04:35 +01:00
parent 3bb9c23bd6
commit a95a1f4614
2 changed files with 10 additions and 10 deletions

View File

@ -535,19 +535,19 @@ int assign_server(struct session *s)
case BE_LB_HASH_URI:
/* URI hashing */
s->srv = get_server_uh(s->be,
s->txn.req.sol + s->txn.req.sl.rq.u,
s->txn.req.sol - s->txn.req.som + s->txn.req.sl.rq.u,
s->txn.req.sl.rq.u_l);
break;
case BE_LB_HASH_PRM:
/* URL Parameter hashing */
if (s->txn.meth == HTTP_METH_POST &&
memchr(s->txn.req.sol + s->txn.req.sl.rq.u, '&',
memchr(s->txn.req.sol - s->txn.req.som + s->txn.req.sl.rq.u, '&',
s->txn.req.sl.rq.u_l ) == NULL)
s->srv = get_server_ph_post(s);
else
s->srv = get_server_ph(s->be,
s->txn.req.sol + s->txn.req.sl.rq.u,
s->txn.req.sol - s->txn.req.som + s->txn.req.sl.rq.u,
s->txn.req.sl.rq.u_l);
break;

View File

@ -593,7 +593,7 @@ http_get_path(struct http_txn *txn)
{
char *ptr, *end;
ptr = txn->req.sol + txn->req.sl.rq.u;
ptr = txn->req.sol - txn->req.som + txn->req.sl.rq.u;
end = ptr + txn->req.sl.rq.u_l;
if (ptr >= end)
@ -661,7 +661,7 @@ void perform_http_redirect(struct session *s, struct stream_interface *si)
if (!path)
return;
len = txn->req.sl.rq.u_l + (txn->req.sol+txn->req.sl.rq.u) - path;
len = txn->req.sl.rq.u_l + (txn->req.sol-txn->req.som+txn->req.sl.rq.u) - path;
if (rdr.len + len > rdr.size - 4) /* 4 for CRLF-CRLF */
return;
@ -2730,7 +2730,7 @@ int http_process_req_common(struct session *s, struct buffer *req, int an_bit, s
path = http_get_path(txn);
/* build message using path */
if (path) {
pathlen = txn->req.sl.rq.u_l + (txn->req.sol+txn->req.sl.rq.u) - path;
pathlen = txn->req.sl.rq.u_l + (txn->req.sol-txn->req.som+txn->req.sl.rq.u) - path;
if (rule->flags & REDIRECT_FLAG_DROP_QS) {
int qs = 0;
while (qs < pathlen) {
@ -6234,7 +6234,7 @@ acl_fetch_url(struct proxy *px, struct session *l4, void *l7, int dir,
return 0;
test->len = txn->req.sl.rq.u_l;
test->ptr = txn->req.sol + txn->req.sl.rq.u;
test->ptr = txn->req.sol - txn->req.som + txn->req.sl.rq.u;
/* we do not need to set READ_ONLY because the data is in a buffer */
test->flags = ACL_TEST_F_VOL_1ST;
@ -6258,7 +6258,7 @@ acl_fetch_url_ip(struct proxy *px, struct session *l4, void *l7, int dir,
return 0;
/* Parse HTTP request */
url2sa(txn->req.sol + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &l4->srv_addr);
url2sa(txn->req.sol - txn->req.som + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &l4->srv_addr);
test->ptr = (void *)&((struct sockaddr_in *)&l4->srv_addr)->sin_addr;
test->i = AF_INET;
@ -6290,7 +6290,7 @@ acl_fetch_url_port(struct proxy *px, struct session *l4, void *l7, int dir,
return 0;
/* Same optimization as url_ip */
url2sa(txn->req.sol + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &l4->srv_addr);
url2sa(txn->req.sol - txn->req.som + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &l4->srv_addr);
test->i = ntohs(((struct sockaddr_in *)&l4->srv_addr)->sin_port);
if (px->options & PR_O_HTTP_PROXY)
@ -6577,7 +6577,7 @@ acl_fetch_path(struct proxy *px, struct session *l4, void *l7, int dir,
/* ensure the indexes are not affected */
return 0;
end = txn->req.sol + txn->req.sl.rq.u + txn->req.sl.rq.u_l;
end = txn->req.sol - txn->req.som + txn->req.sl.rq.u + txn->req.sl.rq.u_l;
ptr = http_get_path(txn);
if (!ptr)
return 0;