Skip to content

Commit a85ad4e

Browse files
committed
Rust: Add a dataflow/sources test.
1 parent ca424d1 commit a85ad4e

5 files changed

Lines changed: 111 additions & 0 deletions

File tree

rust/ql/test/library-tests/dataflow/sources/TaintSources.expected

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
query: queries/summary/TaintSources.ql
2+
postprocess: utils/InlineExpectationsTestQuery.ql
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
qltest_cargo_check: true
2+
qltest_dependencies:
3+
- reqwest = { version = "0.12.9", features = ["blocking"] }
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
// --- stubs for the "reqwest" library ---
3+
4+
/*
5+
--- we don't seem to have a way to use this, hence we currently test against the real reqwest library
6+
#[derive(Debug)]
7+
pub struct Error { }
8+
9+
pub mod blocking {
10+
pub struct Response { }
11+
impl Response {
12+
pub fn text(self) -> Result<String, super::Error> {
13+
Ok("".to_string())
14+
}
15+
}
16+
17+
pub fn get<T>(url: T) -> Result<Response, super::Error> {
18+
let _url = url;
19+
20+
Ok(Response {})
21+
}
22+
}
23+
24+
pub struct Response { }
25+
impl Response {
26+
pub async fn text(self) -> Result<String, Error> {
27+
Ok("".to_string())
28+
}
29+
}
30+
31+
pub async fn get<T>(url: T) -> Result<Response, Error> {
32+
let _url = url;
33+
34+
Ok(Response {})
35+
}
36+
*/
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#![allow(deprecated)]
2+
3+
fn sink<T>(_: T) { }
4+
5+
// --- tests ---
6+
7+
fn test_env_vars() {
8+
sink(std::env::var("HOME")); // $ MISSING: Alert[rust/summary/taint-sources] hasTaintFlow
9+
sink(std::env::var_os("PATH")); // $ MISSING: Alert[rust/summary/taint-sources] hasTaintFlow
10+
11+
let var1 = std::env::var("HOME").expect("HOME not set"); // $ MISSING: Alert[rust/summary/taint-sources]
12+
let var2 = std::env::var_os("PATH").unwrap(); // $ MISSING: Alert[rust/summary/taint-sources]
13+
14+
sink(var1); // $ MISSING: hasTaintFlow
15+
sink(var2); // $ MISSING: hasTaintFlow
16+
17+
for (key, value) in std::env::vars() { // $ MISSING: Alert[rust/summary/taint-sources]
18+
sink(key); // $ MISSING: hasTaintFlow
19+
sink(value); // $ MISSING: hasTaintFlow
20+
}
21+
22+
for (key, value) in std::env::vars_os() { // $ MISSING: Alert[rust/summary/taint-sources]
23+
sink(key); // $ MISSING: hasTaintFlow
24+
sink(value); // $ MISSING: hasTaintFlow
25+
}
26+
}
27+
28+
fn test_env_args() {
29+
let args: Vec<String> = std::env::args().collect(); // $ MISSING: Alert[rust/summary/taint-sources]
30+
let my_path = &args[0];
31+
let arg1 = &args[1];
32+
let arg2 = std::env::args().nth(2).unwrap(); // $ MISSING: Alert[rust/summary/taint-sources]
33+
let arg3 = std::env::args_os().nth(3).unwrap(); // $ MISSING: Alert[rust/summary/taint-sources]
34+
35+
sink(my_path); // $ MISSING: hasTaintFlow
36+
sink(arg1); // $ MISSING: hasTaintFlow
37+
sink(arg2); // $ MISSING: hasTaintFlow
38+
sink(arg3); // $ MISSING: hasTaintFlow
39+
40+
for arg in std::env::args() { // $ MISSING: Alert[rust/summary/taint-sources]
41+
sink(arg); // $ MISSING: hasTaintFlow
42+
}
43+
44+
for arg in std::env::args_os() { // $ MISSING: Alert[rust/summary/taint-sources]
45+
sink(arg); // $ MISSING: hasTaintFlow
46+
}
47+
}
48+
49+
fn test_env_dirs() {
50+
let dir = std::env::current_dir().expect("FAILED"); // $ MISSING: Alert[rust/summary/taint-sources]
51+
let exe = std::env::current_exe().expect("FAILED"); // $ MISSING: Alert[rust/summary/taint-sources]
52+
let home = std::env::home_dir().expect("FAILED"); // $ MISSING: Alert[rust/summary/taint-sources]
53+
54+
sink(dir); // $ MISSING: hasTaintFlow
55+
sink(exe); // $ MISSING: hasTaintFlow
56+
sink(home); // $ MISSING: hasTaintFlow
57+
}
58+
59+
async fn test_reqwest() -> Result<(), reqwest::Error> {
60+
let remote_string1 = reqwest::blocking::get("http://example.com/")?.text()?; // $ MISSING: Alert[rust/summary/taint-sources]
61+
sink(remote_string1); // $ MISSING: hasTaintFlow
62+
63+
let remote_string2 = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap(); // $ MISSING: Alert[rust/summary/taint-sources]
64+
sink(remote_string2); // $ MISSING: hasTaintFlow
65+
66+
let remote_string3 = reqwest::get("http://example.com/").await?.text().await?; // $ MISSING: Alert[rust/summary/taint-sources]
67+
sink(remote_string3); // $ MISSING: hasTaintFlow
68+
69+
Ok(())
70+
}

0 commit comments

Comments
 (0)