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:
parent
b47968a7ae
commit
b854e8f912
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user