Opened 4 years ago

Closed 4 years ago

#1140 closed defect (invalid)

ssi module ignores "default" parameter of echo

Reported by: florian.dold@… Owned by:
Priority: minor Milestone:
Component: other Version: 1.11.x
Keywords: Cc:
uname -a: Linux 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.10.1
built with OpenSSL 1.0.2i 22 Sep 2016 (running with OpenSSL 1.0.2j 26 Sep 2016)
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-7jgWGO/nginx-1.10.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-7jgWGO/nginx-1.10.1/debian/modules/nginx-auth-pam --add-module=/build/nginx-7jgWGO/nginx-1.10.1/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-7jgWGO/nginx-1.10.1/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-7jgWGO/nginx-1.10.1/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-7jgWGO/nginx-1.10.1/debian/modules/ngx_http_substitutions_filter_module

Description

When using

<!--# echo var="name" default="no" -->

the default is never considered.

The bug is in ngx_http_ssi_echo, where it returns with an error from the function when the variable is not found by ngx_http_get_variable. The default is never considered.

// ngx_http_ssi_filter_module.c:2264
if (value == NULL) {
    vv = ngx_http_get_variable(r, var, key);

    if (vv == NULL) {
        return NGX_HTTP_SSI_ERROR;
    }

    if (!vv->not_found) {
        text.data = vv->data;
        text.len = vv->len;
        value = &text;
    }
}

Change History (1)

comment:1 by Maxim Dounin, 4 years ago

Resolution: invalid
Status: newclosed

Works fine here:

location = / {
    ssi on;
    ssi_types *;
    return 200 '<!--#echo var="arg_foo" default="test" -->\n';
}
$ curl -s http://127.0.0.1:8081/
test
$ curl -s http://127.0.0.1:8081/?foo=bar
bar

Note that the check in question, if (vv == NULL), is about checking for fatal errors like allocation failures. The default is used when the variable is not found, see the

    if (value == NULL) {
        value = params[NGX_HTTP_SSI_ECHO_DEFAULT];

block below.

Note: See TracTickets for help on using tickets.