diff options
author | Sage Weil <sage@inktank.com> | 2013-08-23 11:45:08 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-26 13:01:38 -0700 |
commit | 989a664ef0d1c716cab967f249112f595cf98c43 (patch) | |
tree | 81ae027fb097e259a3f2179e88fdf0c0aa0b52bb | |
parent | a4cca31c82bf0e84272e01eb1b3188dfdb5b5615 (diff) | |
download | ceph-989a664ef0d1c716cab967f249112f595cf98c43.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.cc | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 108a857ab9f..cbf7b792309 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -1510,8 +1510,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; @@ -4380,8 +4381,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) { |