diff options
author | Sage Weil <sage@inktank.com> | 2013-08-23 11:45:08 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-23 11:45:08 -0700 |
commit | 2df66d9fa214e90eb5141df4d5755b57e8ba9413 (patch) | |
tree | 597ea19f36248ed34120af3a17ba6f3a616cb1ac | |
parent | fe5010380a3a18ca85f39403e8032de1dddbe905 (diff) | |
download | ceph-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.cc | 5 | ||||
-rw-r--r-- | src/os/FileStore.cc | 5 |
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) { |