]> git.ipfire.org Git - thirdparty/nftables.git/commit
src: rework SNPRINTF_BUFFER_SIZE() and handle truncation
authorThomas Haller <thaller@redhat.com>
Tue, 29 Aug 2023 12:53:34 +0000 (14:53 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 29 Aug 2023 17:56:03 +0000 (19:56 +0200)
commite76912b0ec900107b99dffe8fd1c37a845f708b3
tree897cba6b85b72c7ce7bf8999b6bee380bedba31c
parent7e6aa6db1fe5b14b5d224da11b077c50cc954efa
src: rework SNPRINTF_BUFFER_SIZE() and handle truncation

Before, the macro asserts against truncation. This is despite the
callers still checked for truncation and tried to handle it. Probably
for good reason. With stmt_evaluate_log_prefix() it's not clear that the
code ensures that truncation cannot happen, so we must not assert
against it, but handle it.

Also,

- wrap the macro in "do { ... } while(0)" to make it more
  function-like.

- evaluate macro arguments exactly once, to make it more function-like.

- take pointers to the arguments that are being modified.

- use assert() instead of abort().

- use size_t type for arguments related to the buffer size.

- drop "size". It was mostly redundant to "offset". We can know
  everything we want based on "len" and "offset" alone.

- "offset" previously was incremented before checking for truncation.
  So it would point somewhere past the buffer. This behavior does not
  seem useful. Instead, on truncation "len" will be zero (as before) and
  "offset" will point one past the buffer (one past the terminating
  NUL).

Thereby, also fix a warning from clang:

    evaluate.c:4134:9: error: variable 'size' set but not used [-Werror,-Wunused-but-set-variable]
            size_t size = 0;
                   ^

    meta.c:1006:9: error: variable 'size' set but not used [-Werror,-Wunused-but-set-variable]
            size_t size;
                   ^

Signed-off-by: Thomas Haller <thaller@redhat.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/utils.h
src/evaluate.c
src/meta.c