Skip to content

Commit 3e38867

Browse files
committed
feat(rust): Add ReSQLite source support
1 parent 6e5899b commit 3e38867

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

rust/ql/lib/codeql/rust/frameworks/rusqlite.model.yml

+9
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,12 @@ extensions:
99
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::Connection>::prepare_with_flags", "Argument[0]", "sql-injection", "manual"]
1010
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::Connection>::query_row", "Argument[0]", "sql-injection", "manual"]
1111
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::Connection>::query_row_and_then", "Argument[0]", "sql-injection", "manual"]
12+
13+
- addsTo:
14+
pack: codeql/rust-all
15+
extensible: sourceModel
16+
data:
17+
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::row::Row>::get", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "database", "manual"]
18+
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::row::Row>::get_unwrap", "ReturnValue", "database", "manual"]
19+
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::row::Row>::get_ref", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "database", "manual"]
20+
- ["repo:https://github.com/rusqlite/rusqlite:rusqlite", "<crate::row::Row>::get_ref_unwrap", "ReturnValue", "database", "manual"]

rust/ql/test/library-tests/frameworks/rusqlite/Rusqlite.ql

+9-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import codeql.rust.Concepts
44
import utils.test.InlineExpectationsTest
55

66
module RusqliteTest implements TestSig {
7-
string getARelevantTag() { result = ["sql-sink"] }
7+
string getARelevantTag() { result = ["sql-sink", "database-read"] }
88

99
predicate hasActualResult(Location location, string element, string tag, string value) {
1010
exists(SqlInjection::Sink sink |
@@ -14,6 +14,14 @@ module RusqliteTest implements TestSig {
1414
tag = "sql-sink" and
1515
value = ""
1616
)
17+
or
18+
exists(ModeledDatabaseSource sink |
19+
location = sink.getLocation() and
20+
location.getFile().getBaseName() != "" and
21+
element = sink.toString() and
22+
tag = "database-read" and
23+
value = ""
24+
)
1725
}
1826
}
1927

rust/ql/test/library-tests/frameworks/rusqlite/main.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
3131

3232
let person = connection.query_row(&query, (), |row| { // $ sql-sink
3333
Ok(Person {
34-
id: row.get(0)?,
35-
name: row.get(1)?,
36-
age: row.get(2)?,
34+
id: row.get(0)?, // $ database-read
35+
name: row.get(1)?, // $ database-read
36+
age: row.get(2)?, // $ database-read
3737
})
3838
})?;
3939

4040
let mut stmt = connection.prepare("SELECT id, name, age FROM person")?; // $ sql-sink
4141
let people = stmt.query_map([], |row| {
4242
Ok(Person {
43-
id: row.get(0)?,
44-
name: row.get(1)?,
45-
age: row.get(2)?,
43+
id: row.get_unwrap(0), // $ database-read
44+
name: row.get_unwrap(1), // $ database-read
45+
age: row.get_unwrap(2), // $ database-read
4646
})
4747
})?;
4848

0 commit comments

Comments
 (0)