From 65b3903ff576488eaabb51d3c4fbf9c73d867d7c Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Sat, 25 Jan 2014 23:35:28 -0500 Subject: journal: guarantee async-signal-safety in sd_journald_sendv signal(7) provides a list of functions which may be called from a signal handler. Other functions, which only call those functions and don't access global memory and are reentrant are also safe. sd_j_sendv was mostly OK, but would call mkostemp and writev in a fallback path, which are unsafe. Being able to call sd_j_sendv in a async-signal-safe way is important because it allows it be used in signal handlers. Safety is achieved by replacing mkostemp with open(O_TMPFILE) and an open-coded writev replacement which uses write. Unfortunately, O_TMPFILE is only available on kernels >= 3.11. When O_TMPFILE is unavailable, an open-coded mkostemp is used. https://bugzilla.gnome.org/show_bug.cgi?id=722889 --- man/sd_journal_print.xml | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'man/sd_journal_print.xml') diff --git a/man/sd_journal_print.xml b/man/sd_journal_print.xml index a716cc35e6..57d908fe22 100644 --- a/man/sd_journal_print.xml +++ b/man/sd_journal_print.xml @@ -153,8 +153,8 @@ for details) instead of the format string. Each structure should reference one field of the entry to submit. The second argument specifies the number of - structures in the - array. sd_journal_sendv() is + structures in the array. + sd_journal_sendv() is particularly useful to submit binary objects to the journal where that is necessary. @@ -220,6 +220,19 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid( variable itself is not altered. + + Async signal safety + sd_journal_sendv() is "async signal + safe" in the meaning of signal7. + + + sd_journal_print, + sd_journal_printv, + sd_journal_send, and + sd_journal_perror are + not async signal safe. + + Notes @@ -233,6 +246,16 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid( file. + + History + + sd_journal_sendv() was + modified to guarantee async-signal-safety in + systemd-209. Before that, it would behave safely only + when entry size was small enough to fit in one (large) + datagram. + + See Also @@ -243,7 +266,9 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid( syslog3, perror3, errno3, - systemd.journal-fields7 + systemd.journal-fields7, + signal7, + socket7 -- cgit v1.2.3-54-g00ecf