From patchwork Fri Mar 18 16:52:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52118 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 53CA53888C55 for ; Fri, 18 Mar 2022 16:53:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 53CA53888C55 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622403; bh=yLtoGvS6xckQHPl0gjw6Ytmpjx0eAYqmfl2aBNnEpXg=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=U8o8Gyil9aZqMfoNUk+TVwPpJr8fYCdE6xiG1lElzTjYOOEHzs0+Ukx3ybYi9SDZ2 0+Wa1nSoeuIyRINQY0y72LMS5V3TFCxs3nxEBMd861FVXjkV460TYUJGaHgL7Bg9ch iCpVsWxi+TDyRZq3rj/NbA5aIWQVJxBvSEsYPhQs= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-oo1-xc2c.google.com (mail-oo1-xc2c.google.com [IPv6:2607:f8b0:4864:20::c2c]) by sourceware.org (Postfix) with ESMTPS id D36843853804 for ; Fri, 18 Mar 2022 16:52:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D36843853804 Received: by mail-oo1-xc2c.google.com with SMTP id y27-20020a4a9c1b000000b0032129651bb0so10815501ooj.2 for ; Fri, 18 Mar 2022 09:52:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yLtoGvS6xckQHPl0gjw6Ytmpjx0eAYqmfl2aBNnEpXg=; b=5jY13zs0U3/PX62Y9SSoL1xNHstPV7mCJQn02wr9Xl5A7+1rzWRvZvfnUAGKUDbXPV pkSvUBePLFLxIQA7GNbiZTDotBPeNcwgN+LhLlJ6/PHp6/yiEK1q3Xz/KBFrlMINhyrz b+kYSZVbwxhpbqAWJoKgL7qVBgcFbtusKIblC0ISeSx69rMfldMAKLPNSqC410I59cEu Og9vJ4Pq82X39JytkXxpgaRpvHH11N4SXddyDx4FnoiKkfukpoFdwKUlyGcG2yKf+w/9 F0r/K5aEYctbLXFJe6NpaJ4nmLddJXxu4VniG6STtU2tTOIYZBftdyHVrJmFKytYu2q4 Ozyg== X-Gm-Message-State: AOAM531QCyNjpJqyGodf0N9Xsql2c9s0qG+eUVACLYW1/865wXLWYs23 wSas1ZXY9u1eEIucvJOYUdZ9jHadMvppgA== X-Google-Smtp-Source: ABdhPJyswOXuPguFULiOXmFrSPp8SWOdAzXXWURFfZFunYceJGCMjg8jwvxMFbuQbb3DFeeXkx0tLA== X-Received: by 2002:a05:6870:d1d5:b0:da:cd6:7ac5 with SMTP id b21-20020a056870d1d500b000da0cd67ac5mr7329839oac.157.1647622340972; Fri, 18 Mar 2022 09:52:20 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:20 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 1/7] support: Add xmkfifo Date: Fri, 18 Mar 2022 13:52:08 -0300 Message-Id: <20220318165214.2291065-2-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Wrapper support mkfifo. --- support/Makefile | 1 + support/xmkfifo.c | 29 +++++++++++++++++++++++++++++ support/xunistd.h | 1 + 3 files changed, 31 insertions(+) create mode 100644 support/xmkfifo.c diff --git a/support/Makefile b/support/Makefile index 5ddcb8d158..c3609e211b 100644 --- a/support/Makefile +++ b/support/Makefile @@ -133,6 +133,7 @@ libsupport-routines = \ xmemstream \ xmkdir \ xmkdirp \ + xmkfifo \ xmmap \ xmprotect \ xmunmap \ diff --git a/support/xmkfifo.c b/support/xmkfifo.c new file mode 100644 index 0000000000..a8e196dbc2 --- /dev/null +++ b/support/xmkfifo.c @@ -0,0 +1,29 @@ +/* mkfifo with error checking. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +void +xmkfifo (const char *pathname, mode_t mode) +{ + int r = mkfifo (pathname, mode); + if (r < 0) + FAIL_EXIT1 ("mkfifo (%s, 0%o): %m", pathname, mode); +} diff --git a/support/xunistd.h b/support/xunistd.h index 0454d83cf1..960a62d412 100644 --- a/support/xunistd.h +++ b/support/xunistd.h @@ -61,6 +61,7 @@ void xsymlink (const char *target, const char *linkpath); void xchdir (const char *path); void xfchmod (int fd, mode_t mode); void xchmod (const char *pathname, mode_t mode); +void xmkfifo (const char *pathname, mode_t mode); /* Equivalent of "mkdir -p". */ void xmkdirp (const char *, mode_t); From patchwork Fri Mar 18 16:52:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52119 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1D6E13888C7D for ; Fri, 18 Mar 2022 16:54:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1D6E13888C7D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622445; bh=vvb7l/clATDspoO1ZOcDsHcB5X2PrV5lk1FiJfE/Q6g=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=MipJvEaWy/IUEwHxac2gqyu4v88e4JMGfMpu6aFAUzq1Je14dtyY0CwYIOTIW3Ris zXHCoXIIN0zfMOr6tUjSG6esYODCNijXEXtuMU4H4R/pAicdLZp3uyfeiPEUIL6DHF lG7PbGBjUMTlk0AEz56kDSdp9fXQgbbEGXjsK7cs= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-oo1-xc2e.google.com (mail-oo1-xc2e.google.com [IPv6:2607:f8b0:4864:20::c2e]) by sourceware.org (Postfix) with ESMTPS id DC3F33888C53 for ; Fri, 18 Mar 2022 16:52:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DC3F33888C53 Received: by mail-oo1-xc2e.google.com with SMTP id h16-20020a4a6f10000000b00320507b9ccfso10796067ooc.7 for ; Fri, 18 Mar 2022 09:52:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vvb7l/clATDspoO1ZOcDsHcB5X2PrV5lk1FiJfE/Q6g=; b=ST+ZQweVpx0vb2xNwZDTlFp9G1/mZdQOAD1FXCZo6SkooEKX4J7WkDJbwpwk4iziRF tk14ZUO0IGF6dbFT0ou72k20gFX2VV7xZR9dFVd5f//LrOAEkYy2kr/P1QyQTFdj42bX 4NDEEqGFI84SpDxyoPHBnisTcyleMtvasmRmFr4opn1hLliTghcooX8E/E7RNreYpxAn eETu1v+zFJNVIIHqdLsFMuwY7Fg9qu1brcGAvr/sgBAFv+Qa6uqmzXiS/FpqzLhfefcX +Rt+GDxxvilBAcn8fytRIB1FYG6JAWTYqfGi6JkmFVVf0Z90f/sYNCeNWPPEgtm+epmS zLWA== X-Gm-Message-State: AOAM531kYl6B3DOhf5krjFN1VcntgB5Ij/UKnKex6h/Hk+yfrcQNlRJC EUdwl3c498ucwwp1kxa0mbPDDSAyJUtmJA== X-Google-Smtp-Source: ABdhPJyndQiKyH0vba2EB65Wnr6Dk0dZq1xyPRgaBzkNgfbILc8eVIrL5/OU/wIHfTe3OXzZR9ND7Q== X-Received: by 2002:a4a:d887:0:b0:320:d6e1:2f7a with SMTP id b7-20020a4ad887000000b00320d6e12f7amr3084733oov.97.1647622342757; Fri, 18 Mar 2022 09:52:22 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:22 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 2/7] misc: Add syslog test Date: Fri, 18 Mar 2022 13:52:09 -0300 Message-Id: <20220318165214.2291065-3-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The test cover: - All possible priorities and facilities through TCP and UDP. - Same syslog tests for vsyslog. - Some openlog/syslog/close combinations. - openlog with LOG_CONS, LOG_PERROR, and LOG_PID. Internally is done with a test-container where the main process mimics the syslog server interface. The test does not cover multithread and async-signal usage. Checked on x86_64-linux-gnu. --- misc/Makefile | 2 + misc/tst-syslog.c | 477 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 479 insertions(+) create mode 100644 misc/tst-syslog.c diff --git a/misc/Makefile b/misc/Makefile index 3d8a569d06..ba8232a0e9 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -115,6 +115,8 @@ tests-special += $(objpfx)tst-error1-mem.out \ $(objpfx)tst-allocate_once-mem.out endif +tests-container := tst-syslog + CFLAGS-select.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-tsearch.c += $(uses-callbacks) CFLAGS-lsearch.c += $(uses-callbacks) diff --git a/misc/tst-syslog.c b/misc/tst-syslog.c new file mode 100644 index 0000000000..8505178616 --- /dev/null +++ b/misc/tst-syslog.c @@ -0,0 +1,477 @@ +/* Basic tests for syslog interfaces. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const int facilities[] = + { + LOG_KERN, + LOG_USER, + LOG_MAIL, + LOG_DAEMON, + LOG_AUTH, + LOG_SYSLOG, + LOG_LPR, + LOG_NEWS, + LOG_UUCP, + LOG_CRON, + LOG_AUTHPRIV, + LOG_FTP, + LOG_LOCAL0, + LOG_LOCAL1, + LOG_LOCAL2, + LOG_LOCAL3, + LOG_LOCAL4, + LOG_LOCAL5, + LOG_LOCAL6, + LOG_LOCAL7, + }; + +static const int priorities[] = + { + LOG_EMERG, + LOG_ALERT, + LOG_CRIT, + LOG_ERR, + LOG_WARNING, + LOG_NOTICE, + LOG_INFO, + LOG_DEBUG + }; + +enum + { + ident_length = 64, + msg_length = 64 + }; + +#define SYSLOG_MSG_BASE "syslog_message" +#define OPENLOG_IDENT "openlog_ident" + +struct msg_t + { + int priority; + int facility; + char ident[ident_length]; + char msg[msg_length]; + pid_t pid; + }; + +static void +call_vsyslog (int priority, const char *format, ...) +{ + va_list ap; + va_start (ap, format); + vsyslog (priority, format, ap); + va_end (ap); +} + +static void +send_vsyslog (int options) +{ + for (size_t i = 0; i < array_length (facilities); i++) + { + for (size_t j = 0; j < array_length (priorities); j++) + { + int facility = facilities[i]; + int priority = priorities[j]; + call_vsyslog (facility | priority, "%s %d %d", SYSLOG_MSG_BASE, + facility, priority); + } + } +} + +static void +send_syslog (int options) +{ + for (size_t i = 0; i < array_length (facilities); i++) + { + for (size_t j = 0; j < array_length (priorities); j++) + { + int facility = facilities[i]; + int priority = priorities[j]; + syslog (facility | priority, "%s %d %d", SYSLOG_MSG_BASE, facility, + priority); + } + } +} + +static bool +check_syslog_message (const struct msg_t *msg, int msgnum, int options, + pid_t pid) +{ + if (msgnum == array_length (facilities) * array_length (priorities) - 1) + return false; + + int i = msgnum / array_length (priorities); + int j = msgnum % array_length (priorities); + + int expected_facility = facilities[i]; + /* With no preceding openlog, syslog default to LOG_USER. */ + if (expected_facility == LOG_KERN) + expected_facility = LOG_USER; + int expected_priority = priorities[j]; + + TEST_COMPARE (msg->facility, expected_facility); + TEST_COMPARE (msg->priority, expected_priority); + + return true; +} + +static void +send_openlog (int options) +{ + /* Define a non-default IDENT and a not default facility. */ + openlog (OPENLOG_IDENT, options, LOG_LOCAL0); + for (size_t j = 0; j < array_length (priorities); j++) + { + int priority = priorities[j]; + syslog (priority, "%s %d %d", SYSLOG_MSG_BASE, LOG_LOCAL0, priority); + } + closelog (); + + /* Back to the default IDENT with a non default facility. */ + openlog (NULL, 0, LOG_LOCAL6); + for (size_t j = 0; j < array_length (priorities); j++) + { + int priority = priorities[j]; + syslog (LOG_LOCAL7 | priority, "%s %d %d", SYSLOG_MSG_BASE, LOG_LOCAL7, + priority); + } + closelog (); + + /* LOG_KERN does not change the internal default facility. */ + openlog (NULL, 0, LOG_KERN); + for (size_t j = 0; j < array_length (priorities); j++) + { + int priority = priorities[j]; + syslog (priority, "%s %d %d", SYSLOG_MSG_BASE, LOG_KERN, priority); + } + closelog (); +} + +static bool +check_openlog_message (const struct msg_t *msg, int msgnum, + int options, pid_t pid) +{ + if (msgnum == 3 * array_length (priorities) - 1) + return false; + + int expected_priority = priorities[msgnum % array_length (priorities)]; + TEST_COMPARE (msg->priority, expected_priority); + + char expected_ident[ident_length]; + snprintf (expected_ident, sizeof (expected_ident), "%s%s%.0d%s:", + OPENLOG_IDENT, + options & LOG_PID ? "[" : "", + options & LOG_PID ? pid : 0, + options & LOG_PID ? "]" : ""); + + if (msgnum < array_length (priorities)) + { + if (options & LOG_PID) + TEST_COMPARE (msg->pid, pid); + TEST_COMPARE_STRING (msg->ident, expected_ident); + TEST_COMPARE (msg->facility, LOG_LOCAL0); + } + else if (msgnum < 2 * array_length (priorities)) + TEST_COMPARE (msg->facility, LOG_LOCAL7); + else if (msgnum < 3 * array_length (priorities)) + TEST_COMPARE (msg->facility, LOG_KERN); + + return true; +} + +static struct msg_t +parse_syslog_msg (const char *msg) +{ + struct msg_t r = { .pid = -1 }; + int number; + + /* The message in the form: + <179>Apr 8 14:51:19 tst-syslog: syslog message 176 3 */ + int n = sscanf (msg, "<%3d>%*s %*d %*d:%*d:%*d %32s %64s %*d %*d", + &number, r.ident, r.msg); + TEST_COMPARE (n, 3); + + r.facility = number & LOG_FACMASK; + r.priority = number & LOG_PRIMASK; + + char *pid_start = strchr (r.ident, '['); + if (pid_start != NULL) + { + char *pid_end = strchr (r.ident, ']'); + if (pid_end != NULL) + r.pid = strtoul (pid_start + 1, NULL, 10); + } + + return r; +} + +static struct msg_t +parse_syslog_console (const char *msg) +{ + int priority; + int facility; + struct msg_t r; + + /* The message in the form: + openlog_ident: syslog_message 128 0 */ + int n = sscanf (msg, "%32s %64s %d %d", + r.ident, r.msg, &facility, &priority); + TEST_COMPARE (n, 4); + + r.facility = facility; + r.priority = priority; + + return r; +} + +static void +check_syslog_udp (void (*syslog_send)(int), int options, + bool (*syslog_check)(const struct msg_t *, int, int, + pid_t)) +{ + struct sockaddr_un addr = + { + .sun_family = AF_UNIX, + .sun_path = _PATH_LOG + }; + + socklen_t addrlen = sizeof (addr); + int server_udp = xsocket (AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); + xbind (server_udp, (struct sockaddr *) &addr, addrlen); + + pid_t sender_pid = xfork (); + if (sender_pid == 0) + { + syslog_send (options); + _exit (0); + } + + int msgnum = 0; + while (1) + { + char buf[512]; + size_t l = xrecvfrom (server_udp, buf, sizeof (buf), 0, + (struct sockaddr *) &addr, &addrlen); + buf[l] = '\0'; + + struct msg_t msg = parse_syslog_msg (buf); + if (!syslog_check (&msg, msgnum++, options, sender_pid)) + break; + } + + xclose (server_udp); + + int status; + xwaitpid (sender_pid, &status, 0); + TEST_COMPARE (status, 0); + + unlink (_PATH_LOG); +} + +static void +check_syslog_tcp (void (*syslog_send)(int), int options, + bool (*syslog_check)(const struct msg_t *, int, int, + pid_t)) +{ + struct sockaddr_un addr = + { + .sun_family = AF_UNIX, + .sun_path = _PATH_LOG + }; + socklen_t addrlen = sizeof (addr); + + int server_tcp = xsocket (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + xbind (server_tcp, (struct sockaddr *) &addr, addrlen); + xlisten (server_tcp, 5); + + pid_t sender_pid = xfork (); + if (sender_pid == 0) + { + syslog_send (options); + _exit (0); + } + + int client_tcp = xaccept (server_tcp, NULL, NULL); + + char buf[512], *rb = buf; + size_t rbl = sizeof (buf); + size_t prl = 0; /* Track the size of the partial record. */ + int msgnum = 0; + + while (1) + { + size_t rl = xrecvfrom (client_tcp, rb, rbl - prl, 0, NULL, NULL); + if (rl == 0) + break; + + /* Iterate over the buffer to find and check the record. */ + size_t l = rl + prl; + char *b = buf; + while (1) + { + /* With TCP each record ends with a '\0'. */ + char *e = memchr (b, '\0', l); + if (e != NULL) + { + struct msg_t msg = parse_syslog_msg (b); + if (!syslog_check (&msg, msgnum++, options, sender_pid)) + break; + + /* Advance to the next record. */ + ptrdiff_t diff = e + 1 - b; + b += diff; + l -= diff; + } + else + { + /* Move the partial record to the start of the buffer. */ + memmove (buf, b, l); + rb = buf + l; + prl = l; + break; + } + } + } + + xclose (client_tcp); + xclose (server_tcp); + + int status; + xwaitpid (sender_pid, &status, 0); + TEST_COMPARE (status, 0); + + unlink (_PATH_LOG); +} + +static void +check_syslog_console_read (FILE *fp) +{ + char buf[512]; + int msgnum = 0; + while (fgets (buf, sizeof (buf), fp) != NULL) + { + struct msg_t msg = parse_syslog_console (buf); + TEST_COMPARE_STRING (msg.ident, OPENLOG_IDENT ":"); + TEST_COMPARE (msg.priority, priorities[msgnum]); + TEST_COMPARE (msg.facility, LOG_LOCAL0); + + if (++msgnum == array_length (priorities)) + break; + } +} + +static void +check_syslog_console (void) +{ + xmkfifo (_PATH_CONSOLE, 0666); + + pid_t sender_pid = xfork (); + if (sender_pid == 0) + { + send_openlog (LOG_CONS); + _exit (0); + } + + { + FILE *fp = xfopen (_PATH_CONSOLE, "r+"); + check_syslog_console_read (fp); + xfclose (fp); + } + + int status; + xwaitpid (sender_pid, &status, 0); + TEST_COMPARE (status, 0); + + unlink (_PATH_CONSOLE); +} + +static void +send_openlog_callback (void *clousure) +{ + int options = *(int *) clousure; + send_openlog (options); +} + +static void +check_syslog_perror (void) +{ + struct support_capture_subprocess result; + result = support_capture_subprocess (send_openlog_callback, + &(int){LOG_PERROR}); + + FILE *mfp = fmemopen (result.err.buffer, result.err.length, "r"); + if (mfp == NULL) + FAIL_EXIT1 ("fmemopen: %m"); + check_syslog_console_read (mfp); + xfclose (mfp); + + support_capture_subprocess_check (&result, "tst-openlog-child", 0, + sc_allow_stderr); + support_capture_subprocess_free (&result); +} + +static int +do_test (void) +{ + add_temp_file (_PATH_LOG); + add_temp_file (_PATH_CONSOLE); + + /* Send every combination of facility/priority over UDP and TCP. */ + check_syslog_udp (send_syslog, 0, check_syslog_message); + check_syslog_tcp (send_syslog, 0, check_syslog_message); + + /* Also check vsyslog. */ + check_syslog_udp (send_vsyslog, 0, check_syslog_message); + check_syslog_tcp (send_vsyslog, 0, check_syslog_message); + + /* Run some openlog/syslog/closelog combinations. */ + check_syslog_udp (send_openlog, 0, check_openlog_message); + check_syslog_tcp (send_openlog, 0, check_openlog_message); + + /* Check the LOG_PID option. */ + check_syslog_udp (send_openlog, LOG_PID, check_openlog_message); + check_syslog_tcp (send_openlog, LOG_PID, check_openlog_message); + + /* Check the LOG_CONS option. */ + check_syslog_console (); + + /* Check the LOG_PERROR option. */ + check_syslog_perror (); + + return 0; +} + +#include From patchwork Fri Mar 18 16:52:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52120 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 39EDE3888C57 for ; Fri, 18 Mar 2022 16:54:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 39EDE3888C57 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622487; bh=JhbvlHnEJWTL3wcfQe5u1N/kXZ9op6lnAYG/XYmgLFc=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=FXF4xjq3RiJDm/8r6zJcY7MUjrxVzW46s4sV1pDzz4FrnSoJ9KbRmiqUxbBg8UsHZ BJWbd4wMcysMb2cJ7YppZgV7BDt464GE/r4M1UfRG1X6IDxJ0c8W0+vKBB1WZJO6u/ R5X2ge5SXd9hFCCCQ4CPbeZAL3rm2P+hNa6ASCBk= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ot1-x335.google.com (mail-ot1-x335.google.com [IPv6:2607:f8b0:4864:20::335]) by sourceware.org (Postfix) with ESMTPS id D2F133888C79 for ; Fri, 18 Mar 2022 16:52:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D2F133888C79 Received: by mail-ot1-x335.google.com with SMTP id o20-20020a9d7194000000b005cb20cf4f1bso5935447otj.7 for ; Fri, 18 Mar 2022 09:52:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JhbvlHnEJWTL3wcfQe5u1N/kXZ9op6lnAYG/XYmgLFc=; b=VVMf2w0QnGUdNF3lRwfKGsk2SAS5qAtwLdvtfGbOpoRi7RULmS+GESYHaw026/RD6b zXK1s8r6rzcZCT9AkI8vm83d4sqRG4TEHKC+UfoESkSxL9C9CJMiJR6ENmGU0EdBBG2O jtLWsjnZB0pdyAUeAhvzHTNeFqn2SR4dX5egTnG9npPcMXUrozY6nvHocj+bmRmHaUWJ qpucLj2qmgOPc6lJVb0pcRl+XaShiKgost9fDDNKNzF5B2TUhwUKJo0XRwNYQ7ZBT/pJ 9UGxfFRUPkngH8sdq4Obs8v+hCqYAbj/WI/UVcXMv/th7ojjrdI67Vb/NTN7HpI9ssOB U97g== X-Gm-Message-State: AOAM530CvKvfy0xCIY+7jP0h+vl2K/YTeE7/rCS8dCmfM3SVY6R9mSIc PNG2KIYPrKA4lgIBuZ4IGIteJuFpqWjA8A== X-Google-Smtp-Source: ABdhPJy3ufnQgbg9EAC92ieJhxcdzPzT5R/qzf5LZ3xQVNJu79AVDxGxwZk49slQYM2vUfi2qNTcuw== X-Received: by 2002:a05:6830:155a:b0:5b2:5e26:e636 with SMTP id l26-20020a056830155a00b005b25e26e636mr3495069otp.185.1647622344637; Fri, 18 Mar 2022 09:52:24 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:24 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 3/7] misc: syslog: Fix indentation and style Date: Fri, 18 Mar 2022 13:52:10 -0300 Message-Id: <20220318165214.2291065-4-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" And also clenaup the headers, no semantic changes. --- misc/syslog.c | 471 ++++++++++++++++++++++++-------------------------- 1 file changed, 228 insertions(+), 243 deletions(-) diff --git a/misc/syslog.c b/misc/syslog.c index ee83b1bb76..0736459e7b 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -31,49 +31,33 @@ static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94"; #endif /* LIBC_SCCS and not lint */ -#include -#include -#include -#include -#include -#include - -#include -#include +#include #include +#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include +#include +#include +#include +#include #define ftell(s) _IO_ftell (s) -static int LogType = SOCK_DGRAM; /* type of socket connection */ -static int LogFile = -1; /* fd for log */ -static bool connected; /* have done connect */ -static int LogStat; /* status bits, set by openlog() */ +static int LogType = SOCK_DGRAM; /* type of socket connection */ +static int LogFile = -1; /* fd for log */ +static bool connected; /* have done connect */ +static int LogStat; /* status bits, set by openlog() */ static const char *LogTag; /* string to tag the entry with */ -static int LogFacility = LOG_USER; /* default facility code */ -static int LogMask = 0xff; /* mask of priorities to be logged */ -extern char *__progname; /* Program name, from crt0. */ +static int LogFacility = LOG_USER; /* default facility code */ +static int LogMask = 0xff; /* mask of priorities to be logged */ +extern char *__progname; /* Program name, from crt0. */ /* Define the lock. */ __libc_lock_define_initialized (static, syslog_lock) -static void openlog_internal(const char *, int, int); -static void closelog_internal(void); +static void openlog_internal (const char *, int, int); +static void closelog_internal (void); struct cleanup_arg { @@ -101,205 +85,204 @@ cancel_handler (void *ptr) * print message on log file; output is intended for syslogd(8). */ void -__syslog(int pri, const char *fmt, ...) +__syslog (int pri, const char *fmt, ...) { - va_list ap; + va_list ap; - va_start(ap, fmt); - __vsyslog_internal(pri, fmt, ap, 0); - va_end(ap); + va_start (ap, fmt); + __vsyslog_internal (pri, fmt, ap, 0); + va_end (ap); } ldbl_hidden_def (__syslog, syslog) ldbl_strong_alias (__syslog, syslog) void -__vsyslog(int pri, const char *fmt, va_list ap) +__vsyslog (int pri, const char *fmt, va_list ap) { - __vsyslog_internal(pri, fmt, ap, 0); + __vsyslog_internal (pri, fmt, ap, 0); } ldbl_weak_alias (__vsyslog, vsyslog) void -__syslog_chk(int pri, int flag, const char *fmt, ...) +__syslog_chk (int pri, int flag, const char *fmt, ...) { - va_list ap; + va_list ap; - va_start(ap, fmt); - __vsyslog_internal(pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0); - va_end(ap); + va_start (ap, fmt); + __vsyslog_internal (pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0); + va_end (ap); } void __vsyslog_chk(int pri, int flag, const char *fmt, va_list ap) { - __vsyslog_internal(pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0); + __vsyslog_internal (pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0); } void __vsyslog_internal(int pri, const char *fmt, va_list ap, unsigned int mode_flags) { - struct tm now_tm; - time_t now; - int fd; - FILE *f; - char *buf = 0; - size_t bufsize = 0; - size_t msgoff; - int saved_errno = errno; - char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; - -#define INTERNALLOG LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID - /* Check for invalid bits. */ - if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) { - syslog(INTERNALLOG, - "syslog: unknown facility/priority: %x", pri); - pri &= LOG_PRIMASK|LOG_FACMASK; + struct tm now_tm; + time_t now; + int fd; + FILE *f; + char *buf = 0; + size_t bufsize = 0; + size_t msgoff; + int saved_errno = errno; + char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; + +#define INTERNALLOG LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID + /* Check for invalid bits. */ + if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) + { + syslog (INTERNALLOG, "syslog: unknown facility/priority: %x", pri); + pri &= LOG_PRIMASK|LOG_FACMASK; + } + + /* Prepare for multiple users. We have to take care: most syscalls we are + using are cancellation points. */ + struct cleanup_arg clarg; + clarg.buf = NULL; + clarg.oldaction = NULL; + __libc_cleanup_push (cancel_handler, &clarg); + __libc_lock_lock (syslog_lock); + + /* Check priority against setlogmask values. */ + if ((LOG_MASK (LOG_PRI (pri)) & LogMask) == 0) + goto out; + + /* Set default facility if none specified. */ + if ((pri & LOG_FACMASK) == 0) + pri |= LogFacility; + + /* Build the message in a memory-buffer stream. */ + f = __open_memstream (&buf, &bufsize); + if (f == NULL) + { + /* We cannot get a stream. There is not much we can do but emitting an + error messages. */ + char numbuf[3 * sizeof (pid_t)]; + char *nump; + char *endp = __stpcpy (failbuf, "out of memory ["); + pid_t pid = __getpid (); + + nump = numbuf + sizeof (numbuf); + /* The PID can never be zero. */ + do + *--nump = '0' + pid % 10; + while ((pid /= 10) != 0); + + endp = __mempcpy (endp, nump, (numbuf + sizeof (numbuf)) - nump); + *endp++ = ']'; + *endp = '\0'; + buf = failbuf; + bufsize = endp - failbuf; + msgoff = 0; + } + else + { + __fsetlocking (f, FSETLOCKING_BYCALLER); + fprintf (f, "<%d>", pri); + now = time_now (); + f->_IO_write_ptr += __strftime_l (f->_IO_write_ptr, + f->_IO_write_end - f->_IO_write_ptr, + "%h %e %T ", + __localtime_r (&now, &now_tm), + _nl_C_locobj_ptr); + msgoff = ftell (f); + if (LogTag == NULL) + LogTag = __progname; + if (LogTag != NULL) + __fputs_unlocked (LogTag, f); + if (LogStat & LOG_PID) + fprintf (f, "[%d]", (int) __getpid ()); + if (LogTag != NULL) + { + __putc_unlocked (':', f); + __putc_unlocked (' ', f); } - /* Prepare for multiple users. We have to take care: most - syscalls we are using are cancellation points. */ - struct cleanup_arg clarg; - clarg.buf = NULL; - clarg.oldaction = NULL; - __libc_cleanup_push (cancel_handler, &clarg); - __libc_lock_lock (syslog_lock); - - /* Check priority against setlogmask values. */ - if ((LOG_MASK (LOG_PRI (pri)) & LogMask) == 0) - goto out; - - /* Set default facility if none specified. */ - if ((pri & LOG_FACMASK) == 0) - pri |= LogFacility; - - /* Build the message in a memory-buffer stream. */ - f = __open_memstream (&buf, &bufsize); - if (f == NULL) - { - /* We cannot get a stream. There is not much we can do but - emitting an error messages. */ - char numbuf[3 * sizeof (pid_t)]; - char *nump; - char *endp = __stpcpy (failbuf, "out of memory ["); - pid_t pid = __getpid (); - - nump = numbuf + sizeof (numbuf); - /* The PID can never be zero. */ - do - *--nump = '0' + pid % 10; - while ((pid /= 10) != 0); - - endp = __mempcpy (endp, nump, (numbuf + sizeof (numbuf)) - nump); - *endp++ = ']'; - *endp = '\0'; - buf = failbuf; - bufsize = endp - failbuf; - msgoff = 0; - } - else - { - __fsetlocking (f, FSETLOCKING_BYCALLER); - fprintf (f, "<%d>", pri); - now = time_now (); - f->_IO_write_ptr += __strftime_l (f->_IO_write_ptr, - f->_IO_write_end - - f->_IO_write_ptr, - "%h %e %T ", - __localtime_r (&now, &now_tm), - _nl_C_locobj_ptr); - msgoff = ftell (f); - if (LogTag == NULL) - LogTag = __progname; - if (LogTag != NULL) - __fputs_unlocked (LogTag, f); - if (LogStat & LOG_PID) - fprintf (f, "[%d]", (int) __getpid ()); - if (LogTag != NULL) - { - __putc_unlocked (':', f); - __putc_unlocked (' ', f); - } - - /* Restore errno for %m format. */ - __set_errno (saved_errno); - - /* We have the header. Print the user's format into the - buffer. */ - __vfprintf_internal (f, fmt, ap, mode_flags); - - /* Close the memory stream; this will finalize the data - into a malloc'd buffer in BUF. */ - fclose (f); - - /* Tell the cancellation handler to free this buffer. */ - clarg.buf = buf; - } - - /* Output to stderr if requested. */ - if (LogStat & LOG_PERROR) { - struct iovec iov[2]; - struct iovec *v = iov; - - v->iov_base = buf + msgoff; - v->iov_len = bufsize - msgoff; - /* Append a newline if necessary. */ - if (buf[bufsize - 1] != '\n') - { - ++v; - v->iov_base = (char *) "\n"; - v->iov_len = 1; - } - - /* writev is a cancellation point. */ - (void)__writev(STDERR_FILENO, iov, v - iov + 1); + /* Restore errno for %m format. */ + __set_errno (saved_errno); + + /* We have the header. Print the user's format into the buffer. */ + __vfprintf_internal (f, fmt, ap, mode_flags); + + /* Close the memory stream; this will finalize the data into a malloc'd + buffer in BUF. */ + fclose (f); + + /* Tell the cancellation handler to free this buffer. */ + clarg.buf = buf; + } + + /* Output to stderr if requested. */ + if (LogStat & LOG_PERROR) + { + struct iovec iov[2]; + struct iovec *v = iov; + + v->iov_base = buf + msgoff; + v->iov_len = bufsize - msgoff; + /* Append a newline if necessary. */ + if (buf[bufsize - 1] != '\n') + { + ++v; + v->iov_base = (char *) "\n"; + v->iov_len = 1; + } + + /* writev is a cancellation point. */ + __writev (STDERR_FILENO, iov, v - iov + 1); + } + + /* Get connected, output the message to the local logger. */ + if (!connected) + openlog_internal (NULL, LogStat | LOG_NDELAY, LogFacility); + + /* If we have a SOCK_STREAM connection, also send ASCII NUL as a record + terminator. */ + if (LogType == SOCK_STREAM) + ++bufsize; + + if (!connected || __send (LogFile, buf, bufsize, MSG_NOSIGNAL) < 0) + { + if (connected) + { + /* Try to reopen the syslog connection. Maybe it went down. */ + closelog_internal (); + openlog_internal (NULL, LogStat | LOG_NDELAY, LogFacility); } - /* Get connected, output the message to the local logger. */ - if (!connected) - openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility); - - /* If we have a SOCK_STREAM connection, also send ASCII NUL as - a record terminator. */ - if (LogType == SOCK_STREAM) - ++bufsize; - - if (!connected || __send(LogFile, buf, bufsize, MSG_NOSIGNAL) < 0) - { - if (connected) - { - /* Try to reopen the syslog connection. Maybe it went - down. */ - closelog_internal (); - openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility); - } - - if (!connected || __send(LogFile, buf, bufsize, MSG_NOSIGNAL) < 0) - { - closelog_internal (); /* attempt re-open next time */ - /* - * Output the message to the console; don't worry - * about blocking, if console blocks everything will. - * Make sure the error reported is the one from the - * syslogd failure. - */ - if (LogStat & LOG_CONS && - (fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY|O_CLOEXEC, - 0)) >= 0) - { - __dprintf (fd, "%s\r\n", buf + msgoff); - (void)__close(fd); - } - } - } + if (!connected || __send (LogFile, buf, bufsize, MSG_NOSIGNAL) < 0) + { + closelog_internal (); /* attempt re-open next time */ + /* + * Output the message to the console; don't worry + * about blocking, if console blocks everything will. + * Make sure the error reported is the one from the + * syslogd failure. + */ + if (LogStat & LOG_CONS && + (fd = __open (_PATH_CONSOLE, O_WRONLY | O_NOCTTY + | O_CLOEXEC, 0)) + >= 0) + { + __dprintf (fd, "%s\r\n", buf + msgoff); + __close (fd); + } + } + } out: - /* End of critical section. */ - __libc_cleanup_pop (0); - __libc_lock_unlock (syslog_lock); + /* End of critical section. */ + __libc_cleanup_pop (0); + __libc_lock_unlock (syslog_lock); - if (buf != failbuf) - free (buf); + if (buf != failbuf) + free (buf); } /* AF_UNIX address of local logger */ @@ -312,45 +295,47 @@ static const struct sockaddr_un SyslogAddr = static void openlog_internal(const char *ident, int logstat, int logfac) { - if (ident != NULL) - LogTag = ident; - LogStat = logstat; - if ((logfac &~ LOG_FACMASK) == 0) - LogFacility = logfac; - - int retry = 0; - while (retry < 2) { - if (LogFile == -1) { - if (LogStat & LOG_NDELAY) { - LogFile = __socket(AF_UNIX, LogType | SOCK_CLOEXEC, 0); - if (LogFile == -1) - return; - } - } - if (LogFile != -1 && !connected) + if (ident != NULL) + LogTag = ident; + LogStat = logstat; + if ((logfac &~ LOG_FACMASK) == 0) + LogFacility = logfac; + + int retry = 0; + while (retry < 2) + { + if (LogFile == -1) + { + if (LogStat & LOG_NDELAY) + { + LogFile = __socket (AF_UNIX, LogType | SOCK_CLOEXEC, 0); + if (LogFile == -1) + return; + } + } + if (LogFile != -1 && !connected) + { + int old_errno = errno; + if (__connect (LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1) + { + int saved_errno = errno; + int fd = LogFile; + LogFile = -1; + __close (fd); + __set_errno (old_errno); + if (saved_errno == EPROTOTYPE) { - int old_errno = errno; - if (__connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) - == -1) - { - int saved_errno = errno; - int fd = LogFile; - LogFile = -1; - (void)__close(fd); - __set_errno (old_errno); - if (saved_errno == EPROTOTYPE) - { - /* retry with the other type: */ - LogType = (LogType == SOCK_DGRAM - ? SOCK_STREAM : SOCK_DGRAM); - ++retry; - continue; - } - } else - connected = true; + /* retry with the other type: */ + LogType = LogType == SOCK_DGRAM ? SOCK_STREAM : SOCK_DGRAM; + ++retry; + continue; } - break; + } + else + connected = true; } + break; + } } void @@ -395,16 +380,16 @@ closelog (void) int setlogmask (int pmask) { - int omask; + int omask; - /* Protect against multiple users. */ - __libc_lock_lock (syslog_lock); + /* Protect against multiple users. */ + __libc_lock_lock (syslog_lock); - omask = LogMask; - if (pmask != 0) - LogMask = pmask; + omask = LogMask; + if (pmask != 0) + LogMask = pmask; - __libc_lock_unlock (syslog_lock); + __libc_lock_unlock (syslog_lock); - return (omask); + return (omask); } From patchwork Fri Mar 18 16:52:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52121 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F0F393888C59 for ; Fri, 18 Mar 2022 16:55:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F0F393888C59 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622534; bh=fNFOB4NVB/p3CO4xPyjZeWNuOOzulitN8ZNSoY3V2dI=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=lu4wbrH2PiKu1yE19IHnleIPnDenn+8ImXmClByxIbDh2V/8Ax5Wh2YUKh3xjji2j SnfuNJ8FDLVpMQJqr4rMdnXzmDRPfg3jUmEmhgTbNrxWkfnmgOhipqFjRVQyUgoIQs hXh9FZ+U3muxH7vSOLyl+kTdXMDs1sVOc3LHmHrc= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-oo1-xc36.google.com (mail-oo1-xc36.google.com [IPv6:2607:f8b0:4864:20::c36]) by sourceware.org (Postfix) with ESMTPS id 6FD573888C74 for ; Fri, 18 Mar 2022 16:52:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6FD573888C74 Received: by mail-oo1-xc36.google.com with SMTP id k13-20020a4a948d000000b003172f2f6bdfso10819315ooi.1 for ; Fri, 18 Mar 2022 09:52:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fNFOB4NVB/p3CO4xPyjZeWNuOOzulitN8ZNSoY3V2dI=; b=EGyjHtfNsj4+5IupFVy3rtLo/8cgTfW+tF6mqs8Izosr2ct8Ln8N6xibyAdDczj2YA wUHlZJfiSHBoeRAZ+nTlmWFXIM5ctOyMYYHGCzj2pWHW8z9uNf5igya5H5x6q0NMb5+a gTKTmt2VyHbnbZu8WlVlLV0t9pzL4xnQg8kFUIBGO6lcO/gg4XcdC5sPKYBAB60P9nyA z+fmSh4y2896gbfcf6rckcacKCmPi1qOCsnlavf/4Nhtz3iZdDP4+dXhKrUQ4dY930om THBaQKjF40fwg22d9UiP/lb7eYFwtZHaKU5wbhlhTFwZcBeJg2mTxT6w2Xas4Yril/BK CQGA== X-Gm-Message-State: AOAM532YSy/HFX6vCtyzo0AQv0C3Hk+Cn9GTpVMg8XwJjFtfCoWP4OPF yekTiEGLUevEKT6BvJF1n3JidMhqneYfhQ== X-Google-Smtp-Source: ABdhPJyl/bAT+eiHW4TeJnc4tcqnMvPMpQq33oAFauavpJkKccKQhF3KMV4kNiBcbAF9p7Lm56qnDQ== X-Received: by 2002:a05:6870:9a0f:b0:da:71ab:35fa with SMTP id fo15-20020a0568709a0f00b000da71ab35famr7503440oab.76.1647622346403; Fri, 18 Mar 2022 09:52:26 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:25 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 4/7] misc: syslog: Simplify implementation Date: Fri, 18 Mar 2022 13:52:11 -0300 Message-Id: <20220318165214.2291065-5-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Use a temporary buffer for strftime instead of using internal libio members, simplify fprintf call on the memstream and memory allocation, use dprintf instead of writev for LOG_PERROR. Checked on x86_64-linux-gnu and i686-linux-gnu. --- misc/syslog.c | 96 ++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 67 deletions(-) diff --git a/misc/syslog.c b/misc/syslog.c index 0736459e7b..e8b1dfe9b8 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -123,13 +123,10 @@ void __vsyslog_internal(int pri, const char *fmt, va_list ap, unsigned int mode_flags) { - struct tm now_tm; - time_t now; - int fd; FILE *f; char *buf = 0; size_t bufsize = 0; - size_t msgoff; + int msgoff; int saved_errno = errno; char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; @@ -143,9 +140,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, /* Prepare for multiple users. We have to take care: most syscalls we are using are cancellation points. */ - struct cleanup_arg clarg; - clarg.buf = NULL; - clarg.oldaction = NULL; + struct cleanup_arg clarg = { NULL, NULL }; __libc_cleanup_push (cancel_handler, &clarg); __libc_lock_lock (syslog_lock); @@ -159,51 +154,24 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, /* Build the message in a memory-buffer stream. */ f = __open_memstream (&buf, &bufsize); - if (f == NULL) - { - /* We cannot get a stream. There is not much we can do but emitting an - error messages. */ - char numbuf[3 * sizeof (pid_t)]; - char *nump; - char *endp = __stpcpy (failbuf, "out of memory ["); - pid_t pid = __getpid (); - - nump = numbuf + sizeof (numbuf); - /* The PID can never be zero. */ - do - *--nump = '0' + pid % 10; - while ((pid /= 10) != 0); - - endp = __mempcpy (endp, nump, (numbuf + sizeof (numbuf)) - nump); - *endp++ = ']'; - *endp = '\0'; - buf = failbuf; - bufsize = endp - failbuf; - msgoff = 0; - } - else + if (f != NULL) { __fsetlocking (f, FSETLOCKING_BYCALLER); - fprintf (f, "<%d>", pri); - now = time_now (); - f->_IO_write_ptr += __strftime_l (f->_IO_write_ptr, - f->_IO_write_end - f->_IO_write_ptr, - "%h %e %T ", - __localtime_r (&now, &now_tm), - _nl_C_locobj_ptr); - msgoff = ftell (f); - if (LogTag == NULL) - LogTag = __progname; - if (LogTag != NULL) - __fputs_unlocked (LogTag, f); - if (LogStat & LOG_PID) - fprintf (f, "[%d]", (int) __getpid ()); - if (LogTag != NULL) - { - __putc_unlocked (':', f); - __putc_unlocked (' ', f); - } - + /* "%h %e %H:%M:%S" */ + char timebuf[3+1 /* "%h " */ + + 2+1 /* "%e " */ + + 2+1 + 2+1 + 2+1 /* "%T" */]; + time_t now = time_now (); + struct tm now_tm; + __localtime_r (&now, &now_tm); + __strftime_l (timebuf, sizeof (timebuf), "%h %e %T", &now_tm, + _nl_C_locobj_ptr); + + pid_t pid = LogStat & LOG_PID ? __getpid () : 0; + + fprintf (f, "<%d>%s %n%s%s%.0d%s: ", pri, timebuf, &msgoff, + LogTag == NULL ? __progname : LogTag, + pid != 0 ? "[" : "", pid, pid != 0 ? "]" : ""); /* Restore errno for %m format. */ __set_errno (saved_errno); @@ -217,26 +185,19 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, /* Tell the cancellation handler to free this buffer. */ clarg.buf = buf; } + else + { + /* We cannot get a stream. There is not much we can do but emitting an + error messages. */ + bufsize = __snprintf (failbuf, sizeof failbuf, "out of memory[%d]", + __getpid ()); + buf = failbuf; + } /* Output to stderr if requested. */ if (LogStat & LOG_PERROR) - { - struct iovec iov[2]; - struct iovec *v = iov; - - v->iov_base = buf + msgoff; - v->iov_len = bufsize - msgoff; - /* Append a newline if necessary. */ - if (buf[bufsize - 1] != '\n') - { - ++v; - v->iov_base = (char *) "\n"; - v->iov_len = 1; - } - - /* writev is a cancellation point. */ - __writev (STDERR_FILENO, iov, v - iov + 1); - } + __dprintf (STDERR_FILENO, "%s%s", buf + msgoff, + buf[bufsize - 1] != '\n' ? "\n" : ""); /* Get connected, output the message to the local logger. */ if (!connected) @@ -265,6 +226,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, * Make sure the error reported is the one from the * syslogd failure. */ + int fd; if (LogStat & LOG_CONS && (fd = __open (_PATH_CONSOLE, O_WRONLY | O_NOCTTY | O_CLOEXEC, 0)) From patchwork Fri Mar 18 16:52:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52122 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BD5F03888C7D for ; Fri, 18 Mar 2022 16:56:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BD5F03888C7D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622575; bh=GHP2uCDonRT5MWelQPwXrARsb1GI5BKfCnXP0rT8IOc=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=MKEMWPnL/iU9UNcxwP6u7MtMxA/oiRfMGuiY1XaaVzE3JtUK3p4dl3JWH2HbP32KZ Lsx+dO7jwJU7/QtRKKY0BXr+VIyYUXsvMnJp3jz1U+G8KwkQcixk2/gn9GdAv6PVhn U81isaRX7iuMMlDtYr4PklZ7eivbGmHNf6UBtLpc= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ot1-x331.google.com (mail-ot1-x331.google.com [IPv6:2607:f8b0:4864:20::331]) by sourceware.org (Postfix) with ESMTPS id 2F8923888C79 for ; Fri, 18 Mar 2022 16:52:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2F8923888C79 Received: by mail-ot1-x331.google.com with SMTP id o106-20020a9d2273000000b005b21f46878cso5946080ota.3 for ; Fri, 18 Mar 2022 09:52:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GHP2uCDonRT5MWelQPwXrARsb1GI5BKfCnXP0rT8IOc=; b=tzjcHRZ5p8KNN1zS/MvOuwPKfdV3qItY0WZ8yiPEq/TQC01ffZnNAQtdT6RpHDUQQn pzkUEayA9JQPXGvjTXY5/+NSagsV/5kbZYjDj8xNTpT1nwejKQ6t1AURjKR+llaboqP8 RPIV9XzvdOvXyWnoFZkuMD2liTdmGF4tMTTxSfU4FK+5PDGjQJqxJeTPNY2GOSRAiAMw 13zvwJSdoWCXtKzd2imT43WbKVc/fWp+MSvewPbmzw+H0WNt6qUj9S2dTISPQROXXdNf zP8f5qsY0J4jNgitEzNdaOc7PX2R+D+Idobe03NoHu4spyBPD/+g60GUzf8SYGKk63RV smEg== X-Gm-Message-State: AOAM533HGQeOOXtiQif9jvrwn1jo2k2ZDssNkdN+6GwyT02onpOZ7UnG zq0cIE2J+XYVCHvfNflfIjD/7O/mHeSojw== X-Google-Smtp-Source: ABdhPJwbwjvAPeVgna6W/yPC0r9CuftHhBtGXmQyy0qOOH4ZbGLbOTqmF/CXmBw0PHUhm3oifV2eTg== X-Received: by 2002:a05:6830:108d:b0:5b2:38b1:f39c with SMTP id y13-20020a056830108d00b005b238b1f39cmr3603300oto.316.1647622348145; Fri, 18 Mar 2022 09:52:28 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:27 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 5/7] misc: syslog: Use fixed-sized buffer Date: Fri, 18 Mar 2022 13:52:12 -0300 Message-Id: <20220318165214.2291065-6-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" A fixed-sized buffer is used instead of memstream for messages up to 1024 bytes to avoid the potential BUFSIZ (8K) malloc and free for each syslog call. The memstream is still used as fallback for larger messages. Checked on x86_64-linux-gnu. --- misc/syslog.c | 102 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 37 deletions(-) diff --git a/misc/syslog.c b/misc/syslog.c index e8b1dfe9b8..7852441615 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -123,12 +123,11 @@ void __vsyslog_internal(int pri, const char *fmt, va_list ap, unsigned int mode_flags) { - FILE *f; - char *buf = 0; + char *buf = NULL; size_t bufsize = 0; + bool buf_malloced = false; int msgoff; int saved_errno = errno; - char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; #define INTERNALLOG LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID /* Check for invalid bits. */ @@ -152,46 +151,75 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, if ((pri & LOG_FACMASK) == 0) pri |= LogFacility; - /* Build the message in a memory-buffer stream. */ - f = __open_memstream (&buf, &bufsize); - if (f != NULL) + pid_t pid = LogStat & LOG_PID ? __getpid () : 0; + + enum + { + timestamp_size = sizeof "MMM DD hh:mm:ss ", + bufs_size = 1024 + }; + + /* "%h %e %H:%M:%S " */ + char timestamp[timestamp_size]; + time_t now = time_now (); + struct tm now_tm; + __localtime_r (&now, &now_tm); + __strftime_l (timestamp, sizeof timestamp, "%h %e %T ", &now_tm, + _nl_C_locobj_ptr); + +#define SYSLOG_HEADER(__pri, __timestamp, __msgoff, pid) \ + "<%d>%s %n%s%s%.0d%s: ", \ + __pri, __timestamp, __msgoff, \ + LogTag == NULL ? __progname : LogTag, \ + pid != 0 ? "[" : "", pid, pid != 0 ? "]" : "" + + /* Try to use a static buffer as an optimization. */ + char bufs[bufs_size]; + int l = __snprintf (bufs, sizeof bufs, + SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + if (l < sizeof (bufs)) { - __fsetlocking (f, FSETLOCKING_BYCALLER); - /* "%h %e %H:%M:%S" */ - char timebuf[3+1 /* "%h " */ - + 2+1 /* "%e " */ - + 2+1 + 2+1 + 2+1 /* "%T" */]; - time_t now = time_now (); - struct tm now_tm; - __localtime_r (&now, &now_tm); - __strftime_l (timebuf, sizeof (timebuf), "%h %e %T", &now_tm, - _nl_C_locobj_ptr); - - pid_t pid = LogStat & LOG_PID ? __getpid () : 0; - - fprintf (f, "<%d>%s %n%s%s%.0d%s: ", pri, timebuf, &msgoff, - LogTag == NULL ? __progname : LogTag, - pid != 0 ? "[" : "", pid, pid != 0 ? "]" : ""); + va_list apc; + va_copy (apc, ap); + /* Restore errno for %m format. */ __set_errno (saved_errno); - /* We have the header. Print the user's format into the buffer. */ - __vfprintf_internal (f, fmt, ap, mode_flags); + int vl = __vsnprintf_internal (bufs + l, sizeof bufs - l, fmt, apc, + mode_flags); + if (l + vl < sizeof bufs) + { + buf = bufs; + bufsize = l + vl; + } - /* Close the memory stream; this will finalize the data into a malloc'd - buffer in BUF. */ - fclose (f); - - /* Tell the cancellation handler to free this buffer. */ - clarg.buf = buf; + va_end (apc); } - else + + /* If the required size is larger than buffer size fallbacks to + open_memstream. */ + if (buf == NULL) { - /* We cannot get a stream. There is not much we can do but emitting an - error messages. */ - bufsize = __snprintf (failbuf, sizeof failbuf, "out of memory[%d]", - __getpid ()); - buf = failbuf; + FILE *f = __open_memstream (&buf, &bufsize); + if (f != NULL) + { + __fsetlocking (f, FSETLOCKING_BYCALLER); + fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + /* Restore errno for %m format. */ + __set_errno (saved_errno); + __vfprintf_internal (f, fmt, ap, mode_flags); + fclose (f); + + /* Tell the cancellation handler to free this buffer. */ + buf_malloced = true; + clarg.buf = buf; + } + else + { + bufsize = __snprintf (bufs, sizeof bufs, + "out of memory[%d]", __getpid ()); + buf = bufs; + } } /* Output to stderr if requested. */ @@ -243,7 +271,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, __libc_cleanup_pop (0); __libc_lock_unlock (syslog_lock); - if (buf != failbuf) + if (buf_malloced) free (buf); } From patchwork Fri Mar 18 16:52:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52123 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 70DCC388451F for ; Fri, 18 Mar 2022 16:56:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 70DCC388451F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622617; bh=Qzptpn06tltdiUUMWV9PasUxOg0MRhG2VvKWywUHIJU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=yTysZSGCc3EAWK54i4BXRlzWHksEK33YBLAsj5KCJ8GcemPPPdH9460TYuDXQfxEX xDg7OwFxzg3f3uHT53aP1rXTFiRz64ko6cLutQGaPTqtgA5dNIVqJgW8236faX4Vff g6hYEqF8OrmLWAbTp7K59P4JMI21D+LLubshF1zo= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-oi1-x22a.google.com (mail-oi1-x22a.google.com [IPv6:2607:f8b0:4864:20::22a]) by sourceware.org (Postfix) with ESMTPS id CF84B3888C57 for ; Fri, 18 Mar 2022 16:52:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CF84B3888C57 Received: by mail-oi1-x22a.google.com with SMTP id q189so9336574oia.9 for ; Fri, 18 Mar 2022 09:52:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Qzptpn06tltdiUUMWV9PasUxOg0MRhG2VvKWywUHIJU=; b=Swa0ZzPoO1dwvQgazcGXbfmny8YEegvbe/tNcjdnTHAABjxz/XdeEyN/x/FE4ijH67 GjxCp4wYNTha0ZIBtJkyDMr94Jogh7gcdBDPndtRWf0sX8j83sWyNNgdZ6A+NEw0fQFM q0QUfK8SX/DFxGyaoJSn4BhMw8v1ydKHqtBcnds0ZKNWiEPKTgwEQ6T+wUAHzM5ONkZy mvBcZgSht7AyUjNIv646SiJUHHp9ggi5t/dXh37M2KXkGFXdoY/NIg1M0DjJgThOq7Ui b40IATXExpBslWMJpKJw/Ib1NTEeVp2TAWguGhd/JF6aXp/YlTNIxIflDohABuF1OKR+ EdUA== X-Gm-Message-State: AOAM533XT9UFJwfap5jFqj6UhOCx/qXOC9oPwiMMx1z3TJnei0PchyjI 9t7f4Db/UKCGPZ7JAZm2zUkk3YwywGAU3g== X-Google-Smtp-Source: ABdhPJyqPkVo7rmnjvZB6fVGiomCh6etlqpHbuU1EBdVkOL+YaY0lC+5Ameim+BbnXE3+ZYdY5GI7A== X-Received: by 2002:a05:6808:1115:b0:2ec:e103:99c8 with SMTP id e21-20020a056808111500b002ece10399c8mr4503366oih.194.1647622349900; Fri, 18 Mar 2022 09:52:29 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:29 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 6/7] misc: syslog: Move SYSLOG_NAME to USE_MISC (BZ #16355) Date: Fri, 18 Mar 2022 13:52:13 -0300 Message-Id: <20220318165214.2291065-7-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" There is no easy solution as described on first comment in bug report, and some code (like busybox) assumes facilitynames existance when SYSLOG_NAMES is defined (so we can't just remove it as suggested in comment #2). So use the easier solution and guard it with __USE_MISC. --- misc/sys/syslog.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/sys/syslog.h b/misc/sys/syslog.h index dc3b0e7ef8..bf368d1b8d 100644 --- a/misc/sys/syslog.h +++ b/misc/sys/syslog.h @@ -62,7 +62,7 @@ #define LOG_PRI(p) ((p) & LOG_PRIMASK) #define LOG_MAKEPRI(fac, pri) ((fac) | (pri)) -#ifdef SYSLOG_NAMES +#if defined(SYSLOG_NAMES) && defined(__USE_MISC) #define INTERNAL_NOPRI 0x10 /* the "no priority" priority */ /* mark "facility" */ #define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES << 3, 0) @@ -118,7 +118,7 @@ CODE prioritynames[] = /* facility of pri */ #define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) -#ifdef SYSLOG_NAMES +#if defined(SYSLOG_NAMES) && defined(__USE_MISC) CODE facilitynames[] = { { "auth", LOG_AUTH }, From patchwork Fri Mar 18 16:52:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 52124 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3840E388451F for ; Fri, 18 Mar 2022 16:57:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3840E388451F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1647622659; bh=gg4cct4f5cKlFK/5g0VvI/HdFpXDSpHBkJPEyu/IIDA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=hgOnbdsc/iEr5DHhXZXHEKq8K0oVEAZT/3h8Bx4lpzTRDOscUA55F2c79GMXMpO3b IVfzp0XbwJVPdb4pB/9XLml06n7DBoaOno2XkD+18UaM4wqyAiC1zlBEyTpcvN4Pny LBsmjzEFQXdbYxetMsFD/1ZQYC3KhoBEC4wkJoyo= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ot1-x330.google.com (mail-ot1-x330.google.com [IPv6:2607:f8b0:4864:20::330]) by sourceware.org (Postfix) with ESMTPS id A24273853804 for ; Fri, 18 Mar 2022 16:52:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A24273853804 Received: by mail-ot1-x330.google.com with SMTP id z9-20020a05683020c900b005b22bf41872so5916853otq.13 for ; Fri, 18 Mar 2022 09:52:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gg4cct4f5cKlFK/5g0VvI/HdFpXDSpHBkJPEyu/IIDA=; b=K6wszxQLGQofviQ9JmzQUdTD98+DTR/l10KRnsk8TK3GYmGPY78vVBhrdFNngKfAmi hjIx8spJtMU9CsoEKIqnIxzUEB4hvfYaWF3QKrg1c+MSr8B3rb8/FC3OLBTgnESUcUEg TA5T/z7l4zDuVPretOqVPvutoR6NHdQ79Vop2Adr9f5uvOPz8UMRIbBiFCyb85KRdwIF oMgg27BCjmbFkv3f+jB/HzlGe70lRn52ECh8fIfpQwfXR3SF2NgT+WO99hxBQmnIhHWI d4RnQAsj5uroCgWZc8YXmmByXtGgV9REZLXNG5MN04HBLAKgzQCtlgV9HbgJ3GHmAxQz tcUA== X-Gm-Message-State: AOAM531eK7V7kfDZCPDUwiJu5AfY8Xi8w9ck4lIxpwhkkz1giKvO63Nw C4JcoLwEtXKkj7BBgTCfpA/f3qtPikxXNA== X-Google-Smtp-Source: ABdhPJyqhydSy8dhuSfuO4kuYlYN60jabdWuN7zmt0dIvYusKmvCo3iblrw8VlexwZjFj26AHvgZrw== X-Received: by 2002:a9d:5614:0:b0:5b2:5fe3:8f1c with SMTP id e20-20020a9d5614000000b005b25fe38f1cmr3623537oti.229.1647622351622; Fri, 18 Mar 2022 09:52:31 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:99a3:99e2:1060:da92:ae49]) by smtp.gmail.com with ESMTPSA id c12-20020a9d75cc000000b005b24b061940sm3986417otl.33.2022.03.18.09.52.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Mar 2022 09:52:31 -0700 (PDT) To: libc-alpha@sourceware.org, Paul Eggert Subject: [PATCH v3 7/7] misc: Use gmtime instead of localtime Date: Fri, 18 Mar 2022 13:52:14 -0300 Message-Id: <20220318165214.2291065-8-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> References: <20220318165214.2291065-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" We deviate from RFC3164 which states timestamp should be in localtime because although our __localtime_r does not set tzname, the relay still might still use localtime (which does) and if the server timezone changes it might result in wrong timestamp from client. It still does not help if a process switches its TZ setting from a timezone that has leap seconds, to one that doesn't (or vice versa), but this would incur in other problems. It also handles the highly unlikely case where gmtime might return NULL, in this case only the PRI is set to hopefully instruct the relay to get eh TIMESTAMP (as defined by the RFC). Finally it also uses internally the 64 bit time_t interfaces (to avoid y2038 issues on 32 bit legacy architectures). Checked on x86_64-linux-gnu and i686-linux-gnu. --- misc/syslog.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/misc/syslog.c b/misc/syslog.c index 7852441615..997e423228 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -161,11 +161,25 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, /* "%h %e %H:%M:%S " */ char timestamp[timestamp_size]; - time_t now = time_now (); + __time64_t now = time64_now (); + + /* We deviate from RFC3164 which states timestamp should be in localtime + because although our __localtime_r does not set tzname, the relay still + might still use localtime (which does) and if the server timezone changes + it might result in wrong timestamp from client. It still does not help + if a process switches its TZ setting from a timezone that has leap + seconds, to one that doesn't (or vice versa), but this would incur in + other problems. */ struct tm now_tm; - __localtime_r (&now, &now_tm); - __strftime_l (timestamp, sizeof timestamp, "%h %e %T ", &now_tm, - _nl_C_locobj_ptr); + bool has_ts = __gmtime64_r (&now, &now_tm) != NULL; + + /* In the highly unlike case of gmtime_r failure (the clock being + INT_MIN + 1900 or follow INT_MAX + 1900) we skip the hostname so the + message is handl as valid PRI but without TIMESTAMP or invalid TIMESTAMP + (which should force the relay to add the timestamp itself). */ + if (has_ts) + __strftime_l (timestamp, sizeof timestamp, "%h %e %T ", &now_tm, + _nl_C_locobj_ptr); #define SYSLOG_HEADER(__pri, __timestamp, __msgoff, pid) \ "<%d>%s %n%s%s%.0d%s: ", \ @@ -173,10 +187,18 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, LogTag == NULL ? __progname : LogTag, \ pid != 0 ? "[" : "", pid, pid != 0 ? "]" : "" +#define SYSLOG_HEADER_WITHOUT_TS(__pri, __msgoff) \ + "<%d>: %n", __pri, __msgoff + /* Try to use a static buffer as an optimization. */ char bufs[bufs_size]; - int l = __snprintf (bufs, sizeof bufs, - SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + int l; + if (has_ts) + l = __snprintf (bufs, sizeof bufs, + SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + else + l = __snprintf (bufs, sizeof bufs, + SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff)); if (l < sizeof (bufs)) { va_list apc; @@ -204,7 +226,10 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, if (f != NULL) { __fsetlocking (f, FSETLOCKING_BYCALLER); - fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + if (has_ts) + fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + else + fprintf (f, SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff)); /* Restore errno for %m format. */ __set_errno (saved_errno); __vfprintf_internal (f, fmt, ap, mode_flags);