1
0
mirror of https://github.com/ceph/ceph synced 2025-03-30 23:40:09 +00:00

Merge pull request from mslovy/wip-fix-infinitloops

os/filestore: fix infinit loops in fiemap()

Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
Sage Weil 2017-04-28 08:47:05 -05:00 committed by GitHub
commit bce9c53144
2 changed files with 26 additions and 8 deletions
src
os/filestore
test/objectstore

View File

@ -3257,17 +3257,14 @@ more:
i++;
last = extent++;
}
const bool is_last = last->fe_flags & FIEMAP_EXTENT_LAST;
uint64_t xoffset = last->fe_logical + last->fe_length - offset;
offset = last->fe_logical + last->fe_length;
len -= xoffset;
const bool is_last = (last->fe_flags & FIEMAP_EXTENT_LAST) || (len == 0);
free(fiemap);
if (!is_last) {
uint64_t xoffset = last->fe_logical + last->fe_length - offset;
offset = last->fe_logical + last->fe_length;
len -= xoffset;
free(fiemap); /* fix clang warn: use-after-free */
goto more;
}
else {
free(fiemap);
}
return r;
}

View File

@ -461,6 +461,7 @@ TEST_P(StoreTest, FiemapHoles) {
ASSERT_EQ(r, 0);
}
{
//fiemap test from 0 to SKIP_STEP * (MAX_EXTENTS - 1) + 3
bufferlist bl;
store->fiemap(cid, oid, 0, SKIP_STEP * (MAX_EXTENTS - 1) + 3, bl);
map<uint64_t,uint64_t> m, e;
@ -477,6 +478,26 @@ TEST_P(StoreTest, FiemapHoles) {
ASSERT_TRUE((m.size() == 1 &&
m[0] > SKIP_STEP * (MAX_EXTENTS - 1)) ||
(m.size() == MAX_EXTENTS && extents_exist));
// fiemap test from SKIP_STEP to SKIP_STEP * (MAX_EXTENTS - 2) + 3
// reset bufferlist and map
bl.clear();
m.clear();
e.clear();
store->fiemap(cid, oid, SKIP_STEP, SKIP_STEP * (MAX_EXTENTS - 2) + 3, bl);
p = bl.begin();
::decode(m, p);
cout << " got " << m << std::endl;
ASSERT_TRUE(!m.empty());
ASSERT_GE(m[SKIP_STEP], 3u);
extents_exist = true;
if (m.size() == (MAX_EXTENTS - 2)) {
for (uint64_t i = 1; i < MAX_EXTENTS - 1; i++)
extents_exist = extents_exist && m.count(SKIP_STEP*i);
}
ASSERT_TRUE((m.size() == 1 &&
m[SKIP_STEP] > SKIP_STEP * (MAX_EXTENTS - 2)) ||
(m.size() == (MAX_EXTENTS - 1) && extents_exist));
}
{
ObjectStore::Transaction t;