seekdir_basic: fix various Coverity issues

Address..
- .. resource leaks of file descriptors and memory
- .. unchecked return values from creat(2), mkdir(2), and telldir(3)
- .. potential NULL derefs after calling readdir(3)

MFC after:	1 week
Reported by:	Coverity
CID:		975255, 975256, 976989, 978989, 978990
This commit is contained in:
Enji Cooper 2017-01-04 02:31:05 +00:00
parent 391df78ad4
commit 05aee7d5b0

View File

@ -39,6 +39,10 @@
#include <sys/stat.h>
#ifdef __FreeBSD__
#include <errno.h>
#endif
ATF_TC(seekdir_basic);
ATF_TC_HEAD(seekdir_basic, tc)
{
@ -54,10 +58,26 @@ ATF_TC_BODY(seekdir_basic, tc)
struct dirent *entry;
long here;
#ifdef __FreeBSD__
#define CREAT(x, m) do { \
int _creat_fd; \
ATF_REQUIRE_MSG((_creat_fd = creat((x), (m))), \
"creat(%s, %x) failed: %s", (x), (m), \
strerror(errno)); \
(void)close(_creat_fd); \
} while(0);
ATF_REQUIRE_MSG(mkdir("t", 0755) == 0,
"mkdir failed: %s", strerror(errno));
CREAT("t/a", 0600);
CREAT("t/b", 0600);
CREAT("t/c", 0600);
#else
mkdir("t", 0755);
creat("t/a", 0600);
creat("t/b", 0600);
creat("t/c", 0600);
#endif
dp = opendir("t");
if ( dp == NULL)
@ -70,9 +90,17 @@ ATF_TC_BODY(seekdir_basic, tc)
/* get first entry */
entry = readdir(dp);
here = telldir(dp);
#ifdef __FreeBSD__
ATF_REQUIRE_MSG(here != -1,
"telldir failed: %s", strerror(errno));
#endif
/* get second entry */
entry = readdir(dp);
#ifdef __FreeBSD__
ATF_REQUIRE_MSG(entry != NULL,
"readdir failed: %s", strerror(errno));
#endif
wasname = strdup(entry->d_name);
if (wasname == NULL)
atf_tc_fail("cannot allocate memory");
@ -109,6 +137,9 @@ ATF_TC_BODY(seekdir_basic, tc)
atf_tc_fail("3rd seekdir found wrong name");
closedir(dp);
#ifdef __FreeBSD__
free(wasname);
#endif
}
/* There is no sbrk on AArch64 and RISC-V */