Lua Variable access bug?

Maxim Dounin mdounin at mdounin.ru
Thu May 17 09:02:14 UTC 2012


Hello!

On Thu, May 17, 2012 at 04:35:24PM +0800, agentzh wrote:

> On Wed, May 16, 2012 at 10:16 AM, Sirsiwal, Umesh <usirsiwal at verivue.com> wrote:
> >
> > I think issue exists because of the way ngx_http_variables_init_vars is
> > written. It changes the flags in the static ngx_http_core_variables variable.
> > During the first configuration read cycle where $http_host is indexed, the
> > flag changes to indexed. During the second configuration read cycle where
> > the the $http_host variable should not be indexed, the flags still remain
> > INDEXED. That confuses ngx_http_get_variable later.
> >
> 
> This is indeed an issue in the nginx core and it should affect other
> modules other than ngx_lua.
> 
> I think the ngx_http_variables_add_core_vars function should pass a
> copy of the ngx_http_variable_t entries in the static variable
> ngx_http_core_variables.
> 
> Could you please try the patch below for nginx 1.0.15? I've confirmed
> that it can also be applied cleanly to nginx 1.2.0.
> 
> Thanks!
> -agentzh
> 
> --- nginx-1.0.15/src/http/ngx_http_variables.c	2012-03-05
> 20:36:51.000000000 +0800
> +++ nginx-1.0.15-patched/src/http/ngx_http_variables.c	2012-05-17
> 16:21:42.120968722 +0800
> @@ -1898,6 +1898,7 @@
>  {
>      ngx_int_t                   rc;
>      ngx_http_variable_t        *v;
> +    ngx_http_variable_t        *value;
>      ngx_http_core_main_conf_t  *cmcf;
> 
>      cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
> @@ -1918,7 +1919,14 @@
>      }
> 
>      for (v = ngx_http_core_variables; v->name.len; v++) {
> -        rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v,
> +        value = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));
> +        if (value == NULL) {
> +            return NGX_ERROR;
> +        }
> +
> +        *value = *v;
> +
> +        rc = ngx_hash_add_key(cmcf->variables_keys, &value->name, value,
>                                NGX_HASH_READONLY_KEY);
> 
>          if (rc == NGX_OK) {

Shouldn't it be

--- a/src/http/ngx_http_variables.c
+++ b/src/http/ngx_http_variables.c
@@ -2072,6 +2072,11 @@ ngx_http_variables_init_vars(ngx_conf_t 
     v = cmcf->variables.elts;
     key = cmcf->variables_keys->keys.elts;
 
+    for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {
+        av = key[n].value;
+        av->flags &= ~NGX_HTTP_VAR_INDEXED;
+    }
+
     for (i = 0; i < cmcf->variables.nelts; i++) {
 
         for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {


instead?

(completely untested)

Maxim Dounin



More information about the nginx-devel mailing list