]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
blkdev: Check return of snprintf and error on truncation
authorAdam C. Emerson <aemerson@redhat.com>
Tue, 8 May 2018 20:42:56 +0000 (16:42 -0400)
committerNathan Cutler <ncutler@suse.com>
Fri, 18 May 2018 13:30:35 +0000 (15:30 +0200)
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
(cherry picked from commit 1683aed5395fb2c195a25715a3dedb83db871fc1)

src/common/blkdev.cc

index 2e32b9dc969abd5688accfbbbe51065e33a83cab..0cd5bafd2acfc768a0d8485d6ff16c5bc971c9b5 100644 (file)
@@ -89,7 +89,10 @@ int get_block_device_base(const char *dev, char *out, size_t out_len)
     if (*p == '/')
       *p = '!';
 
-  snprintf(fn, sizeof(fn), "%s/sys/block/%s", sandbox_dir, devname);
+  if (static_cast<size_t>(snprintf(fn, sizeof(fn), "%s/sys/block/%s",
+                                   sandbox_dir, devname))
+      >= sizeof(fn))
+    return -ERANGE;
   if (stat(fn, &st) == 0) {
     if (strlen(devname) + 1 > out_len) {
       return -ERANGE;
@@ -107,8 +110,10 @@ int get_block_device_base(const char *dev, char *out, size_t out_len)
   while ((de = ::readdir(dir))) {
     if (de->d_name[0] == '.')
       continue;
-    snprintf(fn, sizeof(fn), "%s/sys/block/%s/%s", sandbox_dir, de->d_name,
-            devname);
+    if (static_cast<size_t>(snprintf(fn, sizeof(fn), "%s/sys/block/%s/%s",
+                                     sandbox_dir, de->d_name,
+                                     devname)) >= sizeof(fn))
+      return -ERANGE;
 
     if (stat(fn, &st) == 0) {
       // match!