comparison src/http/ngx_http_variables.c @ 3282:c76b7a7959d5

fix segfault if $limit_rate was logged
author Igor Sysoev <igor@sysoev.ru>
date Tue, 03 Nov 2009 15:05:38 +0000
parents c6a40c815d45
children 42c16d8bddbe
comparison
equal deleted inserted replaced
3281:c5af9f73c664 3282:c76b7a7959d5
11 11
12 12
13 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, 13 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r,
14 ngx_http_variable_value_t *v, uintptr_t data); 14 ngx_http_variable_value_t *v, uintptr_t data);
15 static void ngx_http_variable_request_set(ngx_http_request_t *r, 15 static void ngx_http_variable_request_set(ngx_http_request_t *r,
16 ngx_http_variable_value_t *v, uintptr_t data);
17 static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r,
16 ngx_http_variable_value_t *v, uintptr_t data); 18 ngx_http_variable_value_t *v, uintptr_t data);
17 static void ngx_http_variable_request_set_size(ngx_http_request_t *r, 19 static void ngx_http_variable_request_set_size(ngx_http_request_t *r,
18 ngx_http_variable_value_t *v, uintptr_t data); 20 ngx_http_variable_value_t *v, uintptr_t data);
19 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, 21 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,
20 ngx_http_variable_value_t *v, uintptr_t data); 22 ngx_http_variable_value_t *v, uintptr_t data);
236 238
237 { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers, 239 { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers,
238 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, 240 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },
239 241
240 { ngx_string("limit_rate"), ngx_http_variable_request_set_size, 242 { ngx_string("limit_rate"), ngx_http_variable_request_set_size,
241 ngx_http_variable_request, 243 ngx_http_variable_request_get_size,
242 offsetof(ngx_http_request_t, limit_rate), 244 offsetof(ngx_http_request_t, limit_rate),
243 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, 245 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },
244 246
245 { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version, 247 { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version,
246 0, 0, 0 }, 248 0, 0, 0 },
566 s->len = v->len; 568 s->len = v->len;
567 s->data = v->data; 569 s->data = v->data;
568 } 570 }
569 571
570 572
573 static ngx_int_t
574 ngx_http_variable_request_get_size(ngx_http_request_t *r,
575 ngx_http_variable_value_t *v, uintptr_t data)
576 {
577 size_t *sp;
578
579 sp = (size_t *) ((char *) r + data);
580
581 v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN);
582 if (v->data == NULL) {
583 return NGX_ERROR;
584 }
585
586 v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data;
587 v->valid = 1;
588 v->no_cacheable = 0;
589 v->not_found = 0;
590
591 return NGX_OK;
592 }
593
594
571 static void 595 static void
572 ngx_http_variable_request_set_size(ngx_http_request_t *r, 596 ngx_http_variable_request_set_size(ngx_http_request_t *r,
573 ngx_http_variable_value_t *v, uintptr_t data) 597 ngx_http_variable_value_t *v, uintptr_t data)
574 { 598 {
575 ssize_t s, *sp; 599 ssize_t s, *sp;