Fix do_link portion of ctime test

From the man page of dirname: " Both dirname() and basename()
may modify the contents of path, so it may be desirable to pass
a copy when calling one of these functions." And in fact on linux
using dirname actually changes the contents of the passed parameter as
evident from the following failure when running the ctime test:

link(/root/zfs-mount, /root/zfs-mount/link_file)

Fix this by creating a copy of the input parameter and passing that
to dirname, thus not compromising the original parameter, allowing
the creation of hard link to succeed.

Signed-off-by: Nikolay Borisov <n.borisov.lkml@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4977
This commit is contained in:
Nikolay Borisov 2016-08-16 23:00:16 +03:00 committed by Brian Behlendorf
parent d9eea113f8
commit 8658115c19
1 changed files with 3 additions and 1 deletions

View File

@ -145,17 +145,19 @@ do_link(const char *pfile)
{
int ret = 0;
char link_file[BUFSIZ] = { 0 };
char pfile_copy[BUFSIZ] = { 0 };
char *dname;
if (pfile == NULL) {
return (-1);
}
strcpy(pfile_copy, pfile);
/*
* Figure out source file directory name, and create
* the link file in the same directory.
*/
dname = dirname((char *)pfile);
dname = dirname((char *)pfile_copy);
(void) snprintf(link_file, BUFSIZ, "%s/%s", dname, "link_file");
if (link(pfile, link_file) == -1) {