svn commit: r300269 - stable/10/usr.bin/catman
Don Lewis
truckman at FreeBSD.org
Fri May 20 06:24:17 UTC 2016
Author: truckman
Date: Fri May 20 06:24:16 2016
New Revision: 300269
URL: https://svnweb.freebsd.org/changeset/base/300269
Log:
MFC r299577, r299578, r299589
r299577 | truckman | 2016-05-12 16:14:31 -0700 (Thu, 12 May 2016) | 15 lines
Avoid Coverity NUL termination warning about strncpy() by using
memcpy() instead. It's probably a bit more optimal in this case
anyway. [1]
The program logic leading up to the creation of the strncpy/memcpy
destination buffer is a bit hairy. Add a call to assert() to make
it clear what is happening here and detect any potential buffer
overruns in the future.
Check a couple syscall error returns. Ignore the EEXIST error from
link() to preserve existing behavior. [2] [3]
r299578 | truckman | 2016-05-12 16:37:58 -0700 (Thu, 12 May 2016) | 2 lines
If fchdir() fails, call err() instead of warn().
r299589 | truckman | 2016-05-12 22:49:02 -0700 (Thu, 12 May 2016) | 4 lines
Instead of ignoring the EEXIST from link(), unconditionally unlink
the terget before calling link(). This should prevent links to an
old copy of the file from being retained.
Reported by: Coverity
CID: 1009659 [1], 1009349 [2], 1009350 [3]
Modified:
stable/10/usr.bin/catman/catman.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/usr.bin/catman/catman.c
==============================================================================
--- stable/10/usr.bin/catman/catman.c Fri May 20 06:19:00 2016 (r300268)
+++ stable/10/usr.bin/catman/catman.c Fri May 20 06:24:16 2016 (r300269)
@@ -34,9 +34,11 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/utsname.h>
+#include <assert.h>
#include <ctype.h>
#include <dirent.h>
#include <err.h>
+#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <langinfo.h>
@@ -267,7 +269,8 @@ get_cat_section(char *section)
char *cat_section;
cat_section = strdup(section);
- strncpy(cat_section, "cat", 3);
+ assert(strlen(section) > 3 && strncmp(section, "man", 3) == 0);
+ memcpy(cat_section, "cat", 3);
return cat_section;
}
@@ -419,8 +422,11 @@ process_page(char *mandir, char *src, ch
fprintf(stderr, "%slink %s -> %s\n",
verbose ? "\t" : "", cat, link_name);
}
- if (!pretend)
- link(link_name, cat);
+ if (!pretend) {
+ (void) unlink(cat);
+ if (link(link_name, cat) < 0)
+ warn("%s %s: link", link_name, cat);
+ }
return;
}
insert_hashtable(links, src_ino, src_dev, strdup(cat));
@@ -608,7 +614,8 @@ select_sections(const struct dirent *ent
static void
process_mandir(char *dir_name, char *section)
{
- fchdir(starting_dir);
+ if (fchdir(starting_dir) < 0)
+ err(1, "fchdir");
if (already_visited(NULL, dir_name, section == NULL))
return;
check_writable(dir_name);
More information about the svn-src-all
mailing list