Skip to content

Commit 1449bb4

Browse files
authored
🔧 fix: selector resolution by using an awaited tokio::task (#165)
* 🔧 fix: selector resolution by using an awaited tokio::task * 💫 meta: make pre-commit clippy run with `--fix`
1 parent 03cc51c commit 1449bb4

File tree

6 files changed

+37
-18
lines changed

6 files changed

+37
-18
lines changed

Diff for: .pre-commit-config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ repos:
2121
pass_filenames: false
2222
- id: clippy
2323
name: clippy
24-
entry: sh scripts/clippy
24+
entry: sh scripts/clippy --fix
2525
language: system
2626
types: [rust]
2727
pass_filenames: false

Diff for: Cargo.lock

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: common/src/ether/selectors.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use std::{
22
collections::{HashMap, HashSet},
33
sync::{Arc, Mutex},
4-
thread,
54
time::Duration,
65
};
76

87
use indicatif::ProgressBar;
8+
use tokio::task;
99

1010
use crate::{io::logging::Logger, utils::strings::decode_hex};
1111

@@ -105,7 +105,7 @@ pub fn resolve_entry_point(evm: &VM, selector: &str) -> u128 {
105105
0
106106
}
107107

108-
pub fn resolve_selectors<T>(selectors: Vec<String>) -> HashMap<String, Vec<T>>
108+
pub async fn resolve_selectors<T>(selectors: Vec<String>) -> HashMap<String, Vec<T>>
109109
where
110110
T: ResolveSelector + Send + Clone + 'static, {
111111
// get a new logger
@@ -138,7 +138,7 @@ where
138138
let resolve_progress = resolve_progress.clone();
139139

140140
// create a new thread for each selector
141-
threads.push(thread::spawn(move || async move {
141+
threads.push(task::spawn(async move {
142142
if let Some(function) = T::resolve(&selector).await {
143143
let mut _resolved_functions =
144144
function_clone.lock().expect("Could not obtain lock on function_clone.");
@@ -153,7 +153,10 @@ where
153153

154154
// wait for all threads to finish
155155
for thread in threads {
156-
if thread.join().is_ok() {}
156+
if let Err(e) = thread.await {
157+
// Handle error
158+
eprintln!("Task failed: {:?}", e);
159+
}
157160
}
158161

159162
resolve_progress.lock().unwrap().finish_and_clear();

Diff for: common/src/utils/http.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use serde_json::Value;
44
use std::time::Duration;
55
use tokio::time::sleep as async_sleep;
66

7+
use crate::io::logging::Logger;
8+
79
static APP_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),);
810

911
/// Make a GET request to the target URL and return the response body as JSON
@@ -25,15 +27,25 @@ async fn _get_json_from_url(
2527
retries_remaining: u8,
2628
timeout: u64,
2729
) -> Result<Option<Value>, reqwest::Error> {
30+
// get a new logger
31+
let level = std::env::var("RUST_LOG").unwrap_or_else(|_| "INFO".into());
32+
let (logger, _) = Logger::new(&level);
33+
34+
logger.debug_max(&format!("GET {}", &url));
35+
2836
let client = Client::builder()
2937
.danger_accept_invalid_certs(true)
3038
.user_agent(APP_USER_AGENT)
3139
.timeout(Duration::from_secs(timeout))
3240
.build()?;
3341

3442
let res = match client.get(url).send().await {
35-
Ok(res) => res,
36-
Err(_) => {
43+
Ok(res) => {
44+
logger.debug_max(&format!("GET {}: {:?}", &url, &res));
45+
res
46+
}
47+
Err(e) => {
48+
logger.debug_max(&format!("GET {}: {:?}", &url, &e));
3749
if retries_remaining == 0 {
3850
return Ok(None)
3951
}

Diff for: core/src/decompile/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ pub async fn decompile(
237237

238238
let mut resolved_selectors = HashMap::new();
239239
if !args.skip_resolving {
240-
resolved_selectors = resolve_selectors(selectors.keys().cloned().collect());
240+
resolved_selectors = resolve_selectors(selectors.keys().cloned().collect()).await;
241241

242242
// if resolved selectors are empty, we can't perform symbolic execution
243243
if resolved_selectors.is_empty() {
@@ -482,7 +482,8 @@ pub async fn decompile(
482482
.keys()
483483
.map(|error_selector| encode_hex_reduced(*error_selector).replacen("0x", "", 1))
484484
.collect(),
485-
);
485+
)
486+
.await;
486487
for (error_selector, _) in analyzed_function.errors.clone() {
487488
let error_selector_str = encode_hex_reduced(error_selector).replacen("0x", "", 1);
488489
let mut selected_error_index: u8 = 0;
@@ -547,7 +548,8 @@ pub async fn decompile(
547548
.keys()
548549
.map(|event_selector| encode_hex_reduced(*event_selector).replacen("0x", "", 1))
549550
.collect(),
550-
);
551+
)
552+
.await;
551553
for (event_selector, (_, raw_event)) in analyzed_function.events.clone() {
552554
let mut selected_event_index: u8 = 0;
553555
let event_selector_str = encode_hex_reduced(event_selector).replacen("0x", "", 1);

Diff for: core/src/snapshot/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ pub async fn snapshot(args: SnapshotArgs) -> Result<SnapshotResult, Box<dyn std:
222222
let mut resolved_selectors = HashMap::new();
223223
if !args.skip_resolving {
224224
resolved_selectors =
225-
resolve_selectors::<ResolvedFunction>(selectors.keys().cloned().collect());
225+
resolve_selectors::<ResolvedFunction>(selectors.keys().cloned().collect()).await;
226226

227227
// if resolved selectors are empty, we can't perform symbolic execution
228228
if resolved_selectors.is_empty() {
@@ -399,7 +399,8 @@ pub async fn snapshot(args: SnapshotArgs) -> Result<SnapshotResult, Box<dyn std:
399399
.keys()
400400
.map(|error_selector| encode_hex_reduced(*error_selector).replacen("0x", "", 1))
401401
.collect(),
402-
);
402+
)
403+
.await;
403404
for (error_selector, _) in snapshot.errors.clone() {
404405
let error_selector_str = encode_hex_reduced(error_selector).replacen("0x", "", 1);
405406
let mut selected_error_index: u8 = 0;
@@ -464,7 +465,8 @@ pub async fn snapshot(args: SnapshotArgs) -> Result<SnapshotResult, Box<dyn std:
464465
.keys()
465466
.map(|event_selector| encode_hex_reduced(*event_selector).replacen("0x", "", 1))
466467
.collect(),
467-
);
468+
)
469+
.await;
468470
for (event_selector, (_, raw_event)) in snapshot.events.clone() {
469471
let mut selected_event_index: u8 = 0;
470472
let event_selector_str = encode_hex_reduced(event_selector).replacen("0x", "", 1);

0 commit comments

Comments
 (0)