The branch, master has been updated via f2dbcea6f04 lib: Confine the copy_no_nl memcpy to debug_gpfs_log() via c3399cd46f7 lib: Avoid memcpy in debug_lttng_log() via f8a75f83077 lib: Avoid memcpy in debug_systemd_log() from 16d802f9c1f script/autobuild.py: add some --private-libraries=ALL testing
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit f2dbcea6f0499e81cf5b3215459925bb1dffd4a8 Author: Volker Lendecke <v...@samba.org> Date: Tue Dec 19 15:34:50 2023 +0100 lib: Confine the copy_no_nl memcpy to debug_gpfs_log() gpfswrap_add_trace() seems not to have a format string that could understand the %.*s notation. While there this removes >4k of r/w memory from every smbd. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Thu Jan 4 17:06:19 UTC 2024 on atb-devel-224 commit c3399cd46f7a33db516b5716a2ce0ebf50fd117a Author: Volker Lendecke <v...@samba.org> Date: Tue Dec 19 14:47:24 2023 +0100 lib: Avoid memcpy in debug_lttng_log() tracef() understands the %.*s format. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit f8a75f830774a6f32ed834cd3d17ba8804fddb82 Author: Volker Lendecke <v...@samba.org> Date: Tue Dec 19 14:44:12 2023 +0100 lib: Avoid memcpy in debug_systemd_log() sd_journal_send() understands the %.*s format. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/util/debug.c | 145 ++++++++++++++++++++++++------------------------------- 1 file changed, 62 insertions(+), 83 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/util/debug.c b/lib/util/debug.c index f1f91ebe7a7..86f13f181cf 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -100,9 +100,7 @@ static struct { debug_callback_fn callback; void *callback_private; char header_str[300]; - char header_str_no_nl[300]; size_t hs_len; - char msg_no_nl[FORMAT_BUFR_SIZE]; } state = { .settings = { .timestamp_logs = true @@ -244,48 +242,6 @@ static int debug_level_to_priority(int level) } #endif -/* -------------------------------------------------------------------------- ** - * Produce a version of the given buffer without any trailing newlines. - */ -#if defined(HAVE_LIBSYSTEMD_JOURNAL) || defined(HAVE_LIBSYSTEMD) || \ - defined(HAVE_LTTNG_TRACEF) || defined(HAVE_GPFS) -static void copy_no_nl(char *out, - size_t out_size, - const char *in, - size_t in_len) -{ - size_t len; - /* - * Some backends already add an extra newline, so also provide - * a buffer without the newline character. - */ - len = MIN(in_len, out_size - 1); - if ((len > 0) && (in[len - 1] == '\n')) { - len--; - } - - memcpy(out, in, len); - out[len] = '\0'; -} - -static void ensure_copy_no_nl(char *out, - size_t out_size, - const char *in, - size_t in_len) -{ - /* - * Assume out is a static buffer that is reused as a cache. - * If it isn't empty then this has already been done with the - * same input. - */ - if (out[0] != '\0') { - return; - } - - copy_no_nl(out, out_size, in, in_len); -} -#endif - /* -------------------------------------------------------------------------- ** * Debug backends. When logging to DEBUG_FILE, send the log entries to * all active backends. @@ -366,24 +322,33 @@ static void debug_syslog_log(int msg_level, const char *msg, size_t msg_len) static void debug_systemd_log(int msg_level, const char *msg, size_t msg_len) { if (state.hs_len > 0) { - ensure_copy_no_nl(state.header_str_no_nl, - sizeof(state.header_str_no_nl), - state.header_str, - state.hs_len); - sd_journal_send("MESSAGE=%s", - state.header_str_no_nl, + size_t len = state.hs_len; + + if (state.header_str[len - 1] == '\n') { + len -= 1; + } + + sd_journal_send("MESSAGE=%.*s", + (int)len, + state.header_str, "PRIORITY=%d", debug_level_to_priority(msg_level), "LEVEL=%d", msg_level, NULL); } - ensure_copy_no_nl(state.msg_no_nl, - sizeof(state.msg_no_nl), - msg, msg_len); - sd_journal_send("MESSAGE=%s", state.msg_no_nl, - "PRIORITY=%d", debug_level_to_priority(msg_level), - "LEVEL=%d", msg_level, + + if ((msg_len > 0) && (msg[msg_len - 1] == '\n')) { + msg_len -= 1; + } + + sd_journal_send("MESSAGE=%.*s", + (int)msg_len, + msg, + "PRIORITY=%d", + debug_level_to_priority(msg_level), + "LEVEL=%d", + msg_level, NULL); } #endif @@ -393,16 +358,19 @@ static void debug_systemd_log(int msg_level, const char *msg, size_t msg_len) static void debug_lttng_log(int msg_level, const char *msg, size_t msg_len) { if (state.hs_len > 0) { - ensure_copy_no_nl(state.header_str_no_nl, - sizeof(state.header_str_no_nl), - state.header_str, - state.hs_len); - tracef(state.header_str_no_nl); + size_t len = state.hs_len; + + if (state.header_str[len - 1] == '\n') { + len -= 1; + } + + tracef("%.*s", (int)len, state.header_str); + } + + if ((msg_len > 0) && (msg[msg_len - 1] == '\n')) { + msg_len -= 1; } - ensure_copy_no_nl(state.msg_no_nl, - sizeof(state.msg_no_nl), - msg, msg_len); - tracef(state.msg_no_nl); + tracef("%.*s", (int)msg_len, msg); } #endif /* WITH_LTTNG_TRACEF */ @@ -433,19 +401,39 @@ static void debug_gpfs_reload(bool enabled, bool previously_enabled, } } +static void copy_no_nl(char *out, + size_t out_size, + const char *in, + size_t in_len) +{ + size_t len; + /* + * Some backends already add an extra newline, so also provide + * a buffer without the newline character. + */ + len = MIN(in_len, out_size - 1); + if ((len > 0) && (in[len - 1] == '\n')) { + len--; + } + + memcpy(out, in, len); + out[len] = '\0'; +} + static void debug_gpfs_log(int msg_level, const char *msg, size_t msg_len) { + char no_nl[FORMAT_BUFR_SIZE]; + if (state.hs_len > 0) { - ensure_copy_no_nl(state.header_str_no_nl, - sizeof(state.header_str_no_nl), - state.header_str, - state.hs_len); - gpfswrap_add_trace(msg_level, state.header_str_no_nl); + copy_no_nl(no_nl, + sizeof(no_nl), + state.header_str, + state.hs_len); + gpfswrap_add_trace(msg_level, no_nl); } - ensure_copy_no_nl(state.msg_no_nl, - sizeof(state.msg_no_nl), - msg, msg_len); - gpfswrap_add_trace(msg_level, state.msg_no_nl); + + copy_no_nl(no_nl, sizeof(no_nl), msg, msg_len); + gpfswrap_add_trace(msg_level, no_nl); } #endif /* HAVE_GPFS */ @@ -700,13 +688,6 @@ static void debug_backends_log(const char *msg, size_t msg_len, int msg_level) { size_t i; - /* - * Some backends already add an extra newline, so initialize a - * buffer without the newline character. It will be filled by - * the first backend that needs it. - */ - state.msg_no_nl[0] = '\0'; - for (i = 0; i < ARRAY_SIZE(debug_backends); i++) { if (msg_level <= debug_backends[i].log_level) { debug_backends[i].log(msg_level, msg, msg_len); @@ -1931,8 +1912,6 @@ full: state.hs_len = sizeof(state.header_str) - 1; } - state.header_str_no_nl[0] = '\0'; - errno = old_errno; return( true ); } -- Samba Shared Repository