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-23 11:45:08 -0700
commit2df66d9fa214e90eb5141df4d5755b57e8ba9413 (patch)
tree597ea19f36248ed34120af3a17ba6f3a616cb1ac
parentfe5010380a3a18ca85f39403e8032de1dddbe905 (diff)
downloadceph-2df66d9fa214e90eb5141df4d5755b57e8ba9413.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>
-rw-r--r--src/os/BtrfsFileStoreBackend.cc5
-rw-r--r--src/os/FileStore.cc5
2 files changed, 6 insertions, 4 deletions
diff --git a/src/os/BtrfsFileStoreBackend.cc b/src/os/BtrfsFileStoreBackend.cc
index 9fa96babab7..ac7d1014ac7 100644
--- a/src/os/BtrfsFileStoreBackend.cc
+++ b/src/os/BtrfsFileStoreBackend.cc
@@ -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;
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index 80561056daa..81407373685 100644
--- a/src/os/FileStore.cc
+++ b/src/os/FileStore.cc
@@ -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) {