From: Xinze Chi Date: Tue, 13 Dec 2016 08:43:03 +0000 (+0800) Subject: common/blkdev: use realpath instead of readlink to resolve the recursion symbol link X-Git-Tag: v11.1.1~53^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F12462%2Fhead;p=ceph.git common/blkdev: use realpath instead of readlink to resolve the recursion symbol link Signed-off-by: Xinze Chi --- diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index 26f3d580d2f..f3262d53a81 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 = '!';