- if ((name = getenv("LOGNAME")) == NULL && (name = getenv("USER")) == NULL)
- name = "unknown";
- /* ISO 8601 International Standard Date format */
- strftime(nfmt, sizeof nfmt, "%Y-%m-%d %T ", t);
- sprintf(nfmt + strlen(nfmt), "[%s:%s%s] %s\n", name, Which[which], Modes[mode], fmt);
- va_start(argp, fmt);
- vfprintf(logfile, nfmt, argp);
- va_end(argp);
- fflush(logfile);
+ if ((name = getenv("LOGNAME")) == NULL &&
+ (name = getenv("USER")) == NULL) {
+ strcpy(sname, "unknown");
+ } else {
+ /*
+ * Since "name" will be embedded in a printf-like format,
+ * we must sanitize it:
+ *
+ * Limit its length so other information in the message
+ * is not truncated
+ *
+ * Squeeze out embedded whitespace for the benefit of
+ * log file parsers
+ *
+ * Escape embedded % characters with another %
+ */
+ for (i = 0, cp = name;
+ *cp != '\0' && i < (int)sizeof(sname) - 1; cp++) {
+ if (*cp == '%') {
+ if (i < (int)sizeof(sname) - 2) {
+ sname[i++] = '%';
+ sname[i++] = '%';
+ } else {
+ break;
+ }
+ } else if (!isspace(*cp)) {
+ sname[i++] = *cp;
+ } /* else do nothing */
+ }
+ if (i == 0) {
+ strcpy(sname, "unknown");
+ } else {
+ sname[i] = '\0';