From: Willy Tarreau Date: Mon, 29 Oct 2012 19:44:36 +0000 (+0100) Subject: MEDIUM: remove remains of BUFSIZE in HTTP auth and sample conversions X-Git-Tag: v1.5-dev13~86 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e2c647ee7d0a5c57fb56c38d41eb0c556be154b;p=thirdparty%2Fhaproxy.git 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". --- diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h index e7ad8ffe1d..b65408a06f 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 47099b3d4e..e6808dd4ba 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 2867ff90e0..068a3ddf1d 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 14d076c3ff..61730d7531 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 296dea22f3..a7d02e57ab 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; + + 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, BUFSIZE); + chunk_init(&trash_chunk, sample_trash_buf, global.tune.bufsize); return &trash_chunk; }