From nobody Mon Aug 22 02:39:04 2022 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4M9xQ113bxz4ZW5g; Mon, 22 Aug 2022 02:39:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4M9xQ10XLPz460J; Mon, 22 Aug 2022 02:39:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1661135945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=E/kA7q9L3lndmu68pSg9d0dLFWBSZVV1FlgHJ0p4Y/I=; b=eTRVjJEwKsH49kVOWa4Zsva1wStOFsSrSUw3bycp8/zmFZmhXCYAaXFmEtUhU8Ps2bPKCY +tWGlTqoxSwPXlSuxpQhrqOjLXW0Iooc21mfuuHLWLSKDAf2991kmLRaCQAw83NaJo0cLa xq6tKe4VFZjHZ0d920qLwrkMtZQQmn1HLgqmNKsH8n2HxkRcVGKrroZRDI6ldYfPdtb/c4 yOlcuPOLjFI5kp86UYjfImbJQSLQvpNj/g/Z6oAwxveBl2Hju4rIHCEeAFJVMWvVIGUvS5 EtIOLyhckRVDfMgbnr6q7JnXTFNj2gUsG++tcQueAxQbJlikF7DdLJhWuDkWmg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4M9xQ06jH8zZ1r; Mon, 22 Aug 2022 02:39:04 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 27M2d4Dt083045; Mon, 22 Aug 2022 02:39:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 27M2d4YU083044; Mon, 22 Aug 2022 02:39:04 GMT (envelope-from git) Date: Mon, 22 Aug 2022 02:39:04 GMT Message-Id: <202208220239.27M2d4YU083044@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Eugene Grosbein Subject: git: 09387f73b1a8 - stable/12 - syslog(3): unbreak log generation using fabricated PID List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: eugen X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: 09387f73b1a8a1b9359c1e92f5a5c6aea61aefce Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1661135945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=E/kA7q9L3lndmu68pSg9d0dLFWBSZVV1FlgHJ0p4Y/I=; b=E+QYygS9Mfrj6FOniL9ESw6ONwabNKCVoPGP7OCzeRfzdLuu6MFRslENqytcTcf9wWecWH cMWL9Q2mOm4QKBbB1QNDFNwyCYXdFVc4Yq3YilA/tUmXxdDDTKU4FJVva9a0/qnzWeaIWH 3XQkkq0JWNuvhJ3lTNAilGQpK54BCkIaLFS5K0pcKSCc34feyvraYQXUoqvd9MjwtaFNRn 9oUW3762ZfI7hgWQNWEKjy5Dmqa6KOJPDp7vwTWXeYhhwk5VUsbgrFbL+WDLnha84Rx6O+ uYswEFs+tPAOlgwFE6VkPItMdNueaRHp2dLuNoMjH9wQU1Y6Qz/INiEkEGx4rw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1661135945; a=rsa-sha256; cv=none; b=PaCI0vna2/wIqyLpYP3+CceqJ/WggVn6eeTGIX5SzPtuca3jIQC4Sab0Un63mkBy7lwn9V +9eu2rRKiTNEVzGB3lJ/y2ESwhlrILR3pAdKY07Lglw+1O/U046gXiA4XRihlAK70YRUEc fhGU5Lx01kV4H6z1De6g8leO28BJQJ/csrcAc3aSvPW1gS4wkJR0bEBAzuAVpSIIMUIP0f 6WHBdBgkzXkBDUdStBFKsutzGH3ntONPPaY74n4Gmnm1OqtmaKLuiSMs+IBbtzPvIsAOFZ sXF7Bwn88BTJ1qgHb7crCYs3gq2OQ7ZgvDQlCfvr/Mb5mRlTNbrhQm5jUZ5VzA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/12 has been updated by eugen: URL: https://cgit.FreeBSD.org/src/commit/?id=09387f73b1a8a1b9359c1e92f5a5c6aea61aefce commit 09387f73b1a8a1b9359c1e92f5a5c6aea61aefce Author: Eugene Grosbein AuthorDate: 2022-08-08 22:21:02 +0000 Commit: Eugene Grosbein CommitDate: 2022-08-22 02:38:44 +0000 syslog(3): unbreak log generation using fabricated PID Recover application ability to supply fabricated PID embedded into ident that was lost when libc switched to generation of RFC 5424 log messages, for example: logger -t "ident[$$]" -p user.notice "test" It is essential for long running scripts. Also, this change unbreaks matching resulted entries by ident in syslog.conf: !ident *.* /var/log/ident.log Without the fix, the log (and matching) was broken: Aug 1 07:36:58 hostname ident[123][86483]: test Now it works as expected and worked before breakage: Aug 1 07:39:40 hostname ident[123]: test Differential: https://reviews.freebsd.org/D36005 (cherry picked from commit e9ae9fa93745669b7dd0341d333257ad6cfe8e37) --- lib/libc/gen/syslog.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/lib/libc/gen/syslog.c b/lib/libc/gen/syslog.c index 19d44db0075a..41b243627a17 100644 --- a/lib/libc/gen/syslog.c +++ b/lib/libc/gen/syslog.c @@ -61,7 +61,9 @@ static int LogFile = -1; /* fd for log */ static int status; /* connection status */ static int opened; /* have done openlog() */ static int LogStat = 0; /* status bits, set by openlog() */ +static pid_t LogPid = -1; /* process id to tag the entry with */ static const char *LogTag = NULL; /* string to tag the entry with */ +static int LogTagLength = -1; /* usable part of LogTag */ static int LogFacility = LOG_USER; /* default facility code */ static int LogMask = 0xff; /* mask of priorities to be logged */ static pthread_mutex_t syslog_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -81,6 +83,7 @@ static pthread_mutex_t syslog_mutex = PTHREAD_MUTEX_INITIALIZER; static void disconnectlog(void); /* disconnect from syslogd */ static void connectlog(void); /* (re)connect to syslogd */ static void openlog_unlocked(const char *, int, int); +static void parse_tag(void); /* parse ident[NNN] if needed */ enum { NOCONN = 0, @@ -206,13 +209,20 @@ vsyslog1(int pri, const char *fmt, va_list ap) /* Application name. */ if (LogTag == NULL) LogTag = _getprogname(); - (void)fprintf(fp, "%s ", LogTag == NULL ? NILVALUE : LogTag); + else if (LogTagLength == -1) + parse_tag(); + if (LogTagLength > 0) + (void)fprintf(fp, "%.*s ", LogTagLength, LogTag); + else + (void)fprintf(fp, "%s ", LogTag == NULL ? NILVALUE : LogTag); /* * Provide the process ID regardless of whether LOG_PID has been * specified, as it provides valuable information. Many * applications tend not to use this, even though they should. */ - (void)fprintf(fp, "%d ", getpid()); + if (LogPid == -1) + LogPid = getpid(); + (void)fprintf(fp, "%d ", (int)LogPid); /* Message ID. */ (void)fputs(NILVALUE " ", fp); /* Structured data. */ @@ -444,9 +454,12 @@ connectlog(void) static void openlog_unlocked(const char *ident, int logstat, int logfac) { - if (ident != NULL) + if (ident != NULL) { LogTag = ident; + LogTagLength = -1; + } LogStat = logstat; + parse_tag(); if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0) LogFacility = logfac; @@ -476,6 +489,7 @@ closelog(void) LogFile = -1; } LogTag = NULL; + LogTagLength = -1; status = NOCONN; THREAD_UNLOCK(); } @@ -493,3 +507,37 @@ setlogmask(int pmask) THREAD_UNLOCK(); return (omask); } + +/* + * Obtain LogPid from LogTag formatted as following: ident[NNN] + */ +static void +parse_tag(void) +{ + char *begin, *end, *p; + pid_t pid; + + if (LogTag == NULL || (LogStat & LOG_PID) != 0) + return; + /* + * LogTagLength is -1 if LogTag was not parsed yet. + * Avoid multiple passes over same LogTag. + */ + LogTagLength = 0; + + /* Check for presence of opening [ and non-empty ident. */ + if ((begin = strchr(LogTag, '[')) == NULL || begin == LogTag) + return; + /* Check for presence of closing ] at the very end and non-empty pid. */ + if ((end = strchr(begin + 1, ']')) == NULL || end[1] != 0 || + (end - begin) < 2) + return; + + /* Check for pid to contain digits only. */ + pid = (pid_t)strtol(begin + 1, &p, 10); + if (p != end) + return; + + LogPid = pid; + LogTagLength = begin - LogTag; +}