diff --git a/include/common/defaults.h b/include/common/defaults.h index 02962010e..d1994e83f 100644 --- a/include/common/defaults.h +++ b/include/common/defaults.h @@ -28,8 +28,8 @@ * when reading HTTP headers, the proxy needs some spare space to add or rewrite * headers if needed. The size of this spare is defined with MAXREWRITE. So it * is not possible to process headers longer than BUFSIZE-MAXREWRITE bytes. By - * default, BUFSIZE=16384 bytes and MAXREWRITE=BUFSIZE/2, so the maximum length - * of headers accepted is 8192 bytes, which is in line with Apache's limits. + * default, BUFSIZE=16384 bytes and MAXREWRITE=min(1024,BUFSIZE/2), so the + * maximum length of headers accepted is 15360 bytes. */ #ifndef BUFSIZE #define BUFSIZE 16384 @@ -51,7 +51,7 @@ // reserved buffer space for header rewriting #ifndef MAXREWRITE -#define MAXREWRITE (BUFSIZE / 2) +#define MAXREWRITE 1024 #endif #ifndef REQURI_LEN diff --git a/src/cfgparse.c b/src/cfgparse.c index f7944c3aa..d732ac328 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -833,8 +833,6 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) err_code |= ERR_ALERT | ERR_FATAL; goto out; } - if (global.tune.maxrewrite >= global.tune.bufsize / 2) - global.tune.maxrewrite = global.tune.bufsize / 2; chunk_init(&trash, realloc(trash.str, global.tune.bufsize), global.tune.bufsize); alloc_trash_buffers(global.tune.bufsize); } @@ -847,8 +845,11 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) goto out; } global.tune.maxrewrite = atol(args[1]); - if (global.tune.maxrewrite >= global.tune.bufsize / 2) - global.tune.maxrewrite = global.tune.bufsize / 2; + if (global.tune.maxrewrite < 0) { + Alert("parsing [%s:%d] : '%s' expects a positive integer argument.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } } else if (!strcmp(args[0], "tune.idletimer")) { unsigned int idle; diff --git a/src/haproxy.c b/src/haproxy.c index a20f4977b..bdfa31824 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -150,7 +150,7 @@ struct global global = { }, .tune = { .bufsize = BUFSIZE, - .maxrewrite = MAXREWRITE, + .maxrewrite = -1, .chksize = BUFSIZE, .reserved_bufs = RESERVED_BUFS, .pattern_cache = DEFAULT_PAT_LRU_SIZE, @@ -1018,6 +1018,9 @@ void init(int argc, char **argv) if (global.tune.recv_enough == 0) global.tune.recv_enough = MIN_RECV_AT_ONCE_ENOUGH; + if (global.tune.maxrewrite < 0) + global.tune.maxrewrite = MAXREWRITE; + if (global.tune.maxrewrite >= global.tune.bufsize / 2) global.tune.maxrewrite = global.tune.bufsize / 2;