From: Sage Weil Date: Fri, 23 Aug 2013 18:45:08 +0000 (-0700) Subject: os: fix readdir_r buffer size X-Git-Tag: v0.61.9~25 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=af9818c486484c7617c07f26beaded8a3bc88043;p=ceph.git os: fix readdir_r buffer size The buffer needs to be big or else we're walk all over the stack. Backport: dumpling, cuttlefish, bobtail Signed-off-by: Sage Weil (cherry picked from commit 2df66d9fa214e90eb5141df4d5755b57e8ba9413) Conflicts: src/os/BtrfsFileStoreBackend.cc --- diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 5bd581f6254f..9de73eca8b52 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -1483,8 +1483,9 @@ int FileStore::mount() goto close_basedir_fd; } + char dbuf[offsetof(struct dirent, d_name) + PATH_MAX + 1]; struct dirent *de; - while (::readdir_r(dir, (struct dirent *)buf, &de) == 0) { + while (::readdir_r(dir, (struct dirent *)dbuf, &de) == 0) { if (!de) break; long long unsigned c; @@ -4428,8 +4429,9 @@ int FileStore::list_collections(vector& 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) {