libc: import cleaned up syslog() function from sources

this fixes a potential format string problem where the
error string is passed to werrstr() as fmt. also, the
directory comparsion is simplified in this version using
a helper function.
front
cinap_lenrek 2014-11-07 08:42:19 +01:00
parent 958d698bf8
commit 5364fa720d
1 changed files with 20 additions and 21 deletions

View File

@ -25,6 +25,14 @@ _syslogopen(void)
sl.fd = open(buf, OWRITE|OCEXEC);
}
static int
eqdirdev(Dir *a, Dir *b)
{
return a != nil && b != nil &&
a->dev == b->dev && a->type == b->type &&
a->qid.path == b->qid.path;
}
/*
* Print
* sysname: time: mesg
@ -50,40 +58,31 @@ syslog(int cons, char *logname, char *fmt, ...)
* hasn't broken our fd's
*/
d = dirfstat(sl.fd);
if(sl.fd < 0
|| sl.name == nil
|| strcmp(sl.name, logname)!=0
|| sl.d == nil
|| d == nil
|| d->dev != sl.d->dev
|| d->type != sl.d->type
|| d->qid.path != sl.d->qid.path){
if(sl.fd < 0 || sl.name == nil || strcmp(sl.name, logname) != 0 ||
!eqdirdev(d, sl.d)){
free(sl.name);
sl.name = strdup(logname);
if(sl.name == nil)
cons = 1;
else{
free(sl.d);
sl.d = nil;
_syslogopen();
if(sl.fd < 0)
cons = 1;
free(sl.d);
sl.d = d;
d = nil; /* don't free it */
else
sl.d = dirfstat(sl.fd);
}
}
free(d);
if(cons){
d = dirfstat(sl.consfd);
if(sl.consfd < 0
|| d == nil
|| sl.consd == nil
|| d->dev != sl.consd->dev
|| d->type != sl.consd->type
|| d->qid.path != sl.consd->qid.path){
sl.consfd = open("#c/cons", OWRITE|OCEXEC);
if(sl.consfd < 0 || !eqdirdev(d, sl.consd)){
free(sl.consd);
sl.consd = d;
d = nil; /* don't free it */
sl.consd = nil;
sl.consfd = open("#c/cons", OWRITE|OCEXEC);
if(sl.consfd >= 0)
sl.consd = dirfstat(sl.consfd);
}
free(d);
}
@ -94,11 +93,11 @@ syslog(int cons, char *logname, char *fmt, ...)
}
ctim = ctime(time(0));
werrstr(err);
p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname());
strncpy(p, ctim+4, 15);
p += 15;
*p++ = ' ';
errstr(err, sizeof err);
va_start(arg, fmt);
p = vseprint(p, buf+sizeof(buf)-1, fmt, arg);
va_end(arg);