From nobody Mon Aug 8 22:30:34 2022 X-Original-To: dev-commits-src-all@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 4M1rWH1dzHz4YMnQ; Mon, 8 Aug 2022 22:30:35 +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 4M1rWH1BWtz49m5; Mon, 8 Aug 2022 22:30:35 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1659997835; 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=uiyuDpfboqvQRbIRzhqdTqkJ0S74pC98Kxtdz/1U86M=; b=jZB4KIF8GuJ8DKB4S42TAd/jM2EYLvu/1/MK2CyQJfiZZZJn2Lt06dDL1VuTrugLoriZB5 BZ/9GKPP7j7B2oKTYrVlK8gTlAXak1pjEbi17XQItBWChx1k95jv22RLL9XOMl+SRsY4+M h/YMwst/4ihQkceL/KgnRJuXoPlQw1uwBEOR3rm8eFqkeM3XIf86U1wGUDb/c5awO8SM23 iC65CBwj6l1zl3AXjkhj7wOrPQENAoRjiWrYz9nvYy+GmWhdRLvj5Egx8G4TK4pdRPoT78 JQNMnJCYjx1JBd+Pd2U4xAXNXhjbQk1T6Vl/Ylm7c7d9jYjJnh2aihQY/mj9Mg== 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 4M1rWH0Gp1z17g9; Mon, 8 Aug 2022 22:30:35 +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 278MUYsd078397; Mon, 8 Aug 2022 22:30:34 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 278MUYZd078396; Mon, 8 Aug 2022 22:30:34 GMT (envelope-from git) Date: Mon, 8 Aug 2022 22:30:34 GMT Message-Id: <202208082230.278MUYZd078396@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Eugene Grosbein Subject: git: e9ae9fa93745 - main - syslog(3): unbreak log generation using fabricated PID List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@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/main X-Git-Reftype: branch X-Git-Commit: e9ae9fa93745669b7dd0341d333257ad6cfe8e37 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1659997835; 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=uiyuDpfboqvQRbIRzhqdTqkJ0S74pC98Kxtdz/1U86M=; b=QRQleJN3zAFUhinkQ5QALij33jU64Uppk1qumQCS9wYWZ6AykHYEpxkGP6M5izyeDoEXLI 0MRthLnhKYyEGcghmTLwdCXqusbcFW8om8lW/qQKBtaSl/BUehNG/DspkWktDnQx5+thC4 uEnWbAo7rnfeazjf56WOP9Dc18US1iTw5AtWqN+UrfrpiXLXl6IXKPG/loh0lHyHRh/AXL vU8C6u0n5edGA2B9awkoBsaHCcvpsdFdZRuWnxWD6p7KDZWuLwtopbXOJPwIK7umeMvqIW ZyeYR2cSte+enkUgS0/1P4D2UaHzK7dOePTzDykztSU+GBmpJYKKQIYtf72aow== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1659997835; a=rsa-sha256; cv=none; b=o6zkelWwHQ11tXJAogAfMuSm0KR63LeI277nc0s9euVDMqPY1wUkkO2Lta7lfjBqz0gt2c xty7IJfTTPvLbIkbVhuqmAihvsV/o7tw/KD+ro4rFytmkS3/U2nm3b+9knS6wsFcA0YL3q a3cSNaXgPdaV8pjrJATSozBeHk92wBwI1r728I/G95iu8jq3QCEV3YBOeNVj1PNiHDsJS5 jJs1wZgP8gGJTi71YW7odM6ccEw6ZhPddpTAnWDJMTm1hbO94qzwArtEYkzMjNayP1IiW3 /IskHAGoaBlzy/iypLJYe5VevDzW+SEIySJuVh4kyHbezOItHV80YPxL7abFWQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by eugen: URL: https://cgit.FreeBSD.org/src/commit/?id=e9ae9fa93745669b7dd0341d333257ad6cfe8e37 commit e9ae9fa93745669b7dd0341d333257ad6cfe8e37 Author: Eugene Grosbein AuthorDate: 2022-08-08 22:21:02 +0000 Commit: Eugene Grosbein CommitDate: 2022-08-08 22:21:02 +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 MFC after: 2 weeks --- 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 a466b4cbc49e..8d48f7f32836 100644 --- a/lib/libc/gen/syslog.c +++ b/lib/libc/gen/syslog.c @@ -65,7 +65,9 @@ static int LogFile = -1; /* fd for log */ static bool connected; /* have done connect */ 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; @@ -85,6 +87,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 */ /* * Format of the magic cookie passed through the stdio hook @@ -204,13 +207,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. */ @@ -398,9 +408,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; @@ -430,6 +443,7 @@ closelog(void) LogFile = -1; } LogTag = NULL; + LogTagLength = -1; connected = false; THREAD_UNLOCK(); } @@ -447,3 +461,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; +}