Date: Fri, 9 Sep 2016 07:10:50 +0000 (UTC) From: Ed Schouten <ed@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r305651 - head/usr.sbin/newsyslog Message-ID: <201609090710.u897AoSQ051362@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ed Date: Fri Sep 9 07:10:50 2016 New Revision: 305651 URL: https://svnweb.freebsd.org/changeset/base/305651 Log: Properly patch up dirname()/basename() calls to not clobber ent->log. It turns out that we had a couple of more calls to dirname()/basename() in newsyslog(8) that assume the input isn't clobbered. This is bad, because it apparently breaks log rotation now that the new dirname() implementation has been merged. Fix this by first copying the input and then calling dirname()/basename(). While there, improve the naming of variables in this function a bit. Reported by: Ryan Steinmetz, gjb Reviewed by: bdrewery, allanjude Differential Revision: https://reviews.freebsd.org/D7838 Modified: head/usr.sbin/newsyslog/newsyslog.c Modified: head/usr.sbin/newsyslog/newsyslog.c ============================================================================== --- head/usr.sbin/newsyslog/newsyslog.c Fri Sep 9 07:00:50 2016 (r305650) +++ head/usr.sbin/newsyslog/newsyslog.c Fri Sep 9 07:10:50 2016 (r305651) @@ -1510,11 +1510,11 @@ validate_old_timelog(int fd, const struc static void delete_oldest_timelog(const struct conf_entry *ent, const char *archive_dir) { - char *logfname, *s, *dir, errbuf[80]; + char *basebuf, *dirbuf, errbuf[80]; + const char *base, *dir; int dir_fd, i, logcnt, max_logcnt; struct oldlog_entry *oldlogs; struct dirent *dp; - const char *cdir; struct tm tm; DIR *dirp; @@ -1522,19 +1522,19 @@ delete_oldest_timelog(const struct conf_ max_logcnt = MAX_OLDLOGS; logcnt = 0; - if (archive_dir != NULL && archive_dir[0] != '\0') - cdir = archive_dir; - else - if ((cdir = dirname(ent->log)) == NULL) - err(1, "dirname()"); - if ((dir = strdup(cdir)) == NULL) - err(1, "strdup()"); + if (archive_dir != NULL && archive_dir[0] != '\0') { + dirbuf = NULL; + dir = archive_dir; + } else { + if ((dirbuf = strdup(ent->log)) == NULL) + err(1, "strdup()"); + dir = dirname(dirbuf); + } - if ((s = basename(ent->log)) == NULL) - err(1, "basename()"); - if ((logfname = strdup(s)) == NULL) + if ((basebuf = strdup(ent->log)) == NULL) err(1, "strdup()"); - if (strcmp(logfname, "/") == 0) + base = basename(basebuf); + if (strcmp(base, "/") == 0) errx(1, "Invalid log filename - became '/'"); if (verbose > 2) @@ -1545,7 +1545,7 @@ delete_oldest_timelog(const struct conf_ err(1, "Cannot open log directory '%s'", dir); dir_fd = dirfd(dirp); while ((dp = readdir(dirp)) != NULL) { - if (validate_old_timelog(dir_fd, dp, logfname, &tm) == 0) + if (validate_old_timelog(dir_fd, dp, base, &tm) == 0) continue; /* @@ -1610,8 +1610,8 @@ delete_oldest_timelog(const struct conf_ free(oldlogs[i].fname); } free(oldlogs); - free(logfname); - free(dir); + free(dirbuf); + free(basebuf); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201609090710.u897AoSQ051362>