svn commit: r299577 - head/usr.bin/catman
Don Lewis
truckman at FreeBSD.org
Thu May 12 23:14:32 UTC 2016
Author: truckman
Date: Thu May 12 23:14:31 2016
New Revision: 299577
URL: https://svnweb.freebsd.org/changeset/base/299577
Log:
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]
Reported by: Coverity
CID: 1009659 [1], 1009349 [2], 1009350 [3]
Modified:
head/usr.bin/catman/catman.c
Modified: head/usr.bin/catman/catman.c
==============================================================================
--- head/usr.bin/catman/catman.c Thu May 12 22:51:04 2016 (r299576)
+++ head/usr.bin/catman/catman.c Thu May 12 23:14:31 2016 (r299577)
@@ -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;
}
@@ -420,7 +423,8 @@ process_page(char *mandir, char *src, ch
verbose ? "\t" : "", cat, link_name);
}
if (!pretend)
- link(link_name, cat);
+ if (link(link_name, cat) < 0 && errno != EEXIST)
+ warn("%s %s: link", link_name, cat);
return;
}
insert_hashtable(links, src_ino, src_dev, strdup(cat));
@@ -608,7 +612,8 @@ select_sections(const struct dirent *ent
static void
process_mandir(char *dir_name, char *section)
{
- fchdir(starting_dir);
+ if (fchdir(starting_dir) < 0)
+ warn("fchdir");
if (already_visited(NULL, dir_name, section == NULL))
return;
check_writable(dir_name);
More information about the svn-src-head
mailing list