summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-23 11:45:08 -0700
committerSage Weil <sage@inktank.com>2013-08-26 13:03:43 -0700
commitaf9818c486484c7617c07f26beaded8a3bc88043 (patch)
treefd6915f0b44d96d41078cc21900932240b570db4
parentcce1d1f9cd8b034deee29d8566780763beb0155f (diff)
downloadceph-af9818c486484c7617c07f26beaded8a3bc88043.tar.gz
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 <sage@inktank.com> (cherry picked from commit 2df66d9fa214e90eb5141df4d5755b57e8ba9413) Conflicts: src/os/BtrfsFileStoreBackend.cc
-rw-r--r--src/os/FileStore.cc8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index 5bd581f6254..9de73eca8b5 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<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) {