We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
database/sql
Row
1 parent 0258ce7 commit ca1e9d7Copy full SHA for ca1e9d7
3 files changed
go/ql/lib/ext/database.sql.driver.model.yml
@@ -23,6 +23,5 @@ extensions:
23
data:
24
- ["database/sql/driver", "Conn", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
25
- ["database/sql/driver", "ConnPrepareContext", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
26
- - ["database/sql/driver", "Rows", True, "Next", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"]
27
- ["database/sql/driver", "ValueConverter", True, "ConvertValue", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
28
- ["database/sql/driver", "Valuer", True, "Value", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"]
go/ql/lib/ext/database.sql.model.yml
@@ -53,8 +53,6 @@ extensions:
53
- ["database/sql", "Conn", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
54
- ["database/sql", "DB", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
55
- ["database/sql", "DB", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
56
- - ["database/sql", "Row", True, "Scan", "", "", "Argument[receiver]", "Argument[0].ArrayElement", "taint", "manual"]
57
- - ["database/sql", "Rows", True, "Scan", "", "", "Argument[receiver]", "Argument[0].ArrayElement", "taint", "manual"]
58
- ["database/sql", "Scanner", True, "Scan", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"]
59
- ["database/sql", "Tx", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
60
- ["database/sql", "Tx", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
go/ql/lib/semmle/go/frameworks/stdlib/DatabaseSql.qll
@@ -66,4 +66,24 @@ module DatabaseSql {
66
result = this.getReceiver().getAPredecessor*().(DataFlow::MethodCallNode).getAnArgument()
67
}
68
69
+
70
+ // These are expressed using TaintTracking::FunctionModel because varargs functions don't work with Models-as-Data sumamries yet.
71
+ private class SqlMethodModels extends TaintTracking::FunctionModel, Method {
72
+ FunctionInput inp;
73
+ FunctionOutput outp;
74
75
+ SqlMethodModels() {
76
+ // signature: func (*Row) Scan(dest ...interface{}) error
77
+ this.hasQualifiedName("database/sql", "Row", "Scan") and
78
+ (inp.isReceiver() and outp.isParameter(_))
79
+ or
80
+ // signature: func (*Rows) Scan(dest ...interface{}) error
81
+ this.hasQualifiedName("database/sql", "Rows", "Scan") and
82
83
+ }
84
85
+ override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
86
+ input = inp and output = outp
87
88
89
0 commit comments