]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/log: add an assert that does not recurse into logging functions 8258/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 23 Feb 2018 12:29:03 +0000 (13:29 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 23 Feb 2018 12:29:03 +0000 (13:29 +0100)
Then it can be used in the asserts in logging functions without causing
infinite recursion. The error is just printed to stderr, it should be
good enough for the common case.

src/basic/log.c

index 19c4ec76492970a263a60e999edf3cbc15a5623f..72b60da6c68febf9675fb52773c83c51af7340bb 100644 (file)
@@ -83,6 +83,16 @@ static bool prohibit_ipc = false;
  * use here. */
 static char *log_abort_msg = NULL;
 
+/* An assert to use in logging functions that does not call recursively
+ * into our logging functions (since that might lead to a loop). */
+#define assert_raw(expr)                                                \
+        do {                                                            \
+                if (_unlikely_(!(expr))) {                              \
+                        fputs(#expr "\n", stderr);                      \
+                        abort();                                        \
+                }                                                       \
+        } while (false)
+
 static void log_close_console(void) {
 
         if (console_fd < 0)
@@ -531,7 +541,7 @@ static int log_do_header(
                      isempty(extra) ? "" : extra,
                      isempty(extra) ? "" : "\n",
                      program_invocation_short_name);
-        assert((size_t) r < size);
+        assert_raw((size_t) r < size);
 
         return 0;
 }
@@ -583,7 +593,7 @@ int log_dispatch_internal(
                 const char *extra,
                 char *buffer) {
 
-        assert(buffer);
+        assert_raw(buffer);
 
         if (error < 0)
                 error = -error;