Le mardi 6 avril 2010 20:50:50, Willy Tarreau a écrit :
> > Well, to finalize the patch, what do you prefer ? accept ASPSESSIONIDXXX
> > (which didn't work) or strictly detect ASPSESSIONID ?
>
> I don't want to do important changes in 1.3, so I'd rather have the length
> correctly checked and ensure that we don't suddenly see the appsession code
> work differently, or it will scare users away.
>
> However for 1.4, I'd prefer that the code does what the config states. That
> means correct length check while keeping support your prefix patch.
>
> I don't know if my explanations are clear, otherwise please ask again :-)
Ok, I think it's clear. Then here are the patches, if they don't represent your
explanations, please explain again, I'll update :-)
Also, while testing, I noticed that HEAD requests where not available for URIs
containing the appsession parameter.
1.4.3 patch fixes an horrible segfault I missed in a previous patch when
appsession is not in the configuration and HAProxy is compiled with DEBUG_HASH.
--
Cyril Bonté
diff -Naur haproxy-1.3.24//src/proto_http.c haproxy-1.3.24-appsession//src/proto_http.c
--- haproxy-1.3.24//src/proto_http.c 2010-03-30 09:56:00.000000000 +0200
+++ haproxy-1.3.24-appsession//src/proto_http.c 2010-04-06 20:36:37.000000000 +0200
@@ -3720,7 +3720,8 @@
}
if ((t->be->appsession_name != NULL) &&
- (memcmp(p1, t->be->appsession_name, p2 - p1) == 0)) {
+ (t->be->appsession_name_len == p2 - p1) &&
+ (memcmp(p1, t->be->appsession_name, t->be->appsession_name_len) == 0)) {
/* first, let's see if the cookie is our appcookie*/
/* Cool... it's the right one */
@@ -4138,7 +4139,8 @@
}
/* next, let's see if the cookie is our appcookie */
else if ((t->be->appsession_name != NULL) &&
- (memcmp(p1, t->be->appsession_name, p2 - p1) == 0)) {
+ (t->be->appsession_name_len == p2 - p1) &&
+ (memcmp(p1, t->be->appsession_name, t->be->appsession_name_len) == 0)) {
/* Cool... it's the right one */
@@ -4303,7 +4305,7 @@
char *request_line;
if (t->be->appsession_name == NULL ||
- (t->txn.meth != HTTP_METH_GET && t->txn.meth != HTTP_METH_POST) ||
+ (t->txn.meth != HTTP_METH_GET && t->txn.meth != HTTP_METH_POST && t->txn.meth != HTTP_METH_HEAD) ||
(request_line = memchr(begin, ';', len)) == NULL ||
((1 + t->be->appsession_name_len + 1 + t->be->appsession_len) > (begin + len - request_line)))
return;
diff -Naur haproxy-1.3.24//src/sessionhash.c haproxy-1.3.24-appsession//src/sessionhash.c
--- haproxy-1.3.24//src/sessionhash.c 2010-03-30 09:56:00.000000000 +0200
+++ haproxy-1.3.24-appsession//src/sessionhash.c 2010-04-06 20:12:59.000000000 +0200
@@ -114,6 +114,9 @@
unsigned int idx;
appsess *item;
+ if (! hash->table)
+ return;
+
printf("Dumping hashtable 0x%p\n", hash);
for (idx = 0; idx < TABLESIZE; idx++) {
/* we don't even need to call _safe because we return at once */
diff -Naur haproxy-1.4.3//src/proto_http.c haproxy-1.4.3-appsession//src/proto_http.c
--- haproxy-1.4.3//src/proto_http.c 2010-03-30 09:50:08.000000000 +0200
+++ haproxy-1.4.3-appsession//src/proto_http.c 2010-04-06 20:37:36.000000000 +0200
@@ -5776,7 +5776,8 @@
}
/* let's see if the cookie is our appcookie */
- if (memcmp(p1, t->be->appsession_name, cmp_len) == 0) {
+ if ((cmp_len == t->be->appsession_name_len) &&
+ (memcmp(p1, t->be->appsession_name, t->be->appsession_name_len) == 0)) {
/* Cool... it's the right one */
manage_client_side_appsession(t, value_begin, value_len);
}
@@ -6218,7 +6219,8 @@
value_len = MIN(t->be->appsession_len, p4 - p3);
}
- if (memcmp(p1, t->be->appsession_name, cmp_len) == 0) {
+ if ((cmp_len == t->be->appsession_name_len) &&
+ (memcmp(p1, t->be->appsession_name, t->be->appsession_name_len) == 0)) {
/* Cool... it's the right one */
if (txn->sessid != NULL) {
/* free previously allocated memory as we don't need it anymore */
@@ -6279,8 +6281,10 @@
}
#if defined(DEBUG_HASH)
- Alert("manage_server_side_cookies\n");
- appsession_hash_dump(&(t->be->htbl_proxy));
+ if (t->be->appsession_name) {
+ Alert("manage_server_side_cookies\n");
+ appsession_hash_dump(&(t->be->htbl_proxy));
+ }
#endif
}
@@ -6386,7 +6390,7 @@
int mode = t->be->options2 & PR_O2_AS_M_ANY;
if (t->be->appsession_name == NULL ||
- (t->txn.meth != HTTP_METH_GET && t->txn.meth != HTTP_METH_POST)) {
+ (t->txn.meth != HTTP_METH_GET && t->txn.meth != HTTP_METH_POST && t->txn.meth != HTTP_METH_HEAD)) {
return;
}
diff -Naur haproxy-1.4.3//src/sessionhash.c haproxy-1.4.3-appsession//src/sessionhash.c
--- haproxy-1.4.3//src/sessionhash.c 2010-03-30 09:50:08.000000000 +0200
+++ haproxy-1.4.3-appsession//src/sessionhash.c 2010-04-06 08:38:29.000000000 +0200
@@ -114,6 +114,9 @@
unsigned int idx;
appsess *item;
+ if (! hash->table)
+ return;
+
printf("Dumping hashtable 0x%p\n", hash);
for (idx = 0; idx < TABLESIZE; idx++) {
/* we don't even need to call _safe because we return at once */