comparison src/http/ngx_http_variables.c @ 5815:6c99c5f00fc9

Variables: fixed non-indexed access of prefix vars (ticket #600). Previously, a configuration like location / { ssi on; ssi_types *; set $http_foo "bar"; return 200 '<!--#echo var="http_foo" -->\n'; } resulted in NULL pointer dereference in ngx_http_get_variable() as the variable was explicitly added to the variables hash, but its get_handler wasn't properly set in the hash. Fix is to make sure that get_handler is properly set by ngx_http_variables_init_vars().
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 27 Aug 2014 21:38:04 +0400
parents e9dbffc18a77
children a08fad30aeac
comparison
equal deleted inserted replaced
5814:a5886df87cbb 5815:6c99c5f00fc9
2509 2509
2510 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { 2510 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {
2511 2511
2512 av = key[n].value; 2512 av = key[n].value;
2513 2513
2514 if (av->get_handler 2514 if (v[i].name.len == key[n].key.len
2515 && v[i].name.len == key[n].key.len
2516 && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len) 2515 && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len)
2517 == 0) 2516 == 0)
2518 { 2517 {
2519 v[i].get_handler = av->get_handler; 2518 v[i].get_handler = av->get_handler;
2520 v[i].data = av->data; 2519 v[i].data = av->data;
2521 2520
2522 av->flags |= NGX_HTTP_VAR_INDEXED; 2521 av->flags |= NGX_HTTP_VAR_INDEXED;
2523 v[i].flags = av->flags; 2522 v[i].flags = av->flags;
2524 2523
2525 av->index = i; 2524 av->index = i;
2525
2526 if (av->get_handler == NULL) {
2527 break;
2528 }
2526 2529
2527 goto next; 2530 goto next;
2528 } 2531 }
2529 } 2532 }
2530 2533