diff options
author | 2003-07-07 00:51:52 +0000 | |
---|---|---|
committer | 2003-07-07 00:51:52 +0000 | |
commit | 28b0d5b1d49d3722d1673dc28e3e2a86970083c7 (patch) | |
tree | ab6624d443b922097d81218d17021dcadd976518 | |
parent | protos (diff) | |
download | wireguard-openbsd-28b0d5b1d49d3722d1673dc28e3e2a86970083c7.tar.xz wireguard-openbsd-28b0d5b1d49d3722d1673dc28e3e2a86970083c7.zip |
Repair last commit, the NUL termination of locname is required
for the strlcat() to work since the buffer gets used for each
entry in a directory.
-rw-r--r-- | sbin/restore/dirs.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sbin/restore/dirs.c b/sbin/restore/dirs.c index 17e515b12ed..8c87a886ea3 100644 --- a/sbin/restore/dirs.c +++ b/sbin/restore/dirs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dirs.c,v 1.22 2003/07/06 15:42:07 avsm Exp $ */ +/* $OpenBSD: dirs.c,v 1.23 2003/07/07 00:51:52 millert Exp $ */ /* $NetBSD: dirs.c,v 1.26 1997/07/01 05:37:49 lukem Exp $ */ /* @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)dirs.c 8.5 (Berkeley) 8/31/94"; #else -static char rcsid[] = "$OpenBSD: dirs.c,v 1.22 2003/07/06 15:42:07 avsm Exp $"; +static char rcsid[] = "$OpenBSD: dirs.c,v 1.23 2003/07/07 00:51:52 millert Exp $"; #endif #endif /* not lint */ @@ -229,6 +229,7 @@ treescan(pname, ino, todo) { struct inotab *itp; struct direct *dp; + int namelen; long bpt; char locname[MAXPATHLEN + 1]; @@ -249,7 +250,9 @@ treescan(pname, ino, todo) * begin search through the directory * skipping over "." and ".." */ - (void)snprintf(locname, sizeof(locname), "%s/", pname); + namelen = snprintf(locname, sizeof(locname), "%s/", pname); + if (namelen >= sizeof(locname)) + namelen = sizeof(locname) - 1; rst_seekdir(dirp, itp->t_seekpt, itp->t_seekpt); dp = rst_readdir(dirp); /* "." */ if (dp != NULL && strcmp(dp->d_name, ".") == 0) @@ -267,7 +270,8 @@ treescan(pname, ino, todo) * a zero inode signals end of directory */ while (dp != NULL) { - if (strlen(locname) + dp->d_namlen >= sizeof(locname)) { + locname[namelen] = '\0'; + if (namelen + dp->d_namlen >= sizeof(locname)) { fprintf(stderr, "%s%s: name exceeds %d char\n", locname, dp->d_name, sizeof(locname) - 1); } else { |