]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/blkdev: use realpath instead of readlink to resolve the recursion symbol link 12462/head
authorXinze Chi <xinze@xsky.com>
Tue, 13 Dec 2016 08:43:03 +0000 (16:43 +0800)
committerXinze Chi <xinze@xsky.com>
Tue, 13 Dec 2016 14:14:46 +0000 (22:14 +0800)
Signed-off-by: Xinze Chi <xinze@xsky.com>
src/common/blkdev.cc

index 26f3d580d2f2f552e25c095afb70f744414ac7e8..f3262d53a81c5252bcd595fd8c1b7d54ac723b35 100644 (file)
@@ -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 = '!';