From 7e2c647ee7d0a5c57fb56c38d41eb0c556be154b Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 29 Oct 2012 20:44:36 +0100 Subject: [PATCH] MEDIUM: remove remains of BUFSIZE in HTTP auth and sample conversions Sample conversions rely on two alternative buffers which were previously allocated as static bufs of size BUFSIZE. Now they're initialized to the global buffer size. It was the same for HTTP authentication. Note that it seems that none of them was prone to any mistake when dealing with the buffer size, but better stay on the safe side by maintaining the old assumption that a trash buffer is always "large enough". --- include/proto/proto_http.h | 1 + include/proto/sample.h | 4 ++++ src/haproxy.c | 4 ++++ src/proto_http.c | 4 ++-- src/sample.c | 20 ++++++++++---------- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h index e7ad8ffe1..b65408a06 100644 --- a/include/proto/proto_http.h +++ b/include/proto/proto_http.h @@ -53,6 +53,7 @@ extern const int http_err_codes[HTTP_ERR_SIZE]; extern struct chunk http_err_chunks[HTTP_ERR_SIZE]; extern const char *HTTP_302; extern const char *HTTP_303; +extern char *get_http_auth_buff; #define HTTP_IS_CTL(x) (http_is_ctl[(unsigned char)(x)]) #define HTTP_IS_SEP(x) (http_is_sep[(unsigned char)(x)]) diff --git a/include/proto/sample.h b/include/proto/sample.h index 47099b3d4..e6808dd4b 100644 --- a/include/proto/sample.h +++ b/include/proto/sample.h @@ -26,6 +26,10 @@ #include #include +/* only exported for late memory allocation, do not use */ +extern char *sample_trash_buf1; +extern char *sample_trash_buf2; + struct sample_expr *sample_parse_expr(char **str, int *idx, char *err, int err_size); struct sample *sample_process(struct proxy *px, struct session *l4, void *l7, unsigned int dir, struct sample_expr *expr, diff --git a/src/haproxy.c b/src/haproxy.c index 2867ff90e..068a3ddf1 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -742,6 +742,10 @@ void init(int argc, char **argv) global.nbproc = 1; swap_buffer = (char *)calloc(1, global.tune.bufsize); + sample_trash_buf1 = (char *)calloc(1, global.tune.bufsize); + sample_trash_buf2 = (char *)calloc(1, global.tune.bufsize); + get_http_auth_buff = (char *)calloc(1, global.tune.bufsize); + fdinfo = (struct fdinfo *)calloc(1, sizeof(struct fdinfo) * (global.maxsock)); diff --git a/src/proto_http.c b/src/proto_http.c index 14d076c3f..61730d753 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -1196,7 +1196,7 @@ const char *http_parse_reqline(struct http_msg *msg, * searching again for something we are unable to find anyway. */ -char get_http_auth_buff[BUFSIZE]; +char *get_http_auth_buff; int get_http_auth(struct session *s) @@ -1245,7 +1245,7 @@ get_http_auth(struct session *s) if (!strncasecmp("Basic", auth_method.str, auth_method.len)) { len = base64dec(txn->auth.method_data.str, txn->auth.method_data.len, - get_http_auth_buff, BUFSIZE - 1); + get_http_auth_buff, global.tune.bufsize - 1); if (len < 0) return 0; diff --git a/src/sample.c b/src/sample.c index 296dea22f..a7d02e57a 100644 --- a/src/sample.c +++ b/src/sample.c @@ -15,6 +15,8 @@ #include #include +#include + #include #include @@ -28,11 +30,8 @@ static struct sample temp_smp; static struct chunk trash_chunk; /* trash buffers used or sample conversions */ -static char sample_trash_buf1[BUFSIZE]; -static char sample_trash_buf2[BUFSIZE]; - -/* sample_trash_buf point on used buffer*/ -static char *sample_trash_buf = sample_trash_buf1; +char *sample_trash_buf1; +char *sample_trash_buf2; /* list head of all known sample fetch keywords */ static struct sample_fetch_kw_list sample_fetches = { @@ -109,12 +108,13 @@ struct sample_conv *find_sample_conv(const char *kw, int len) */ struct chunk *sample_get_trash_chunk(void) { - if (sample_trash_buf == sample_trash_buf1) - sample_trash_buf = sample_trash_buf2; - else - sample_trash_buf = sample_trash_buf1; + char *sample_trash_buf; - chunk_init(&trash_chunk, sample_trash_buf, BUFSIZE); + sample_trash_buf = sample_trash_buf1; + sample_trash_buf1 = sample_trash_buf2; + sample_trash_buf2 = sample_trash_buf1; + + chunk_init(&trash_chunk, sample_trash_buf, global.tune.bufsize); return &trash_chunk; }