Skip to content

Commit e1ab8eb

Browse files
committed
mds: fix issues with use-after-free in C_Flush_Journal
Resolved use-after-free issue of ESubtreeMap. The subtreemap event gets destroyed after it is submitted to the log. MDLog::submit_event() now returns a sequence number of the submitted event. Fixes: https://tracker.ceph.com/issues/69953 Signed-off-by: Milind Changire <[email protected]>
1 parent d14fb9a commit e1ab8eb

File tree

3 files changed

+7
-6
lines changed

3 files changed

+7
-6
lines changed

src/mds/MDLog.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ LogSegment* MDLog::_start_new_segment(SegmentBoundary* sb)
389389
return ls;
390390
}
391391

392-
void MDLog::_submit_entry(LogEvent *le, MDSLogContextBase* c)
392+
LogSegment::seq_t MDLog::_submit_entry(LogEvent *le, MDSLogContextBase* c)
393393
{
394394
dout(20) << __func__ << " " << *le << dendl;
395395
ceph_assert(ceph_mutex_is_locked_by_me(mds->mds_lock));
@@ -436,6 +436,7 @@ void MDLog::_submit_entry(LogEvent *le, MDSLogContextBase* c)
436436
}
437437

438438
unflushed++;
439+
return event_seq;
439440
}
440441

441442
void MDLog::_segment_upkeep()

src/mds/MDLog.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,12 @@ class MDLog {
136136

137137
void finish_head_waiters();
138138

139-
void submit_entry(LogEvent *e, MDSLogContextBase* c = 0) {
139+
LogSegment::seq_t submit_entry(LogEvent *e, MDSLogContextBase* c = 0) {
140140
std::lock_guard l(submit_mutex);
141-
_submit_entry(e, c);
141+
auto seq = _submit_entry(e, c);
142142
_segment_upkeep();
143143
submit_cond.notify_all();
144+
return seq;
144145
}
145146

146147
void wait_for_safe(Context* c);
@@ -293,7 +294,7 @@ class MDLog {
293294
void try_to_commit_open_file_table(uint64_t last_seq);
294295
LogSegment* _start_new_segment(SegmentBoundary* sb);
295296
void _segment_upkeep();
296-
void _submit_entry(LogEvent* e, MDSLogContextBase* c);
297+
LogSegment::seq_t _submit_entry(LogEvent* e, MDSLogContextBase* c);
297298

298299
void try_expire(LogSegment *ls, int op_prio);
299300
void _maybe_expired(LogSegment *ls, int op_prio);

src/mds/MDSRank.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ class C_Flush_Journal : public MDSInternalContext {
9898
// I need to seal off the current segment, and then mark all
9999
// previous segments for expiry
100100
auto* sle = mdcache->create_subtree_map();
101-
mdlog->submit_entry(sle);
102-
seq = sle->get_seq();
101+
seq = mdlog->submit_entry(sle);
103102

104103
Context *ctx = new LambdaContext([this](int r) {
105104
handle_clear_mdlog(r);

0 commit comments

Comments
 (0)