Fix forkserver regression in LTO mode (#1114)

* regression

* fix

* chg

* Comment

* fmt
This commit is contained in:
Dongjia "toka" Zhang 2023-03-02 10:17:20 +09:00 committed by GitHub
parent 452ca7a672
commit 2a926f6546
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -761,7 +761,6 @@ impl<'a, SP> ForkserverExecutorBuilder<'a, SP> {
// TODO set AFL_MAP_SIZE // TODO set AFL_MAP_SIZE
assert!(self.map_size.is_none() || map_size as usize <= self.map_size.unwrap()); assert!(self.map_size.is_none() || map_size as usize <= self.map_size.unwrap());
log::info!("Target MAP SIZE = {:#x}", self.real_map_size);
self.map_size = Some(map_size as usize); self.map_size = Some(map_size as usize);
} }
@ -782,35 +781,44 @@ impl<'a, SP> ForkserverExecutorBuilder<'a, SP> {
self.uses_shmem_testcase = true; self.uses_shmem_testcase = true;
} }
let send_len = forkserver.write_ctl(send_status)?; if (status & FS_OPT_AUTODICT == FS_OPT_AUTODICT) && self.autotokens.is_some() {
if send_len != 4 { log::info!("Using AUTODICT feature");
return Err(Error::unknown("Writing to forkserver failed.".to_string())); send_status |= FS_OPT_AUTODICT;
} }
if (send_status & FS_OPT_AUTODICT) == FS_OPT_AUTODICT { if send_status != FS_OPT_ENABLED {
let (read_len, dict_size) = forkserver.read_st()?; // if send_status is not changed (Options are available but we didn't use any), then don't send the next write_ctl message.
if read_len != 4 { // This is important
return Err(Error::unknown(
"Reading from forkserver failed.".to_string(), let send_len = forkserver.write_ctl(send_status)?;
)); if send_len != 4 {
return Err(Error::unknown("Writing to forkserver failed.".to_string()));
} }
if !(2..=0xffffff).contains(&dict_size) { if (send_status & FS_OPT_AUTODICT) == FS_OPT_AUTODICT {
return Err(Error::illegal_state( let (read_len, dict_size) = forkserver.read_st()?;
"Dictionary has an illegal size".to_string(), if read_len != 4 {
)); return Err(Error::unknown(
} "Reading from forkserver failed.".to_string(),
));
}
log::info!("Autodict size {dict_size:x}"); if !(2..=0xffffff).contains(&dict_size) {
return Err(Error::illegal_state(
"Dictionary has an illegal size".to_string(),
));
}
let (rlen, buf) = forkserver.read_st_size(dict_size as usize)?; log::info!("Autodict size {dict_size:x}");
if rlen != dict_size as usize { let (rlen, buf) = forkserver.read_st_size(dict_size as usize)?;
return Err(Error::unknown("Failed to load autodictionary".to_string()));
}
if let Some(t) = &mut self.autotokens { if rlen != dict_size as usize {
t.parse_autodict(&buf, dict_size as usize); return Err(Error::unknown("Failed to load autodictionary".to_string()));
}
if let Some(t) = &mut self.autotokens {
t.parse_autodict(&buf, dict_size as usize);
}
} }
} }
} else { } else {