Invoke the dirname() function in a POSIX compliant way.

POSIX requires that the argument of dirname() is of type "char *". In
other words, the input buffer can be modified by the function to store
the directory name.

Pull a copy of the string before calling dirname(). We don't care about
freeing up the memory afterwards, as this is done at the very bottom of
main(), right before the program terminates.

Reviewed by:	bapt
Differential Revision:	https://reviews.freebsd.org/D6628
This commit is contained in:
Ed Schouten 2016-05-29 10:41:27 +00:00
parent 74bf497550
commit c200e14277

View File

@ -92,7 +92,7 @@ main(int argc, char *argv[])
size_t cnt = 0;
StringList *sl, ***svc;
size_t port, proto;
char *dbname_dir;
char *dbname_dir, *dbname_dirbuf;
int dbname_dir_fd = -1;
setprogname(argv[0]);
@ -172,7 +172,8 @@ main(int argc, char *argv[])
* fsync() to the directory where file lies
*/
if (rename(tname, dbname) == -1 ||
(dbname_dir = dirname(dbname)) == NULL ||
(dbname_dirbuf = strdup(dbname)) == NULL ||
(dbname_dir = dirname(dbname_dirbuf)) == NULL ||
(dbname_dir_fd = open(dbname_dir, O_RDONLY|O_DIRECTORY)) == -1 ||
fsync(dbname_dir_fd) != 0) {
if (dbname_dir_fd != -1)