Opened 6 weeks ago

Closed 6 weeks ago

#2381 closed defect (wontfix)

Unable to read configuration from /dev/stdin

Reported by: moronizzz@… Owned by:
Priority: minor Milestone:
Component: nginx-core Version: 1.23.x
Keywords: test configuration Cc: moronizzz@…
uname -a: Linux hostname 5.10.0-17-amd64 #1 SMP Debian 5.10.136-1 (2022-08-13) x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.23.1
built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
built with OpenSSL 1.1.1n 15 Mar 2022
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -ffile-prefix-map=/data/builder/debuild/nginx-1.23.1/debian/debuild-base/nginx-1.23.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

Description

GNU bash, version 5.1.4
nginx version: nginx/1.23.1

There is an error when I try to test configuration from /dev/stdin

$ nginx -prefix=/etc/nginx -t -c /dev/stdin <<< "events {}"
nginx: the configuration file /dev/stdin syntax is ok
nginx: [emerg] no "events" section in configuration
nginx: configuration file /dev/stdin test failed

Configuration validation using /dev/stdin worked earlier e.g.

GNU bash, version 4.4.12
nginx version: nginx/1.19.6
Linux hostname 4.9.0-9-amd64 SMP Debian 4.9.168-1+deb9u3 (2019-06-16) x86_64 GNU/Linux

$ nginx -prefix=/etc/nginx -t -c /dev/stdin <<< "events {}"
nginx: the configuration file /dev/stdin syntax is ok
nginx: configuration file /dev/stdin test is successful

Change History (1)

comment:1 by Maxim Dounin, 6 weeks ago

Resolution: wontfix
Status: newclosed

Since nginx expects configuration file to be a real file and, in particular, uses its size while parsing, it is not possible to use configuration provided via stdin.

Most likely this worked for you because bash used to provide here-documents in temporary files (see here for details), but not anymore. For example, bash 5.1.8 on Ubuntu 21.10 uses pipe() instead, at least in some cases:

$ strace -f bash -c "cat <<< foo"
...
[pid 37903] pipe([3, 4])                = 0
[pid 37903] fcntl(4, F_GETPIPE_SZ)      = 65536
[pid 37903] write(4, "foo\n", 4)        = 4
[pid 37903] close(4)                    = 0
[pid 37903] dup2(3, 0)                  = 0
[pid 37903] close(3)                    = 0
[pid 37903] execve("/usr/bin/cat", ["cat"], 0x56523a61d550 /* 23 vars */) = 0
...

To fix this, consider providing appropriate temporary configuration files yourself, instead of relying on non-documented and not guaranteed shell behaviour.

Note: See TracTickets for help on using tickets.