From 0d1e9aabf650073800100b91f3810a7f167ed32d Mon Sep 17 00:00:00 2001 From: Xinze Chi Date: Tue, 13 Dec 2016 16:43:03 +0800 Subject: [PATCH] common/blkdev: use realpath instead of readlink to resolve the recursion symbol link Signed-off-by: Xinze Chi --- src/common/blkdev.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index 26f3d580d2f2f..f3262d53a81c5 100644 --- a/src/common/blkdev.cc +++ b/src/common/blkdev.cc @@ -65,21 +65,23 @@ int get_block_device_base(const char *dev, char *out, size_t out_len) struct stat st; int r = 0; DIR *dir; - char devname[PATH_MAX], fn[PATH_MAX]; + char devname[PATH_MAX] = {0}, fn[PATH_MAX] = {0}; char *p; char realname[PATH_MAX] = {0}; if (strncmp(dev, "/dev/", 5) != 0) { - if ((readlink(dev, realname, sizeof(realname)) == -1) || (strncmp(realname, "/dev/", 5) != 0)) + if (realpath(dev, realname) == NULL || (strncmp(realname, "/dev/", 5) != 0)) { return -EINVAL; + } } if (strlen(realname)) - strncpy(devname, realname + 5, PATH_MAX -1); + strncpy(devname, realname + 5, PATH_MAX - 5); else - strncpy(devname, dev + 5, PATH_MAX-1); + strncpy(devname, dev + 5, strlen(dev) - 5); + + devname[PATH_MAX - 1] = '\0'; - devname[PATH_MAX-1] = '\0'; for (p = devname; *p; ++p) if (*p == '/') *p = '!'; -- 2.39.5