From: Alejandro Colomar Date: Sat, 26 Aug 2023 10:11:59 +0000 (+0200) Subject: lib/string/sprintf.h: Add SNPRINTF() macro X-Git-Tag: 4.15.0-rc1~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce4c4d4ad592ad4678b11533c5417086365fb410;p=thirdparty%2Fshadow.git lib/string/sprintf.h: Add SNPRINTF() macro It wraps snprintf(3) so that it performs some steps that one might forget, or might be prone to accidents: - It calculates the size of the destination buffer, and makes sure it's an array (otherwise, using sizeof(s) would be very bad). - It calculates if there's truncation or an error, returning -1 if so. BTW, this macro doesn't have any issues of double evaluation, because sizeof() doesn't evaluate its argument (unless it's a VLA, but then the static_assert(3) within NITEMS() makes sure VLAs are not allowed). This macro is very similar to STRTCPY(), defined in . Signed-off-by: Alejandro Colomar --- diff --git a/lib/string/sprintf.h b/lib/string/sprintf.h index c9d7e6c78..33e0bc2d3 100644 --- a/lib/string/sprintf.h +++ b/lib/string/sprintf.h @@ -16,6 +16,18 @@ #include "attr.h" #include "defines.h" +#include "sizeof.h" + + +#define SNPRINTF(s, fmt, ...) \ +({ \ + size_t sz_, len_; \ + \ + sz_ = NITEMS(s); \ + len_ = snprintf(s, sz_, fmt __VA_OPT__(,) __VA_ARGS__); \ + \ + (len_ >= sz_) ? -1 : len_; \ +}) format_attr(printf, 2, 3)