Skip to content

Commit 80503b0

Browse files
committed
Fix caching logic for CachedOnDiskCorpus
1 parent 8dd5118 commit 80503b0

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

crates/libafl/src/corpus/cached.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,20 @@ impl<I> CachedOnDiskCorpus<I>
2929
where
3030
I: Input,
3131
{
32-
fn cache_testcase<'a>(
33-
&'a self,
34-
testcase: &'a RefCell<Testcase<I>>,
35-
id: CorpusId,
36-
) -> Result<(), Error> {
37-
if testcase.borrow().input().is_none() {
38-
self.load_input_into(&mut testcase.borrow_mut())?;
32+
fn cache_testcase_input<'a>(&'a self, testcase: &'a mut Testcase<I>) -> Result<(), Error> {
33+
let id = testcase
34+
.corpus_id()
35+
.ok_or(Error::unknown("The testcase is not associated with an id"))?;
36+
if testcase.input().is_none() {
37+
self.inner.load_input_into(testcase)?;
3938
let mut borrowed_num = 0;
4039
while self.cached_indexes.borrow().len() >= self.cache_max_len {
41-
let removed = self.cached_indexes.borrow_mut().pop_front().unwrap();
40+
let to_be_evicted = self.cached_indexes.borrow_mut().pop_front().unwrap();
4241

43-
if let Ok(mut borrowed) = self.inner.get_from_all(removed)?.try_borrow_mut() {
42+
if let Ok(mut borrowed) = self.inner.get_from_all(to_be_evicted)?.try_borrow_mut() {
4443
*borrowed.input_mut() = None;
4544
} else {
46-
self.cached_indexes.borrow_mut().push_back(removed);
45+
self.cached_indexes.borrow_mut().push_back(to_be_evicted);
4746
borrowed_num += 1;
4847
if self.cache_max_len == borrowed_num {
4948
break;
@@ -106,16 +105,12 @@ where
106105
/// Get by id; considers only enabled testcases
107106
#[inline]
108107
fn get(&self, id: CorpusId) -> Result<&RefCell<Testcase<I>>, Error> {
109-
let testcase = { self.inner.get(id)? };
110-
self.cache_testcase(testcase, id)?;
111-
Ok(testcase)
108+
self.inner.get(id)
112109
}
113110
/// Get by id; considers both enabled and disabled testcases
114111
#[inline]
115112
fn get_from_all(&self, id: CorpusId) -> Result<&RefCell<Testcase<I>>, Error> {
116-
let testcase = { self.inner.get_from_all(id)? };
117-
self.cache_testcase(testcase, id)?;
118-
Ok(testcase)
113+
self.inner.get_from_all(id)
119114
}
120115

121116
/// Current testcase scheduled
@@ -169,7 +164,8 @@ where
169164

170165
#[inline]
171166
fn load_input_into(&self, testcase: &mut Testcase<I>) -> Result<(), Error> {
172-
self.inner.load_input_into(testcase)
167+
self.cache_testcase_input(testcase)?;
168+
Ok(())
173169
}
174170

175171
#[inline]

crates/libafl/src/corpus/inmemory.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ impl<I> TestcaseStorage<I> {
257257
#[cfg(not(feature = "corpus_btreemap"))]
258258
fn insert_inner(&mut self, testcase: RefCell<Testcase<I>>, is_disabled: bool) -> CorpusId {
259259
let id = CorpusId::from(self.progressive_id);
260+
testcase.borrow_mut().set_corpus_id(Some(id));
260261
self.progressive_id += 1;
261262
let corpus = if is_disabled {
262263
&mut self.disabled

crates/libafl/src/corpus/testcase.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ pub struct Testcase<I> {
5252
scheduled_count: usize,
5353
/// Number of executions done at discovery time
5454
executions: u64,
55+
/// The [`CorpusId`], if added to a corpus
56+
corpus_id: Option<CorpusId>,
5557
/// Parent [`CorpusId`], if known
5658
parent_id: Option<CorpusId>,
5759
/// If the testcase is "disabled"
@@ -207,6 +209,18 @@ impl<I> Testcase<I> {
207209
self.disabled = disabled;
208210
}
209211

212+
/// Get the corpus id of the testcase
213+
#[inline]
214+
pub fn corpus_id(&self) -> Option<CorpusId> {
215+
self.corpus_id
216+
}
217+
218+
/// Set the corpus id of the testcase
219+
#[inline]
220+
pub fn set_corpus_id(&mut self, id: Option<CorpusId>) {
221+
self.corpus_id = id;
222+
}
223+
210224
/// Get the hit feedbacks
211225
#[inline]
212226
#[cfg(feature = "track_hit_feedbacks")]
@@ -250,6 +264,7 @@ impl<I> Testcase<I> {
250264
cached_len: None,
251265
executions: 0,
252266
scheduled_count: 0,
267+
corpus_id: None,
253268
parent_id: None,
254269
disabled: false,
255270
objectives_found: 0,
@@ -275,6 +290,7 @@ impl<I> Testcase<I> {
275290
cached_len: None,
276291
executions: 0,
277292
scheduled_count: 0,
293+
corpus_id: None,
278294
parent_id: Some(parent_id),
279295
disabled: false,
280296
objectives_found: 0,
@@ -302,6 +318,7 @@ impl<I> Testcase<I> {
302318
cached_len: None,
303319
executions: 0,
304320
scheduled_count: 0,
321+
corpus_id: None,
305322
parent_id: None,
306323
disabled: false,
307324
objectives_found: 0,
@@ -350,6 +367,7 @@ impl<I> Default for Testcase<I> {
350367
exec_time: None,
351368
cached_len: None,
352369
scheduled_count: 0,
370+
corpus_id: None,
353371
parent_id: None,
354372
#[cfg(feature = "std")]
355373
file_path: None,

0 commit comments

Comments
 (0)