[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: case BE_LB_HASH_URI:
/* URI hashing */ /* URI hashing */
s->srv = get_server_uh(s->be, 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); s->txn.req.sl.rq.u_l);
break; break;
case BE_LB_HASH_PRM: case BE_LB_HASH_PRM:
/* URL Parameter hashing */ /* URL Parameter hashing */
if (s->txn.meth == HTTP_METH_POST && 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->txn.req.sl.rq.u_l ) == NULL)
s->srv = get_server_ph_post(s); s->srv = get_server_ph_post(s);
else else
s->srv = get_server_ph(s->be, 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); s->txn.req.sl.rq.u_l);
break; break;

View File

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