From eea9309423d577d62cf62d1f98444e22e264ef15 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 5 Feb 2016 18:41:22 -0500 Subject: [PATCH] Prevent zpool_find_vdev() from truncating vdev path When extracting tokens from the string strtok(2) is allowed to modify the passed buffer. Therefore the zfs_strcmp_pathname() function must make a copy of the passed string before passing it to strtok(3). Signed-off-by: Brian Behlendorf Signed-off-by: Don Brady Closes #4312 --- lib/libzfs/libzfs_util.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/libzfs/libzfs_util.c b/lib/libzfs/libzfs_util.c index fa55fd3a634b..65b04c59ac96 100644 --- a/lib/libzfs/libzfs_util.c +++ b/lib/libzfs/libzfs_util.c @@ -1029,16 +1029,18 @@ zfs_strcmp_pathname(char *name, char *cmp, int wholedisk) int path_len, cmp_len; char path_name[MAXPATHLEN]; char cmp_name[MAXPATHLEN]; - char *dir; + char *dir, *dup; /* Strip redundant slashes if one exists due to ZPOOL_IMPORT_PATH */ memset(cmp_name, 0, MAXPATHLEN); - dir = strtok(cmp, "/"); + dup = strdup(cmp); + dir = strtok(dup, "/"); while (dir) { strcat(cmp_name, "/"); strcat(cmp_name, dir); dir = strtok(NULL, "/"); } + free(dup); if (name[0] != '/') return (zfs_strcmp_shortname(name, cmp_name, wholedisk));