]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os: fix readdir_r buffer size
authorSage Weil <sage@inktank.com>
Fri, 23 Aug 2013 18:45:08 +0000 (11:45 -0700)
committerSage Weil <sage@inktank.com>
Fri, 23 Aug 2013 18:45:08 +0000 (11:45 -0700)
The buffer needs to be big or else we're walk all over the stack.

Backport: dumpling, cuttlefish, bobtail
Signed-off-by: Sage Weil <sage@inktank.com>
src/os/BtrfsFileStoreBackend.cc
src/os/FileStore.cc

index 9fa96babab780dc39fdf3575520dfc04edaf0d84..ac7d1014ac7b9b110173a998e84360692613ab8e 100644 (file)
@@ -320,8 +320,9 @@ int BtrfsFileStoreBackend::list_checkpoints(list<string>& ls)
 
   list<string> snaps;
   char path[PATH_MAX];
-  struct dirent buf, *de;
-  while (::readdir_r(dir, &buf, &de) == 0) {
+  char buf[offsetof(struct dirent, d_name) + PATH_MAX + 1];
+  struct dirent *de;
+  while (::readdir_r(dir, (struct dirent *)&buf, &de) == 0) {
     if (!de)
       break;
 
index 80561056daabb82ab6d9ab51f1d085a8d7aaf5ed..814073736859d55737bc021ad0731366c049e938 100644 (file)
@@ -3787,8 +3787,9 @@ int FileStore::list_collections(vector<coll_t>& ls)
     return r;
   }
 
-  struct dirent sde, *de;
-  while ((r = ::readdir_r(dir, &sde, &de)) == 0) {
+  char buf[offsetof(struct dirent, d_name) + PATH_MAX + 1];
+  struct dirent *de;
+  while ((r = ::readdir_r(dir, (struct dirent *)&buf, &de)) == 0) {
     if (!de)
       break;
     if (de->d_type == DT_UNKNOWN) {