[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen stable-4.17] tools/oxenstored: Render backtraces more nicely in Syslog



commit c4972a4272690384b15d5706f2a833aed636895e
Author:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Thu Dec 1 21:06:25 2022 +0000
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Dec 20 13:13:40 2022 +0000

    tools/oxenstored: Render backtraces more nicely in Syslog
    
    fallback_exception_handler feeds a string with embedded newlines directly 
into
    syslog().  While this is an improvement on getting nothing, syslogd escapes
    all control characters it gets, and emits one (long) log line.
    
    Fix the problem generally in the syslog stub.  As we already have a local 
copy
    of the string, split it in place and emit one syslog() call per line.
    
    Also tweak Logging.msg_of to avoid putting an extra newline on a string 
which
    already ends with one.
    
    Fixes: ee7815f49faf ("tools/oxenstored: Set uncaught exception handler")
    Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    Acked-by: Christian Lindig <christian.lindig@xxxxxxxxxx>
    (cherry picked from commit d2162d884cba0ff7b2ac0d832f4e044444bda2e1)
---
 tools/ocaml/xenstored/logging.ml     |  2 +-
 tools/ocaml/xenstored/syslog_stubs.c | 26 +++++++++++++++++++++++---
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/tools/ocaml/xenstored/logging.ml b/tools/ocaml/xenstored/logging.ml
index 255051437d..f233bc9a39 100644
--- a/tools/ocaml/xenstored/logging.ml
+++ b/tools/ocaml/xenstored/logging.ml
@@ -344,7 +344,7 @@ let watch_not_fired ~con perms path =
        access_logging ~tid:0 ~con ~data Watch_not_fired ~level:Info
 
 let msg_of exn bt =
-       Printf.sprintf "Fatal exception: %s\n%s\n" (Printexc.to_string exn)
+       Printf.sprintf "Fatal exception: %s\n%s" (Printexc.to_string exn)
                (Printexc.raw_backtrace_to_string bt)
 
 let fallback_exception_handler exn bt =
diff --git a/tools/ocaml/xenstored/syslog_stubs.c 
b/tools/ocaml/xenstored/syslog_stubs.c
index e16c3a9491..760e78ff73 100644
--- a/tools/ocaml/xenstored/syslog_stubs.c
+++ b/tools/ocaml/xenstored/syslog_stubs.c
@@ -37,14 +37,34 @@ value stub_syslog(value facility, value level, value msg)
 {
        CAMLparam3(facility, level, msg);
        char *c_msg = strdup(String_val(msg));
+       char *s = c_msg, *ss;
        int c_facility = __syslog_facility_table[Int_val(facility)]
                       | __syslog_level_table[Int_val(level)];
 
        if ( !c_msg )
                caml_raise_out_of_memory();
-       caml_enter_blocking_section();
-       syslog(c_facility, "%s", c_msg);
-       caml_leave_blocking_section();
+
+       /*
+        * syslog() doesn't like embedded newlines, and c_msg generally
+        * contains them.
+        *
+        * Split the message in place by converting \n to \0, and issue one
+        * syslog() call per line, skipping the final iteration if c_msg ends
+        * with a newline anyway.
+        */
+       do {
+               ss = strchr(s, '\n');
+               if ( ss )
+                       *ss = '\0';
+               else if ( *s == '\0' )
+                       break;
+
+               caml_enter_blocking_section();
+               syslog(c_facility, "%s", s);
+               caml_leave_blocking_section();
+
+               s = ss + 1;
+       } while ( ss );
 
        free(c_msg);
        CAMLreturn(Val_unit);
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.17



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.