Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F131897763
D36005.id108768.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D36005.id108768.diff
View Options
diff --git a/lib/libc/gen/syslog.c b/libc/gen/syslog.c
--- a/lib/libc/gen/syslog.c
+++ b/libc/gen/syslog.c
@@ -65,7 +65,9 @@
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 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 @@
/* 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 @@
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 @@
LogFile = -1;
}
LogTag = NULL;
+ LogTagLength = -1;
connected = false;
THREAD_UNLOCK();
}
@@ -447,3 +461,37 @@
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;
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Oct 13, 1:42 AM (7 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23629922
Default Alt Text
D36005.id108768.diff (2 KB)
Attached To
Mode
D36005: Unbreak syslogging with fabricated PID
Attached
Detach File
Event Timeline
Log In to Comment