aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/gen
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1995-10-05 00:11:15 +0000
committerPeter Wemm <peter@FreeBSD.org>1995-10-05 00:11:15 +0000
commit11e67a9f2e43c4640fc9e50e721bbba38a8354e4 (patch)
treead41a496deeec936619768282a2278e08b145ff9 /lib/libc/gen
parent378b2956dde08e59656a5a3ec80e29d2fc99e4ef (diff)
downloadsrc-11e67a9f2e43c4640fc9e50e721bbba38a8354e4.tar.gz
src-11e67a9f2e43c4640fc9e50e721bbba38a8354e4.zip
Fix the problem that I aroused with the last commit..
What was happening, is if syslogd was not running, syslog() would do a strcat("\r\n") on a non-null-terminated buffer, and write it to the console. This meant that sometimes extra characters could be written to the console during boot, depending on the stack contents. This totally avoids the potential problem by using writev() like the rest of the does, and avoid modifying the buffer after the trouble we've gone to to carefully protect it. This is actually a trivial fix, in spite of the long commit message.. :-) It only appeared during boot and shutdown with syslogd stopped.
Notes
Notes: svn path=/head/; revision=11192
Diffstat (limited to 'lib/libc/gen')
-rw-r--r--lib/libc/gen/syslog.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/libc/gen/syslog.c b/lib/libc/gen/syslog.c
index 3c50e25a37ff..dd5a8cca004f 100644
--- a/lib/libc/gen/syslog.c
+++ b/lib/libc/gen/syslog.c
@@ -241,10 +241,16 @@ vsyslog(pri, fmt, ap)
*/
if (LogStat & LOG_CONS &&
(fd = open(_PATH_CONSOLE, O_WRONLY, 0)) >= 0) {
- (void)strcat(tbuf, "\r\n");
- cnt += 2;
- p = index(tbuf, '>') + 1;
- (void)write(fd, p, cnt - (p - tbuf));
+ struct iovec iov[2];
+ register struct iovec *v = iov;
+
+ p = strchr(tbuf, '>') + 1;
+ v->iov_base = p;
+ v->iov_len = cnt - (p - tbuf);
+ ++v;
+ v->iov_base = "\r\n";
+ v->iov_len = 2;
+ (void)writev(fd, iov, 2);
(void)close(fd);
}
}