Commit graph

2654 commits

Author SHA1 Message Date
Ava Hahn
6e8f7bbb91 tools/unitctl: Initial Docker Procedures
* move UnitdProcess serialization logic into UnitdProcess
* filter out docker processes from process output on Linux
* initial implementation of a UnitdContainer type
* initial implementation of a docker container search for unitd
* pull out custom openapi future executor and use same tokio
  runtime as docker client
* refactor openapi client to not manage its own tokio runtime
* process mount points per docker container
* correctly output docker container info in relevant unitd
  instances
* create UnitdProcess from UnitdContainer
* UnitdProcess now owns UnitdContainer
* get and parse container details from docker API
* introduce procedure to rewrite file paths based on docker
  container mounts
* test path rewrite facilities
* apply path rewrite to unix socket

Signed-off-by: Ava Hahn <a.hahn@f5.com>
2024-05-08 13:30:08 -07:00
Andrew Clayton
5d1ce5c447 auto, perl: Fix building the Perl language module with clang
When we added -fno-strict-overflow to the CFLAGS back in c1e3f02f9
("Compile with -fno-strict-overflow") we inadvertently broke building
the Perl language module with clang, e.g

  $ make
    CC     build/src/perl/nxt_perl_psgi-perl.o
  clang: error: argument unused during compilation: '-fno-strict-overflow' [-Werror,-Wunused-command-line-argument]

This is due to for example on Apline

  $ perl -MExtUtils::Embed -e ccflags
   -D_REENTRANT -D_GNU_SOURCE -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

Where on clang the -fwrapv causes the -fno-strict-overflow to be
discarded resulting in the above error.

We can get around that by simply appending -Qunused-arguments to the
Perl CFLAGS.

This fixes things for _some_ systems, as there is actually another issue
with building this with clang on Fedora (and probably Red Hat) in that
there the Perl ccflags & ldopts have been heavily modified and uses
flags simply not only not in clang (which we can work around as above)
but also incompatible flags, e.g

  $ make perl
    CC     build/src/perl/nxt_perl_psgi-perl.o
  clang: error: optimization flag '-ffat-lto-objects' is not supported [-Werror,-Wignored-optimization-argument]

There doesn't seem to be an easy workaround like -Qunused-arguments for
this.

While we could work around it in some way, I'm not sure it's worth the
effort right now. On Red Hat & Fedora GCC _is_ the system compiler.

This could be revisited if we find people trying to build this on
Red Hat/Fedora with clang...

For comparison this is the Alpine Perl ccflags & ldops

$ perl -MExtUtils::Embed -e ccflags
 -D_REENTRANT -D_GNU_SOURCE -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 alpine:~$
$ perl -MExtUtils::Embed -e ldopts
-rdynamic -Wl,-rpath,/usr/lib/perl5/core_perl/CORE  -fstack-protector-strong -L/usr/local/lib  -L/usr/lib/perl5/core_perl/CORE -lperl -lpthread -ldl -lm -lcrypt -lutil -lc

Fedora

$ perl -MExtUtils::Embed -e ccflags
 -D_REENTRANT -D_GNU_SOURCE -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
$ perl -MExtUtils::Embed -e ldopts
-Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1  -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1  -fstack-protector-strong -L/usr/local/lib  -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc

Fixes: c1e3f02f9 ("Compile with -fno-strict-overflow")
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-05-07 17:36:35 +01:00
Andrew Clayton
e2a09c7742 Convert 0-sized arrays to true flexible array members
Declaring a 0-sized array (e.g 'char arr[0];') as the last member of a
structure is a GNU extension that was used to implement flexible array
members (FAMs) before they were standardised in C99 as simply '[]'.

The GNU extension itself was introduced to work around a hack of
declaring 1-sized arrays to mean a variable-length object. The advantage
of the 0-sized (and true FAMs) is that they don't count towards the size
of the structure.

Unit already declares some true FAMs, but it also declared some 0-sized
arrays.

Converting these 0-sized arrays to true FAMs is not only good for
consistency but will also allow better compiler checks now (as in a C99
FAM *must* be the last member of a structure and the compiler will warn
otherwise) and in the future as doing this fixes a bunch of warnings
(treated as errors in Unit by default) when compiled with

  -O2 -Warray-bounds -Wstrict-flex-arrays -fstrict-flex-arrays=3

(Note -Warray-bounds is enabled by -Wall and -Wstrict-flex-arrays seems
to also be enabled via -Wall -Wextra, the -02 is required to make
-fstrict-flex-arrays more effective, =3 is the default on at least GCC
14)

such as

  CC     build/src/nxt_upstream.o
src/nxt_upstream.c: In function ‘nxt_upstreams_create’:
src/nxt_upstream.c:56:18: error: array subscript i is outside array bounds of ‘nxt_upstream_t[0]’ {aka ‘struct nxt_upstream_s[]’} [-Werror=array-bounds=]
   56 |         string = nxt_str_dup(mp, &upstreams->upstream[i].name, &name);
      |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from src/nxt_upstream.c:9:
src/nxt_upstream.h:55:48: note: while referencing ‘upstream’
   55 |     nxt_upstream_t                             upstream[0];
      |                                                ^~~~~~~~

Making our flexible array members proper C99 FAMs and ensuring any >0
sized trailing arrays in structures are really normal arrays will allow
to enable various compiler options (such as the above and more) that
will help keep our array usage safe.

Changing 0-sized arrays to FAMs should have no effect on structure
layouts/sizes (they both have a size of 0, although doing a sizeof() on
a FAM will result in a compiler error).

Looking at pahole(1) output for the nxt_http_route_ruleset_t structure
for the [0] and [] cases...

$ pahole -C nxt_http_route_ruleset_t /tmp/build/src/nxt_http_route.o
typedef struct {
        uint32_t           items;                /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        nxt_http_route_rule_t * rule[];          /*     8     0 */

        /* size: 8, cachelines: 1, members: 2 */
        /* sum members: 4, holes: 1, sum holes: 4 */
        /* last cacheline: 8 bytes */
} nxt_http_route_ruleset_t;
$ pahole -C nxt_http_route_ruleset_t build/src/nxt_http_route.o
typedef struct {
        uint32_t           items;                /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        nxt_http_route_rule_t * rule[];          /*     8     0 */

        /* size: 8, cachelines: 1, members: 2 */
        /* sum members: 4, holes: 1, sum holes: 4 */
        /* last cacheline: 8 bytes */
} nxt_http_route_ruleset_t;

Also checking with the size(1) command on the effected object files
shows no changes to their sizes

$ for file in build/src/nxt_upstream.o \
	build/src/nxt_upstream_round_robin.o \
	build/src/nxt_h1proto.o \
	build/src/nxt_http_route.o \
	build/src/nxt_http_proxy.o \
	build/src/python/*.o; do \
	size -G /tmp/${file} $file; echo; done
      text       data        bss      total filename
       640        418          0       1058 /tmp/build/src/nxt_upstream.o
       640        418          0       1058 build/src/nxt_upstream.o

      text       data        bss      total filename
       929        351          0       1280 /tmp/build/src/nxt_upstream_round_robin.o
       929        351          0       1280 build/src/nxt_upstream_round_robin.o

      text       data        bss      total filename
     11707       8281         16      20004 /tmp/build/src/nxt_h1proto.o
     11707       8281         16      20004 build/src/nxt_h1proto.o

      text       data        bss      total filename
      8319       3101          0      11420 /tmp/build/src/nxt_http_route.o
      8319       3101          0      11420 build/src/nxt_http_route.o

      text       data        bss      total filename
      1495       1056          0       2551 /tmp/build/src/nxt_http_proxy.o
      1495       1056          0       2551 build/src/nxt_http_proxy.o

      text       data        bss      total filename
      4321       2895          0       7216 /tmp/build/src/python/nxt_python_asgi_http-python.o
      4321       2895          0       7216 build/src/python/nxt_python_asgi_http-python.o

      text       data        bss      total filename
      4231       2266          0       6497 /tmp/build/src/python/nxt_python_asgi_lifespan-python.o
      4231       2266          0       6497 build/src/python/nxt_python_asgi_lifespan-python.o

      text       data        bss      total filename
     12051       6090          8      18149 /tmp/build/src/python/nxt_python_asgi-python.o
     12051       6090          8      18149 build/src/python/nxt_python_asgi-python.o

      text       data        bss      total filename
        28       1963        432       2423 /tmp/build/src/python/nxt_python_asgi_str-python.o
        28       1963        432       2423 build/src/python/nxt_python_asgi_str-python.o

      text       data        bss      total filename
      5818       3518          0       9336 /tmp/build/src/python/nxt_python_asgi_websocket-python.o
      5818       3518          0       9336 build/src/python/nxt_python_asgi_websocket-python.o

      text       data        bss      total filename
      4391       2089        168       6648 /tmp/build/src/python/nxt_python-python.o
      4391       2089        168       6648 build/src/python/nxt_python-python.o

      text       data        bss      total filename
      9095       5909        152      15156 /tmp/build/src/python/nxt_python_wsgi-python.o
      9095       5909        152      15156 build/src/python/nxt_python_wsgi-python.o

Link: <https://lwn.net/Articles/908817/>
Link: <https://people.kernel.org/kees/bounded-flexible-arrays-in-c>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-05-07 02:46:49 +01:00
Andrew Clayton
5b01bd652a auto/wasm: No need to explicitly set -fno-strict-aliasing now
Since commit 0b5223e1c ("Disable strict-aliasing in clang by default")
we explicitly always build with -fno-strict-aliasing so there's no need
to set it independently in auto/modules/wasm

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-05-07 02:43:24 +01:00
Andrew Clayton
ff2e0f4223 Add a GitHub workflow to check for whitespace issues
If it fails you can check the 'git log --check' output of the workflow
to see what the issue is. E.g

  --- 93ec0133 Oops...
  README.md:1: trailing whitespace.
  +# NGINX Unit

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-05-02 14:19:32 +01:00
Taryn Musgrave
2c4502f8b6 tools: Add unitctl section to the README
Co-developed-by: Ava Hahn <a.hahn@f5.com>
Signed-off-by: Ava Hahn <a.hahn@f5.com>
[ Tweak subject and cli => unitctl in README - Andrew ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-30 09:14:55 -07:00
Ava Hahn
db3cf3e42d tools: Add unitctl CLI
* Pull in entire unit-rust-sdk project
  * not included: CLA, COC, License
  * not included: duplicate openapi spec
  * not included: CI workflows
  * not included: changelog tooling
  * not included: commitsar tooling
  * not included: OpenAPI Web UI feature
* update links in unitctl manpage
* remove IDE configuration from .gitignore
* rename Containerfile.debian to Dockerfile
* simplify call to uname
* keep Readmes and Makefiles to 80 character lines
* outline specifically how to build unitctl
  for any desired target, and where to then
  find the binary for use
* remove a section on the vision of the CLI
  which was superfluous given the state of
  completeness of the code and its use in
  unit
* remove out of date feature proposals from readme
* makefile: do not run when Rustup is not present
* bump mio version to latest
* generate openapi client library on demand
  * generate-openapi only runs when not present
  * generate-openapi now a dependency of binary build targets
  * deleted autogenerated code
  * reverted readme and Cargo document to autogenerated state
  * add additional build requirement to Readme

Co-developed-by: Elijah Zupancic <e.zupancic@f5.com>
Signed-off-by: Elijah Zupancic <e.zupancic@f5.com>
Signed-off-by: Ava Hahn <a.hahn@f5.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com> # non rust stuff
[ tools/cli => tools/unitctl and subject tweak - Andrew ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-30 09:14:55 -07:00
Andrew Clayton
b26c119f4e Tighten up some string arrays
This is the normal way of declaring such things.

Reviewed-by: Zhidao HONG <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-25 15:15:28 +01:00
Andrew Clayton
31cec908cd configuration: Constify more pointers
This continues the patch series constifying various pointers in the
configuration sub-system.

This is done as a separate commit as it involved a _slightly_ more
invasive change in nxt_conf_get_string().

While it takes a value parameter that is never modified, simply making
it const results in

  CC     build/src/nxt_conf.o
src/nxt_conf.c: In function ‘nxt_conf_get_string’:
src/nxt_conf.c:170:20: error: assignment discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
  170 |         str->start = value->u.str.start;
      |                    ^

due to the assignment operator. Making value const will allow for
numerous other constification and seeing as we are not modifying it,
seems worthwhile.

We can get around the warning by casting ->u.{str,string}.start

Reviewed-by: Zhidao HONG <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-25 15:15:19 +01:00
Andrew Clayton
33c978cc24 php: Constify some local static variables
A common pattern was to declare variables in functions like

  static nxt_str_t ...

Not sure why static, as they were being treated more like string
literals, let's actually make them constants (qualifier wise).

Reviewed-by: Zhidao HONG <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-25 15:15:15 +01:00
Andrew Clayton
8f861cf4d1 Constify a bunch of static local variables
A common pattern was to declare variables in functions like

  static nxt_str_t ...

Not sure why static, as they were being treated more like string
literals (and of course they are _not_ thread safe), let's actually make
them constants (qualifier wise).

This handles core code conversion.

Reviewed-by: Zhidao HONG <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-25 15:15:09 +01:00
Andrew Clayton
e5bc299d7a configuration: Constify numerous pointers
Mark numerous function argument pointers as 'const' in the configuration
sub-system.

This also does the same with a few functions in
src/nxt_conf_validation.c that are required to accomplish the below,
attacking the rest is an exercise for another day...

While this is a worthwhile hardening exercise in its own right, the main
impetus for this is to 'constify' some local function variables which
are currently defined with 'static' storage class and turn them into
'static const', which will be done in a subsequent patch.

Reviewed-by: Zhidao HONG <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-25 15:14:50 +01:00
Andrew Clayton
3fbca6ca67 Fix some trailing whitespace and long lines in the README
Fixes: a48fbc035 ("Add additional information to the README")
Reviewed-by: Ava Hahn <a.hahn@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-23 19:33:45 +01:00
dependabot[bot]
237a26aafc wasm-wc: Bump the rustls crate from 0.21.10 to 0.21.11
Bumps <https://github.com/rustls/rustls> from 0.21.10 to 0.21.11.

"This release corrects a denial-of-service condition in
rustls::ConnectionCommon::complete_io(), reachable via network input. If
a close_notify alert is received during a handshake, complete_io() did
not terminate. Callers which do not call complete_io() are not
affected."

The wasm-wasi-component language module is not effected by this as it
doesn't handle client connections, Unit does.

Link: Release notes <https://github.com/rustls/rustls/releases>
Link: Commits <https://github.com/rustls/rustls/compare/v/0.21.10...v/0.21.11>
Signed-off-by: dependabot[bot] <support@github.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
[ Tweaked commit message/subject - Andrew ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-19 22:30:49 +01:00
Ava Hahn
d7ce356957 Elaborate on docker image differences
* This commit adds a warning to readers to clarify that they should
  be aware of our different image tags before pulling their image.
2024-04-18 16:56:45 -07:00
Ava Hahn
a48fbc035c Add additional information to the README
* expand on docker instructions
* identify API documentation
* identify WASM documentation

Acked-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Ava Hahn <a.hahn@f5.com>
2024-04-18 16:56:45 -07:00
Zhidao HONG
678c056869 Fixes: 64934e59f ("HTTP: Introduce quoted target marker in HTTP parsing")
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-17 15:47:08 +08:00
Zhidao HONG
a4dbee147c HTTP: Rewrote url target section in nxt_h1p_peer_header_send()
Previously, proxy request was constructed based on the `r->target`
field. However, r->target will remain unchanged in the future,
even in cases of URL rewriting because of the requirement change
for $request_uri that will be changed to constant.
To accommodate this, the r->target should be designed to be constant,
but Unit needs to pass a changeable URL to the upstream server.
Based on the above, the proxy module can't depend on r->target.
2024-04-11 22:23:23 +08:00
Zhidao HONG
64934e59f9 HTTP: Introduce quoted target marker in HTTP parsing
The quoted_target field is to indentify URLs containing
percent-encoded characters. It can be used in places
where you might need to generate new URL, such as in the
proxy module.
It will be used in the subsequent commit.
2024-04-11 22:23:09 +08:00
Andrei Zeliankou
626977730f Tests: error report corrected for unknown variables in "response_headers"
For more information please see https://github.com/nginx/unit/pull/1191
2024-04-10 17:04:30 +01:00
Zhidao HONG
2d7a846843 HTTP: Added variable validation to the response_headers option
This is to improve error messages for response headers configuration.
Take the configuration as an example:

  {
      "response_headers": {
          "a": "$b"
      }
  }

Previously, when applying it the user would see this error message:

  failed to apply previous configuration

After this change, the user will see this improved error message:

  the previous configuration is invalid: Unknown variable "b" in the "a" value
2024-04-10 23:21:21 +08:00
Andrei Zeliankou
a625a0b1f0 Tests: compatibility with OpenSSL 3.2.0
OpenSSL 3.2.0 generates X.509v3 certificates by default. These
certificates, even self-signed, cannot sign other certificates unless
"CA:TRUE" is explicitly set in the basicConstraints extension.
As a result, tests attempting this are currently failing.

Fix is to provide "CA:TRUE" in the basicConstraints for self-signed root
certificates used in "openssl ca" commands.

Closes: https://github.com/nginx/unit/issues/1202
Tested-by: Andrew Clayton <a.clayton@nginx.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-10 14:28:35 +01:00
Andrei Zeliankou
5f60674243 Tests: added $request_uri tests with proxy
This patch consist of 3 tests:

 1. Ensure that $request_uri won't change while proxying the request.
 2. Same as 1, but modifying the request using the "rewrite" directive.
 3. Same as 2,  but with rewrite containing a percent-encoded string.
2024-04-10 13:34:11 +01:00
Andrei Zeliankou
6e79da4730 Docs: njs (lowercase) is more preferred way to mention 2024-04-10 13:30:02 +01:00
Andrei Zeliankou
e6d8fc6614 njs (lowercase) is more preferred way to mention 2024-04-10 13:30:02 +01:00
dependabot[bot]
d494d2ebb7 Wasm-wc: Bump the h2 crate from 0.4.2 to 0.4.4
Bumps h2 <https://github.com/hyperium/h2> from 0.4.2 to 0.4.4.

Limit number of CONTINUATION frames for misbehaving connections.

Link: Changelog <https://github.com/hyperium/h2/blob/master/CHANGELOG.md>
Link: Commits <https://github.com/hyperium/h2/compare/v0.4.2...v0.4.4>
Signed-off-by: dependabot[bot] <support@github.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
[ Tweaked commit message/subject - Andrew ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-04-09 03:15:35 +01:00
Andrew Clayton
e75f8d5db2 Wasm-wc: Fix application restarts
Liam reported a problem when trying to restart wasm-wasi-component based
applications using the /control/applications/APPLICATION_NAME/restart
endpoint.

The application would become unresponsive.

What was happening was the old application process(es) weren't
exit(3)ing and so while we were starting new application processes, the
old ones were still hanging around in a non-functioning state.

When we are terminating an application it must call exit(3).

So that's what we do. We use the return value of nxt_unit_run() as the
exit status.

Due to exit(3)ing we also need to now explicitly handle the return on
error case.

Reported-by: Liam Crilly <liam@nginx.com>
Fixes: 20ada4b5c ("Wasm-wc: Core of initial Wasm component model language module support")
Closes: https://github.com/nginx/unit/issues/1179
Tested-by: Liam Crilly <liam@nginx.com>
Tested-by: Danielle De Leo <d.deleo@f5.com>
Co-developed-by: Dan Callahan <d.callahan@f5.com>
Signed-off-by: Dan Callahan <d.callahan@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-14 16:09:31 +00:00
Andrew Clayton
a8cfea8b68 Rebuild wasm-wasi-component when any of its dependencies change
Have cargo run if for example src/wasm-wasi-component/src/lib.rs is
changed, or any of the other files that should perhaps trigger a
rebuild.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-14 16:09:31 +00:00
Alejandro Colomar
b65e49c5d6 Build with -std=gnu11 (C11 with GNU extensions)
Currently Unit doesn't specify any specific C standard for compiling and
will thus be compiled under whatever the compiler happens to default to.

Current releases of GCC and Clang (13.x & 17.x respectively at the time
of writing) default to gnu17 (C17 + GNU extensions).

Our oldest still-supported system is RHEL/CentOS 7, that comes with GCC
4.8.5 which defaults to gnu90.

Up until now this hasn't really been an issue and we have been able to
use some C99 features that are implemented as GNU extensions in older
compilers, e.g

  -  designated initializers
  -  flexible array members
  -  trailing comma in enum declaration (compiles with -std=c89, warns
     with -std=c89 -pedantic)
  -  snprintf(3)
  -  long long (well we test for it but don't actually use it)
  -  bool / stdbool.h
  -  variadic macros

However there are a couple of C99 features that aren't GNU extensions
that would be handy to be able to use, i.e

 -  The ability to declare variables inside for () loops, e.g

        for (int i = 0; ...; ...)

 -  C99 inline functions (not to be confused with what's available with
    -std=gnu89).

However, if we are going to switch up to C99, then perhaps we should
just leap frog to C11 instead (the Linux Kernel did in fact make the
switch from gnu89 to gnu11 in March '22). C17 is perhaps still a little
new and is really just C11 + errata.

GCC 4.8 as in RHEL 7 has *some* support for C11, so while we can make
full use of C99, we couldn't yet make full use of C11, However RHEL 7 is
EOL on June 30th 2024, after which we will no longer have that
restriction and in the meantime we can restrict ourselves to the
supported set of features (or implement fallbacks where appropriate).

It can only be a benefit that we would be compiling Unit consistently
under the same language standard.

This will also help give the impression that Unit is a modern C code
base.

It is also worth noting the following regarding GCC

 "A version with corrections integrated was prepared in 2017 and published
  in 2018 as ISO/IEC 9899:2018; it  is known as C17 and is supported with
  -std=c17 or -std=iso9899:2017; the corrections are also applied with -
  std=c11, and the only difference between the options is the value of
  STDC_VERSION."

Suggested-by: Andrew Clayton <a.clayton@nginx.com>
Acked-by: Andrew Clayton <a.clayton@nginx.com>
[ Andrew wrote the commit message ]
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Link: <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e8c07082a810fbb9db303a2b66b66b8d7e588b53>
Link: <https://www.ibm.com/blog/announcement/ibm-is-announcing-red-hat-enterprise-linux-7-is-going-end-of-support-on-30-june-2024/>
Link: <https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Standards.html#C-Language>
Cc: Dan Callahan <d.callahan@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-13 16:29:24 +00:00
Andrew Clayton
7472a2ca24 Add a GitHub workflow status badge for our CI to the README
This shows the current state of our CI builds and points to the Unit
workflows page.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-13 02:11:30 +00:00
Andrew Clayton
dc16a7bc17 Add a repostatus badge to the README
This is set to 'active' and is described here
<https://www.repostatus.org/>

This is now a requirement of F5/NGINX OSS projects.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-13 02:11:30 +00:00
Andrei Zeliankou
0716b0c752 Tests: NJS cacheable variables with access log
Reproduces issue https://github.com/nginx/unit/issues/1169.
2024-03-12 18:37:46 +00:00
Andrei Zeliankou
9993814d14 NJS: loader should be registered using njs_vm_set_module_loader()
This change makes NJS module incompatible with NJS older than 0.8.3.
Therefore, the configuration version check has been adjusted accordingly.

This change was introduced in NJS 0.8.3 here:
<https://hg.nginx.com/njs/rev/ad1a7ad3c715>
2024-03-12 16:56:11 +00:00
Andrew Clayton
abcfc4cd68 Fix the security-alert email link in the README
This fixes the security-alert email link to actually open up in an email
client, rather than it trying to make the email link a part of the Unit
repository URL.

Fixes: fa42d858a ("Adding GitHub-styled README and CONTRIBUTING files in
Markdown.")
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 19:44:51 +00:00
Andrei Zeliankou
dd701fb449 Avoiding arithmetic ops with NULL pointer in nxt_unit_mmap_get
Found by UndefinedBehaviorSanitizer.

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Andrei Zeliankou
c9461a6ba8 Initialize port_impl only when it is needed
Found by UndefinedBehaviorSanitizer.

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Andrei Zeliankou
264b375506 Avoiding arithmetic ops with NULL pointer in nxt_port_mmap_get
Can be reproduced by test/test_settings.py::test_settings_send_timeout
with enabled UndefinedBehaviorSanitizer.

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Andrei Zeliankou
7dcd6c0eba Avoiding arithmetic ops with NULL pointer in nxt_http_arguments_parse
Can be reproduced by test/test_variables.py::test_variables_dynamic_arguments
with enabled UndefinedBehaviorSanitizer:

src/nxt_http_request.c:961:17: runtime error: applying zero offset to null pointer
    #0 0x1050d95a4 in nxt_http_arguments_parse nxt_http_request.c:961
    #1 0x105102bf8 in nxt_http_var_arg nxt_http_variables.c:621
    #2 0x104f95d74 in nxt_var_interpreter nxt_var.c:507
    #3 0x104f98c98 in nxt_tstr_query nxt_tstr.c:265
    #4 0x1050abfd8 in nxt_router_access_log_writer nxt_router_access_log.c:194
    #5 0x1050d81f4 in nxt_http_request_close_handler nxt_http_request.c:838
    #6 0x104fcdc48 in nxt_event_engine_start nxt_event_engine.c:542
    #7 0x104fba838 in nxt_thread_trampoline nxt_thread.c:126
    #8 0x18133e030 in _pthread_start+0x84 (libsystem_pthread.dylib:arm64e+0x7030)
    #9 0x181338e38 in thread_start+0x4 (libsystem_pthread.dylib:arm64e+0x1e38)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/nxt_http_request.c:961:17

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Andrei Zeliankou
8844d33c0a Fixed undefined behaviour in left shift of int value
Found by UndefinedBehaviorSanitizer:

src/nxt_random.c:151:31: runtime error: left shift of 140 by 24 places cannot be represented in type 'int'
    #0 0x104f78968 in nxt_random nxt_random.c:151
    #1 0x104f58a98 in nxt_shm_open nxt_port_memory.c:377
    #2 0x10503e24c in nxt_controller_conf_send nxt_controller.c:617
    #3 0x105041154 in nxt_controller_process_request nxt_controller.c:1109
    #4 0x104fcdc48 in nxt_event_engine_start nxt_event_engine.c:542
    #5 0x104f27254 in main nxt_main.c:35
    #6 0x180fbd0dc  (<unknown module>)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/nxt_random.c:151:31

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Andrei Zeliankou
fdc46759eb NJS: avoiding arithmetic ops with NULL pointer in r->args
Can be reproduced by test/test_rewrite.py::test_rewrite_njs
with enabled UndefinedBehaviorSanitizer:

src/nxt_http_js.c:169:52: runtime error: applying zero offset to null pointer
    #0 0x10255b044 in nxt_http_js_ext_get_args nxt_http_js.c:169
    #1 0x102598ad0 in njs_value_property njs_value.c:1175
    #2 0x10259c2c8 in njs_vm_object_prop njs_vm.c:1398
    #3 0x102559d74 in nxt_js_call nxt_js.c:445
    #4 0x1023c0da0 in nxt_tstr_query nxt_tstr.c:276
    #5 0x102516ec4 in nxt_http_rewrite nxt_http_rewrite.c:56
    #6 0x1024fd86c in nxt_http_request_action nxt_http_request.c:565
    #7 0x1024d71b0 in nxt_h1p_request_body_read nxt_h1proto.c:998
    #8 0x1023f5c48 in nxt_event_engine_start nxt_event_engine.c:542
    #9 0x1023e2838 in nxt_thread_trampoline nxt_thread.c:126
    #10 0x18133e030 in _pthread_start+0x84 (libsystem_pthread.dylib:arm64e+0x7030)
    #11 0x181338e38 in thread_start+0x4 (libsystem_pthread.dylib:arm64e+0x1e38)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/nxt_http_js.c:169:52

Same fix was introduced in NJS:
<http://hg.nginx.org/njs/rev/4fba78789fe4>

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Andrei Zeliankou
0d99744deb Router: match when pattern and tested string are both zero length
Otherwise, undefined behaviour will be triggered.

Can be reproduced by test/test_routing.py::test_routes_match_host_empty
with enabled UndefinedBehaviorSanitizer:

src/nxt_http_route.c:2141:17: runtime error: applying zero offset to null pointer
    #0 0x100562588 in nxt_http_route_test_rule nxt_http_route.c:2091
    #1 0x100564ed8 in nxt_http_route_handler nxt_http_route.c:1574
    #2 0x10055188c in nxt_http_request_action nxt_http_request.c:570
    #3 0x10052b1a0 in nxt_h1p_request_body_read nxt_h1proto.c:998
    #4 0x100449c38 in nxt_event_engine_start nxt_event_engine.c:542
    #5 0x100436828 in nxt_thread_trampoline nxt_thread.c:126
    #6 0x18133e030 in _pthread_start+0x84 (libsystem_pthread.dylib:arm64e+0x7030)
    #7 0x181338e38 in thread_start+0x4 (libsystem_pthread.dylib:arm64e+0x1e38)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/nxt_http_route.c:2141:17

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 16:51:35 +00:00
Dylan Arbour
2e61525093 Add dependabot.yml
We already use dependabot for security related patches, by default.

This change adds a dependabot.yml configuration file that explicitly
enables the service to manage versions of Actions in GitHub Actions.
This ensures that Actions like `setup-go` are updated timely.

This change does not affect how Dependabot manages versions for Go,
Rust, etc. The file can be used to configure that for additional
package managers and languages in the future, if desired.
2024-03-11 09:16:27 -04:00
dependabot[bot]
6b13857142 Wasm-wc: Bump the mio crate from 0.8.10 to 0.8.11
Bumps mio <https://github.com/tokio-rs/mio> from 0.8.10 to 0.8.11.

Fixes receiving IOCP events after deregistering a Windows named pipe.

Not that that effects Unit...

Link: <https://github.com/nginx/unit/security/dependabot/1>
Link: Changelog <https://github.com/tokio-rs/mio/blob/master/CHANGELOG.md>
Link: Commits <https://github.com/tokio-rs/mio/compare/v0.8.10...v0.8.11>
Signed-off-by: dependabot[bot] <support@github.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
[ Tweaked commit message/subject - Andrew ]
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-11 12:09:55 +00:00
Andrew Clayton
a171b39922 Add an EXTRA_CFLAGS make variable
This variable is _appended_ to the main CFLAGS variable and allows
setting extra compiler options at make time. E.g

  $ make EXTRA_CFLAGS="..." ...

Useful for quickly testing various extra warning flags.

Suggested-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:40:24 +00:00
Andrew Clayton
f55fa70c69 Add a help target to the root Makefile
This adds a help target to the Makefile in the repository root that
shows what variables are available to control the make/build behaviour.
It currently looks like

  $ make help
  Variables to control make/build behaviour:

    make V=1 ...           - Enables verbose output
    make D=1 ...           - Enables debug builds (-O0)
    make E=0 ...           - Disables -Werror

    Variables can be combined.

Reviewed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:40:24 +00:00
Andrew Clayton
d23812b8f4 Allow to disable -Werror at 'make' time
Having -Werror enabled all the time when developing can be a nuisance,
allow to disable it by passing E=0 to make, e.g

  $ make E=0 ...

This will set -Wno-error overriding the previously set -Werror.

Co-developed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:40:24 +00:00
Andrew Clayton
15072fbde9 Enable optional 'debuggable' builds
One issue you have when trying to debug Unit under say GDB is that at
the default optimisation level we use of -O (-O1) the compiler will
often optimise things out which means they are not available for
inspection in the debugger.

This patch allows you to pass 'D=1' to make, e.g

  $ make D=1 ...

Which will set -O0 overriding the previously set -O, basically disabling
optimisations, we could use -Og, but the clang(1) man page says this is
best and it seems to not cause any issues when debugging GCC generated
code.

Co-developed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:40:18 +00:00
Andrew Clayton
b763ba7ecc Pretty print the wasm language module compiler output
This makes use of the infrastructure introduced in a previous commit, to
pretty print the make output when building the wasm language module.

You can still get the old verbose output with

  $ make V=1 ...

Reviewed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:36:23 +00:00
Andrew Clayton
133f75fd1b Pretty print the Ruby language module compiler output
This makes use of the infrastructure introduced in a previous commit, to
pretty print the make output when building the Ruby language module.

You can still get the old verbose output with

  $ make V=1 ...

Reviewed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:36:23 +00:00
Andrew Clayton
caaa1d288c Pretty print the Python language module compiler output
This makes use of the infrastructure introduced in a previous commit, to
pretty print the make output when building the Python language module.

You can still get the old verbose output with

  $ make V=1 ...

Reviewed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-03-09 01:36:23 +00:00