Skip to content

Commit

Permalink
changes done
Browse files Browse the repository at this point in the history
  • Loading branch information
Swastic-007 committed Feb 19, 2025
1 parent 8440984 commit 5dab512
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 40 deletions.
10 changes: 7 additions & 3 deletions libafl/src/corpus/cached.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,13 @@ where
self.load_input_into(&mut testcase.borrow_mut())?;
let mut borrowed_num = 0;
while self.cached_indexes.borrow().len() >= self.cache_max_len {
let removed = self.cached_indexes.borrow_mut().pop_front().ok_or_else(|| {
Error::illegal_state("Cached indexes queue was unexpectedly empty")
})?;
let removed = self
.cached_indexes
.borrow_mut()
.pop_front()
.ok_or_else(|| {
Error::illegal_state("Cached indexes queue was unexpectedly empty")
})?;

if let Ok(mut borrowed) = self.inner.get_from_all(removed)?.try_borrow_mut() {
*borrowed.input_mut() = None;
Expand Down
11 changes: 8 additions & 3 deletions libafl/src/corpus/inmemory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,21 +79,26 @@ impl<I> TestcaseStorageMap<I> {
if let Some(item) = self.map.remove(&id) {
self.remove_key(id);
if let Some(prev) = item.prev {
self.map.get_mut(&prev).ok_or_else(|| Error::illegal_state("Unable to fetch previous CorpusId"))?.next = item.next;
self.map
.get_mut(&prev)
.ok_or_else(|| Error::illegal_state("Unable to fetch next CorpusId"))?
.next = item.next;
} else {
// first elem
self.first_id = item.next;
}
if let Some(next) = item.next {
self.map.get_mut(&next).ok_or_else(|| Error::illegal_state("Unable to fetch next CorpusId"))?.prev = item.prev;
self.map
.get_mut(&next)
.ok_or_else(|| Error::illegal_state("Unable to fetch previous CorpusId"))?
.prev = item.prev;
} else {
// last elem
self.last_id = item.prev;
}
Ok(item.testcase)
} else {
Err(Error::illegal_argument("Testcase not found in storage"))

}
}

Expand Down
49 changes: 24 additions & 25 deletions libafl/src/corpus/inmemory_ondisk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,10 @@ impl<I> InMemoryOnDiskCorpus<I> {
if testcase.filename().is_some() {
// We are renaming!

let old_filename = testcase.filename_mut().take().ok_or_else(|| Error::illegal_argument("Testcase missing filename for renaming"))?;
let old_filename = testcase
.filename_mut()
.take()
.ok_or_else(|| Error::illegal_argument("Testcase missing filename for renaming"))?;
let new_filename = filename;

// Do operations below when new filename is specified
Expand All @@ -357,31 +360,31 @@ impl<I> InMemoryOnDiskCorpus<I> {
where
I: Input,
{
let file_name = match testcase.filename_mut().take() {
Some(name) => name,
None => {
let input = testcase.input().as_ref().ok_or_else(|| {
Error::illegal_argument("Testcase missing input; cannot generate filename")
})?;
input.generate_name(id)
}
let file_name = if let Some(name) = testcase.filename_mut().take() {
name
} else {
let input = testcase.input().as_ref().ok_or_else(|| {
Error::illegal_argument("Testcase missing input; cannot generate filename")
})?;
input.generate_name(id)
};

let mut ctr = 1;
if self.locking {
let lockfile_name = format!(".{file_name}");
let lockfile_path = self.dir_path.join(lockfile_name);

let mut lockfile = try_create_new(&lockfile_path)?.or_else(|| {
OpenOptions::new()
.write(true)
.read(true)
.open(&lockfile_path)
.ok()
})
.ok_or_else(|| {
Error::illegal_state("Failed to open or create lockfile for testcase")
})?;
let mut lockfile = try_create_new(&lockfile_path)?
.or_else(|| {
OpenOptions::new()
.write(true)
.read(true)
.open(&lockfile_path)
.ok()
})
.ok_or_else(|| {
Error::illegal_state("Failed to open or create lockfile for testcase")
})?;
lockfile.lock_exclusive()?;

let mut old_ctr = String::new();
Expand All @@ -405,13 +408,9 @@ impl<I> InMemoryOnDiskCorpus<I> {
.as_ref()
.ok_or_else(|| Error::illegal_argument("Testcase missing filename for metadata"))?;
let metafile_name = if self.locking {
format!(
".{}_{}.metadata",
filename_ref,
ctr
)
format!(".{filename_ref}_{ctr}.metadata")
} else {
format!(".{}.metadata", filename_ref)
format!(".{filename_ref}.metadata")
};
let metafile_path = self.dir_path.join(&metafile_name);
let mut tmpfile_path = metafile_path.clone();
Expand Down
7 changes: 6 additions & 1 deletion libafl/src/corpus/minimizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,12 @@ where
let mut removed = Vec::with_capacity(state.corpus().count());
for (seed, (id, _)) in seed_exprs {
// if the model says the seed isn't there, mark it for deletion
if !model.eval(&seed, true).ok_or_else(|| Error::illegal_state("Error Evaluating Modal"))?.as_bool().ok_or_else(|| Error::illegal_state("Error converting condition to bool"))? {
if !model
.eval(&seed, true)
.ok_or_else(|| Error::illegal_state("Error evaluating model"))?
.as_bool()
.ok_or_else(|| Error::illegal_state("Error converting condition to bool"))?
{
removed.push(id);
}
}
Expand Down
17 changes: 9 additions & 8 deletions libafl/src/corpus/testcase.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ impl<I> Testcase<I> {
/// Returns this [`Testcase`] with a loaded `Input`]
pub fn load_input<C: Corpus<I>>(&mut self, corpus: &C) -> Result<&I, Error> {
corpus.load_input_into(self)?;
Ok(self.input.as_ref().ok_or_else(|| Error::illegal_argument("Error converting reference"))?)
self.input
.as_ref()
.ok_or_else(|| Error::illegal_argument("Error converting reference"))
}

/// Get the input, if available any
Expand Down Expand Up @@ -497,13 +499,12 @@ impl<I> Drop for Testcase<I> {
fn drop(&mut self) {
if let Some(filename) = &self.filename {
let mut path = PathBuf::from(filename);
let lockname = match path.file_name().and_then(|os_str| os_str.to_str()) {
Some(name) => format!(".{}.lafl_lock", name),
None => {
// Log an error or silently return if conversion fails.
eprintln!("Failed to convert filename to string for lock file.");
return;
}
let lockname = if let Some(name) = path.file_name().and_then(|os_str| os_str.to_str()) {
format!(".{name}.lafl_lock")
} else {
// Log an error or silently return if conversion fails.
eprintln!("Failed to convert filename to string for lock file.");
return;
};
path.set_file_name(lockname);
let _ = std::fs::remove_file(path);
Expand Down

0 comments on commit 5dab512

Please sign in to comment.