Skip to content

Commit 7a589c4

Browse files
authored
Merge pull request #18405 from egregius313/egregius313/go/mad/database/gorm
Go: Model sources from the `gorm.io/gorm` package
2 parents 6ac82d6 + e7b0329 commit 7a589c4

File tree

7 files changed

+178
-0
lines changed

7 files changed

+178
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added `database` source models for database methods from the `gorm.io/gorm` package.
5+
`

go/ql/lib/ext/gorm.io.gorm.model.yml

+24
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,25 @@ extensions:
66
- ["gorm", "gorm.io/gorm"]
77
- ["gorm", "github.com/jinzhu/gorm"]
88
- ["gorm", "github.com/go-gorm/gorm"]
9+
- addsTo:
10+
pack: codeql/go-all
11+
extensible: sourceModel
12+
data:
13+
- ["group:gorm", "Association", True, "Find", "", "", "Argument[0]", "database", "manual"]
14+
- ["group:gorm", "ConnPool", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
15+
- ["group:gorm", "ConnPool", True, "QueryRowContext", "", "", "ReturnValue", "database", "manual"]
16+
- ["group:gorm", "DB", True, "Find", "", "", "Argument[0]", "database", "manual"]
17+
- ["group:gorm", "DB", True, "FindInBatches", "", "", "Argument[0]", "database", "manual"]
18+
- ["group:gorm", "DB", True, "First", "", "", "Argument[0]", "database", "manual"]
19+
- ["group:gorm", "DB", True, "FirstOrCreate", "", "", "Argument[0]", "database", "manual"]
20+
- ["group:gorm", "DB", True, "FirstOrInit", "", "", "Argument[0]", "database", "manual"]
21+
- ["group:gorm", "DB", True, "Last", "", "", "Argument[0]", "database", "manual"]
22+
- ["group:gorm", "DB", True, "Model", "", "", "Argument[0]", "database", "manual"]
23+
- ["group:gorm", "DB", True, "Pluck", "", "", "Argument[1]", "database", "manual"]
24+
- ["group:gorm", "DB", True, "Row", "", "", "ReturnValue", "database", "manual"]
25+
- ["group:gorm", "DB", True, "Rows", "", "", "ReturnValue[0]", "database", "manual"]
26+
- ["group:gorm", "DB", True, "Scan", "", "", "Argument[0]", "database", "manual"]
27+
- ["group:gorm", "DB", True, "Take", "", "", "Argument[0]", "database", "manual"]
928
- addsTo:
1029
pack: codeql/go-all
1130
extensible: sinkModel
@@ -23,3 +42,8 @@ extensions:
2342
- ["group:gorm", "DB", True, "Exec", "", "", "Argument[0]", "sql-injection", "manual"]
2443
- ["group:gorm", "DB", True, "Distinct", "", "", "Argument[0]", "sql-injection", "manual"]
2544
- ["group:gorm", "DB", True, "Pluck", "", "", "Argument[0]", "sql-injection", "manual"]
45+
- addsTo:
46+
pack: codeql/go-all
47+
extensible: summaryModel
48+
data:
49+
- ["group:gorm", "DB", True, "ScanRows", "", "", "Argument[0]", "Argument[1]", "taint", "manual"]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module test
2+
3+
go 1.22.5
4+
5+
require (
6+
gorm.io/gorm v1.23.0
7+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package test
2+
3+
import "gorm.io/gorm"
4+
5+
// test querying an Association
6+
func test_gorm_AssociationQuery(association *gorm.Association) {
7+
association.Find(&User{}) // $ source
8+
}
9+
10+
// test querying a ConnPool
11+
func test_gorm_ConnPoolQuery(connPool gorm.ConnPool) {
12+
rows, err := connPool.QueryContext(nil, "SELECT * FROM users") // $ source
13+
14+
if err != nil {
15+
return
16+
}
17+
18+
defer rows.Close()
19+
20+
userRow := connPool.QueryRowContext(nil, "SELECT * FROM users WHERE id = 1") // $ source
21+
22+
ignore(userRow)
23+
}
24+
25+
// test querying a DB
26+
func test_gorm_db(db *gorm.DB) {
27+
db.Find(&User{}) // $ source
28+
29+
db.FindInBatches(&User{}, 10, nil) // $ source
30+
31+
db.FirstOrCreate(&User{}) // $ source
32+
33+
db.FirstOrInit(&User{}) // $ source
34+
35+
db.First(&User{}) // $ source
36+
37+
db.Last(&User{}) // $ source
38+
39+
db.Take(&User{}) // $ source
40+
41+
db.Scan(&User{}) // $ source
42+
43+
var user User
44+
db.Model(&user) // $ source
45+
46+
row := db.Row() // $ source
47+
ignore(row)
48+
49+
rows, err := db.Rows() // $ source
50+
ignore(err)
51+
52+
var user2 User
53+
db.ScanRows(rows, &user2)
54+
55+
sink(user2) // $ hasTaintFlow="user2"
56+
57+
var names []string
58+
db.Pluck("name", &names) // $ source
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package test
2+
3+
type User struct{}

go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/gorm.io/gorm/stub.go

+77
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# gorm.io/gorm v1.23.0
2+
## explicit
3+
gorm.io/gorm

0 commit comments

Comments
 (0)