]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
log: mute messages generated by log drivers
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 14 Sep 2020 08:01:00 +0000 (10:01 +0200)
committerSimon Glass <sjg@chromium.org>
Tue, 22 Sep 2020 18:54:13 +0000 (12:54 -0600)
When a message is written by a log driver (e.g. via the network stack) this
may result in the generation of further messages. We cannot allow these
additional messages to be emitted as this might result in an infinite
recursion.

Up to now only the syslog driver was safeguarded. We should safeguard all
log drivers instead.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/log.c
common/log_syslog.c

index 734d26de4af30df4a89d664945f8a77635de9422..9a5f100da34b58b1abde794c251bf57056e1c67f 100644 (file)
@@ -191,12 +191,23 @@ static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec)
 static int log_dispatch(struct log_rec *rec)
 {
        struct log_device *ldev;
+       static int processing_msg;
 
+       /*
+        * When a log driver writes messages (e.g. via the network stack) this
+        * may result in further generated messages. We cannot process them here
+        * as this might result in infinite recursion.
+        */
+       if (processing_msg)
+               return 0;
+
+       /* Emit message */
+       processing_msg = 1;
        list_for_each_entry(ldev, &gd->log_head, sibling_node) {
                if (log_passes_filters(ldev, rec))
                        ldev->drv->emit(ldev, rec);
        }
-
+       processing_msg = 0;
        return 0;
 }
 
index 149ff5af310ade9b7deb1d236e5e11f18afc2f9b..2ae703fed7103b812492d236de3ed77392c997ee 100644 (file)
@@ -35,16 +35,9 @@ static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec)
        char *log_msg;
        int eth_hdr_size;
        struct in_addr bcast_ip;
-       static int processing_msg;
        unsigned int log_level;
        char *log_hostname;
 
-       /* Fend off messages from the network stack while writing a message */
-       if (processing_msg)
-               return 0;
-
-       processing_msg = 1;
-
        /* Setup packet buffers */
        net_init();
        /* Disable hardware and put it into the reset state */
@@ -108,7 +101,6 @@ static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec)
        net_send_packet((uchar *)msg, ptr - msg);
 
 out:
-       processing_msg = 0;
        return ret;
 }