summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_conf.c (follow)
AgeCommit message (Collapse)AuthorFilesLines
2024-04-25configuration: Constify more pointersAndrew Clayton1-20/+23
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-25configuration: Constify numerous pointersAndrew Clayton1-36/+37
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-02-29Configuration: Fix check in nxt_conf_json_parse_value()Andrew Clayton1-1/+1
If we compile Unit with -Wstrict-overflow=5 (as we do with clang) then we get the following warning cc -c -pipe -fPIC -fvisibility=hidden -O0 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wstrict-overflow=5 -Wmissing-prototypes -g -I src -I build/include \ \ \ -o build/src/nxt_conf.o \ -MMD -MF build/src/nxt_conf.dep -MT build/src/nxt_conf.o \ src/nxt_conf.c src/nxt_conf.c: In function ‘nxt_conf_json_parse_value’: src/nxt_conf.c:1444:5: warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Wstrict-overflow] 1444 | if (nxt_fast_path((ch - '0') <= 9)) { | Does this actually cause an issue?... well, yes. Using this minimal test config to show the problem { "listeners": { "[::1]:8080": { "pass": --100 } } } With the above if () statement that triggers the warning, my assumption here is that we only want a digit now. '0' - '9'. ch is a u_char, however if ch is any character with an ASCII code < 48 ('0') e.g if ch is '-' (45) then we get 45 - 48 = -3, through arithmetic conversion, which makes the if () statement true (when it shouldn't) then at some point we get the following error returned from the controller { "error": "Memory allocation failed." } Instead of the expected { "error": "Invalid JSON.", "detail": "A valid JSON value is expected here. It must be either a literal (null, true, or false), a number, a string (in double quotes \"\"), an array (with brackets []), or an object (with braces {}).", "location": { "offset": 234, "line": 15, "column": 27 } } Casting the result of (ch - '0') to u_char resolves this issue, this makes the above calculation come out as 253 (relying on unsigned integer wraparound) which was probably the intended way for it to work. Reviewed-by: Zhidao Hong <z.hong@f5.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-05Configuration: Add nxt_conf_get_string_dup()Alejandro Colomar1-0/+11
This function is like nxt_conf_get_string(), but creates a new copy, so that it can be modified without corrupting the configuration string. Reviewed-by: Andrew Clayton <a.clayton@nginx.com> Cc: Zhidao Hong <z.hong@f5.com> Signed-off-by: Alejandro Colomar <alx@kernel.org>
2023-04-24Remove an erroneous semi-colon.Andrew Clayton1-1/+1
Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-11-04Removed the unsafe nxt_memcmp() wrapper for memcmp(3).Alejandro Colomar1-3/+3
The casts are unnecessary, since memcmp(3)'s arguments are 'void *'. It might have been necessary in the times of K&R, where 'void *' didn't exist. Nowadays, it's unnecessary, and _very_ unsafe, since casts can hide all classes of bugs by silencing most compiler warnings. The changes from nxt_memcmp() to memcmp(3) were scripted: $ find src/ -type f \ | grep '\.[ch]$' \ | xargs sed -i 's/nxt_memcmp/memcmp/' Reviewed-by: Andrew Clayton <a.clayton@nginx.com> Signed-off-by: Alejandro Colomar <alx@nginx.com>
2022-08-29Implemented basic statistics API.Valentin Bartenev1-0/+14
2022-06-22Constified numerous function parameters.Andrew Clayton1-5/+5
As was pointed out by the cppcheck[0] static code analysis utility we can mark numerous function parameters as 'const'. This acts as a hint to the compiler about our intentions and the compiler will tell us when we deviate from them. [0]: https://cppcheck.sourceforge.io/
2022-04-26Added new array APIs that also work with non-arrays.Alejandro Colomar1-0/+26
Similar to how C pointers to variables can always be considered as pointers to the first element of an array of size 1 (see the following code for an example of how they are equivalent), treating non-NXT_CONF_VALUE_ARRAY as if they were NXT_CONF_VALUE_ARRAYs of size 1 allows for simpler and more generic code. void foo(ptrdiff_t sz, int arr[sz]) { for (ptrdiff_t i = 0; i < sz; i++) arr[i] = 0; } void bar(void) { int x; int y[1]; foo(1, &x); foo(1, y); } nxt_conf_array_elements_count_or_1(): Similar to nxt_conf_array_elements_count(). Return a size of 1 when input is non-array, instead of causing undefined behavior. That value (1) makes sense because it will be used as the limiter of a loop that loops over the array and calls nxt_conf_get_array_element_or_itself(), which will return a correct element for such loops. nxt_conf_get_array_element_or_itself(): Similar to nxt_conf_get_array_element(). Return the input pointer unmodified (i.e., a pointer to the unique element of a hypothetical array), instead of returning NULL, which wasn't very useful. nxt_conf_array_qsort(): Since it's a no-op for non-arrays, this API can be reused.
2022-04-26Added 'const' for read-only function parameter.Alejandro Colomar1-1/+2
That parameter is not being modified in the function. Make it 'const' to allow passing 'static const' variables.
2020-04-01Fixed build with Clang 10, broken by 32578e837322.Valentin Bartenev1-1/+3
This silences the -Wimplicit-int-float-conversion warning.
2020-03-30Configuration: support for rational numbers.Valentin Bartenev1-158/+99
2020-03-25Configuration: fixed comments parsing.Valentin Bartenev1-1/+5
Unclosed multi-line comments and "/" at the end of JSON shouldn't be allowed.
2020-02-20Configuration: stripping comments from the input JSON.Valentin Bartenev1-6/+66
This allows to have JavaScript-like comments in the uploading JSON.
2019-10-11Fixed passing false in namespace flags.Tiago Natel1-0/+7
This patch closes #328 in github.
2019-09-18Configuration: added ability to modify object members with slashes.Valentin Bartenev1-39/+49
Example: PUT/POST/DELETE /config/listeners/unix:%2Fpath%2Fto%2Fsocket This follows a49ee872e83d.
2019-09-16Configuration: added ability to access object members with slashes.Valentin Bartenev1-0/+15
Now URI encoding can be used to escape "/" in the request path: GET /config/listeners/unix:%2Fpath%2Fto%2Fsocket/
2019-04-24Configuration: support for POST operations on arrays.Valentin Bartenev1-11/+36
It allows to add an array element without specifying the index.
2019-04-24Configuration: support for manipulations of array elements.Valentin Bartenev1-29/+141
Now PUT and DELETE operations also work on elements. This closes #242 issue on GitHub.
2019-04-24Refactored nxt_conf_op_compile().Valentin Bartenev1-7/+8
Now index is always initialized for create operations. The changes in nxt_conf_op_compile() simplify adding upcoming support of operations with arrays. No functional changes.
2019-04-24Removed unused field from nxt_conf_op_s.Valentin Bartenev1-2/+1
2019-02-26Introduced nxt_conf_array_qsort().Igor Sysoev1-0/+16
2019-02-26Introduced nxt_conf_array_elements_count().Igor Sysoev1-0/+7
2018-11-15Fixed discovering of modules on 64-bit big-endian systems.Valentin Bartenev1-1/+1
The nxt_conf_map_object() function used nxt_int_t for NXT_CONF_MAP_INT, which was 8 bytes long on 64-bit systems. But the nxt_port_main_start_worker_handler() used it to map into the int field of the nxt_common_app_conf_t structure, which was 4 bytes. As the result, on a 64-bit big-endian system all the meaningful module type numbers were assigned into the gap above the "type" field. The bug was discovered on IBM/S390x.
2018-09-20Controller: addressing of array elements in requests.Valentin Bartenev1-1/+20
2018-09-20Controller: certificates storage interface.Valentin Bartenev1-0/+99
2018-09-20Deduplicated string value initializations.Valentin Bartenev1-64/+22
2018-06-25Introduced nxt_length() macro.Valentin Bartenev1-4/+4
2018-04-04Style: capitalized letters in hexadecimal literals.Valentin Bartenev1-7/+7
2018-03-29nxt_lvlhsh_each() refactoring and nxt_lvlhsh_each_init().Igor Sysoev1-2/+1
2018-01-29Introducing extended app process management.Max Romanov1-0/+7
- Pre-fork 'processes.spare' application processes; - fork more processes to keep 'processes.spare' idle processes; - fork on-demand up to 'processes.max' count; - scale down idle application processes above 'processes.spare' after 'processes.idle_timeout'; - number of concurrently started application processes also limited by 'processes.spare' (or 1, if spare is 0).
2017-11-21Fixed crash on invalid JSON number.Valentin Bartenev1-0/+4
2017-09-15Introducing application timeout.Max Romanov1-1/+1
2017-09-12Fixed error messages grammar.Nick Shadrin1-49/+48
2017-08-16Introduced nxt_conf_get_array_element().Valentin Bartenev1-0/+19
2017-08-16Object mapping interface extended with more string types.Valentin Bartenev1-6/+41
2017-08-15Fixed building on ppc.Valentin Bartenev1-1/+1
2017-08-11Controller: more HTTP headers and detailed JSON parsing errors.Valentin Bartenev1-37/+320
2017-08-11Fixed parsing of JSON encoded UTF-16 surrogate pairs.Valentin Bartenev1-16/+13
2017-08-08Fixed JSON escape sequence parsing.Valentin Bartenev1-2/+4
2017-08-02Using old-style packed attribute specification for compatibility.Max Romanov1-4/+4
2017-07-25Fixed building on Solaris by Sun C.Max Romanov1-2/+2
2017-07-18Configuration: improved declaration of short strings.Valentin Bartenev1-10/+14
2017-07-18Configuration: reduced memory consumption of long strings.Valentin Bartenev1-24/+33
2017-07-18Configuration: reduced memory consumption.Valentin Bartenev1-4/+4
2017-07-10Configuration: nxt_conf_map_object() improvements.Valentin Bartenev1-14/+9
2017-07-07Controller: relaxed JSON parser.Valentin Bartenev1-80/+72
Now it allows commas after the last elements in objects and arrays, as it's a common Igor's mistake.
2017-07-06Controller: sending JSON configuration to router.Valentin Bartenev1-1/+65
2017-07-06Fixed mapping of int32_t in nxt_conf_map_object().Valentin Bartenev1-1/+1
2017-07-05Configuration: basic validation of schema.Valentin Bartenev1-51/+85