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]
This commit is contained in:
truckman 2016-05-12 23:14:31 +00:00
parent b47968a7ae
commit b854e8f912

View File

@ -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, char *cat, enum Ziptype zipped)
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 *entry)
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);