1
0
Fork 0
mirror of https://passt.top/passt synced 2025-05-22 01:05:35 +02:00

util: Add abort_with_msg() and ASSERT_WITH_MSG() helpers

We already have the ASSERT() macro which will abort() passt based on a
condition.  It always has a fixed error message based on its location and
the asserted expression.  We have some upcoming cases where we want to
customise the message when hitting an assert.

Add abort_with_msg() and ASSERT_WITH_MSG() helpers to allow this.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2025-03-17 20:24:22 +11:00 committed by Stefano Brivio
parent 38bcce9977
commit 9153aca15b
2 changed files with 29 additions and 15 deletions

19
util.c
View file

@ -1017,3 +1017,22 @@ void encode_domain_name(char *buf, const char *domain_name)
}
p[i] = 0L;
}
/**
* abort_with_msg() - Print error message and abort
* @fmt: Format string
* @...: Format parameters
*/
void abort_with_msg(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vlogmsg(true, false, LOG_CRIT, fmt, ap);
va_end(ap);
/* This may actually cause a SIGSYS instead of SIGABRT, due to seccomp,
* but that will still get the job done.
*/
abort();
}

25
util.h
View file

@ -61,27 +61,22 @@
#define STRINGIFY(x) #x
#define STR(x) STRINGIFY(x)
#ifdef CPPCHECK_6936
void abort_with_msg(const char *fmt, ...)
__attribute__((format(printf, 1, 2), noreturn));
/* Some cppcheck versions get confused by aborts inside a loop, causing
* it to give false positive uninitialised variable warnings later in
* the function, because it doesn't realise the non-initialising path
* already exited. See https://trac.cppcheck.net/ticket/13227
*
* Therefore, avoid using the usual do while wrapper we use to force the macro
* to act like a single statement requiring a ';'.
*/
#define ASSERT(expr) \
((expr) ? (void)0 : abort())
#else
#define ASSERT_WITH_MSG(expr, ...) \
((expr) ? (void)0 : abort_with_msg(__VA_ARGS__))
#define ASSERT(expr) \
do { \
if (!(expr)) { \
err("ASSERTION FAILED in %s (%s:%d): %s", \
__func__, __FILE__, __LINE__, STRINGIFY(expr)); \
/* This may actually SIGSYS, due to seccomp, \
* but that will still get the job done \
*/ \
abort(); \
} \
} while (0)
#endif
ASSERT_WITH_MSG((expr), "ASSSERTION FAILED in %s (%s:%d): %s", \
__func__, __FILE__, __LINE__, STRINGIFY(expr))
#ifdef P_tmpdir
#define TMPDIR P_tmpdir