Fixed incorrect ngx_cpystrn() usage in ngx_http_*_process_header().
This resulted in a disclosure of previously freed memory if upstream
server returned specially crafted response, potentially exposing
sensitive information.
Reported by Matthew Daley.
Maxim Dounin
10 years ago
1500 | 1500 |
h->lowcase_key = h->key.data + h->key.len + 1
|
1501 | 1501 |
+ h->value.len + 1;
|
1502 | 1502 |
|
1503 | |
ngx_cpystrn(h->key.data, r->header_name_start,
|
1504 | |
h->key.len + 1);
|
1505 | |
ngx_cpystrn(h->value.data, r->header_start,
|
1506 | |
h->value.len + 1);
|
|
1503 |
ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
|
1504 |
h->key.data[h->key.len] = '\0';
|
|
1505 |
ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
|
1506 |
h->value.data[h->value.len] = '\0';
|
1507 | 1507 |
}
|
1508 | 1508 |
|
1509 | 1509 |
h->hash = r->header_hash;
|
1380 | 1380 |
h->value.data = h->key.data + h->key.len + 1;
|
1381 | 1381 |
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
1382 | 1382 |
|
1383 | |
ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
1384 | |
ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
|
1383 |
ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
|
1384 |
h->key.data[h->key.len] = '\0';
|
|
1385 |
ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
|
1386 |
h->value.data[h->value.len] = '\0';
|
1385 | 1387 |
|
1386 | 1388 |
if (h->key.len == r->lowcase_index) {
|
1387 | 1389 |
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
940 | 940 |
h->value.data = h->key.data + h->key.len + 1;
|
941 | 941 |
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
942 | 942 |
|
943 | |
ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
944 | |
ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
|
943 |
ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
|
944 |
h->key.data[h->key.len] = '\0';
|
|
945 |
ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
|
946 |
h->value.data[h->value.len] = '\0';
|
945 | 947 |
|
946 | 948 |
if (h->key.len == r->lowcase_index) {
|
947 | 949 |
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
980 | 980 |
h->value.data = h->key.data + h->key.len + 1;
|
981 | 981 |
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
982 | 982 |
|
983 | |
ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
984 | |
ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
|
983 |
ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
|
984 |
h->key.data[h->key.len] = '\0';
|
|
985 |
ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
|
986 |
h->value.data[h->value.len] = '\0';
|
985 | 987 |
|
986 | 988 |
if (h->key.len == r->lowcase_index) {
|
987 | 989 |
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|