Skip to content

Commit 45f922b

Browse files
committed
Add models for Go 1.19's new url.JoinPath and URL.JoinPath functions
1 parent 6068f63 commit 45f922b

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

go/ql/lib/semmle/go/frameworks/Stdlib.qll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,25 @@ module URL {
170170
}
171171
}
172172

173+
/** The `JoinPath` function. */
174+
class JoinPath extends TaintTracking::FunctionModel {
175+
JoinPath() { this.hasQualifiedName("net/url", "JoinPath") }
176+
177+
override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) {
178+
inp.isParameter(_) and outp.isResult(0)
179+
}
180+
}
181+
182+
/** The method `URL.JoinPath`. */
183+
class JoinPathMethod extends TaintTracking::FunctionModel, Method {
184+
JoinPathMethod() { this.hasQualifiedName("net/url", "URL", "JoinPath") }
185+
186+
override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) {
187+
(inp.isReceiver() or inp.isParameter(_)) and
188+
outp.isResult(0)
189+
}
190+
}
191+
173192
/** A method that returns a part of a URL. */
174193
class UrlGetter extends TaintTracking::FunctionModel, Method {
175194
UrlGetter() {

go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22
| file://:0:0:0:0 | function EscapedPath | url.go:28:14:28:26 | selection of EscapedPath |
33
| file://:0:0:0:0 | function Get | url.go:52:14:52:18 | selection of Get |
44
| file://:0:0:0:0 | function Hostname | url.go:29:14:29:23 | selection of Hostname |
5+
| file://:0:0:0:0 | function JoinPath | url.go:57:16:57:27 | selection of JoinPath |
6+
| file://:0:0:0:0 | function JoinPath | url.go:58:16:58:27 | selection of JoinPath |
7+
| file://:0:0:0:0 | function JoinPath | url.go:60:15:60:28 | selection of JoinPath |
8+
| file://:0:0:0:0 | function JoinPath | url.go:66:9:66:25 | selection of JoinPath |
59
| file://:0:0:0:0 | function MarshalBinary | url.go:30:11:30:25 | selection of MarshalBinary |
610
| file://:0:0:0:0 | function Parse | url.go:23:10:23:18 | selection of Parse |
711
| file://:0:0:0:0 | function Parse | url.go:32:9:32:15 | selection of Parse |
12+
| file://:0:0:0:0 | function Parse | url.go:59:14:59:22 | selection of Parse |
13+
| file://:0:0:0:0 | function Parse | url.go:65:17:65:25 | selection of Parse |
814
| file://:0:0:0:0 | function ParseQuery | url.go:50:10:50:23 | selection of ParseQuery |
915
| file://:0:0:0:0 | function ParseRequestURI | url.go:27:9:27:27 | selection of ParseRequestURI |
1016
| file://:0:0:0:0 | function Password | url.go:43:11:43:21 | selection of Password |
@@ -164,3 +170,17 @@
164170
| url.go:50:2:50:2 | definition of v | url.go:52:14:52:14 | v |
165171
| url.go:50:2:50:2 | definition of v | url.go:53:9:53:9 | v |
166172
| url.go:50:2:50:26 | ... := ...[0] | url.go:50:2:50:2 | definition of v |
173+
| url.go:56:12:56:12 | argument corresponding to q | url.go:56:12:56:12 | definition of q |
174+
| url.go:56:12:56:12 | definition of q | url.go:57:29:57:29 | q |
175+
| url.go:57:2:57:8 | definition of joined1 | url.go:58:38:58:44 | joined1 |
176+
| url.go:57:2:57:39 | ... := ...[0] | url.go:57:2:57:8 | definition of joined1 |
177+
| url.go:58:2:58:8 | definition of joined2 | url.go:59:24:59:30 | joined2 |
178+
| url.go:58:2:58:45 | ... := ...[0] | url.go:58:2:58:8 | definition of joined2 |
179+
| url.go:59:2:59:6 | definition of asUrl | url.go:60:15:60:19 | asUrl |
180+
| url.go:59:2:59:31 | ... := ...[0] | url.go:59:2:59:6 | definition of asUrl |
181+
| url.go:60:2:60:10 | definition of joinedUrl | url.go:61:9:61:17 | joinedUrl |
182+
| url.go:60:15:60:37 | call to JoinPath | url.go:60:2:60:10 | definition of joinedUrl |
183+
| url.go:64:13:64:13 | argument corresponding to q | url.go:64:13:64:13 | definition of q |
184+
| url.go:64:13:64:13 | definition of q | url.go:66:27:66:27 | q |
185+
| url.go:65:2:65:9 | definition of cleanUrl | url.go:66:9:66:16 | cleanUrl |
186+
| url.go:65:2:65:48 | ... := ...[0] | url.go:65:2:65:9 | definition of cleanUrl |

go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,21 @@
6666
| url.go:50:25:50:25 | q | url.go:50:2:50:26 | ... := ...[0] |
6767
| url.go:51:14:51:14 | v | url.go:51:14:51:23 | call to Encode |
6868
| url.go:52:14:52:14 | v | url.go:52:14:52:26 | call to Get |
69+
| url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | ... := ...[0] |
70+
| url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | ... := ...[1] |
71+
| url.go:57:29:57:29 | q | url.go:57:2:57:39 | ... := ...[0] |
72+
| url.go:57:32:57:38 | "clean" | url.go:57:2:57:39 | ... := ...[0] |
73+
| url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | ... := ...[0] |
74+
| url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | ... := ...[1] |
75+
| url.go:58:29:58:35 | "clean" | url.go:58:2:58:45 | ... := ...[0] |
76+
| url.go:58:38:58:44 | joined1 | url.go:58:2:58:45 | ... := ...[0] |
77+
| url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | ... := ...[0] |
78+
| url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | ... := ...[1] |
79+
| url.go:59:24:59:30 | joined2 | url.go:59:2:59:31 | ... := ...[0] |
80+
| url.go:60:15:60:19 | asUrl | url.go:60:15:60:37 | call to JoinPath |
81+
| url.go:60:30:60:36 | "clean" | url.go:60:15:60:37 | call to JoinPath |
82+
| url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | ... := ...[0] |
83+
| url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | ... := ...[1] |
84+
| url.go:65:27:65:47 | "http://harmless.org" | url.go:65:2:65:48 | ... := ...[0] |
85+
| url.go:66:9:66:16 | cleanUrl | url.go:66:9:66:28 | call to JoinPath |
86+
| url.go:66:27:66:27 | q | url.go:66:9:66:28 | call to JoinPath |

go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/url.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,16 @@ func func8(q string) url.Values {
5252
fmt.Println(v.Get("page"))
5353
return v
5454
}
55+
56+
func func9(q string) *url.URL {
57+
joined1, _ := url.JoinPath(q, "clean")
58+
joined2, _ := url.JoinPath("clean", joined1)
59+
asUrl, _ := url.Parse(joined2)
60+
joinedUrl := asUrl.JoinPath("clean")
61+
return joinedUrl
62+
}
63+
64+
func func10(q string) *url.URL {
65+
cleanUrl, _ := url.Parse("http://harmless.org")
66+
return cleanUrl.JoinPath(q)
67+
}

0 commit comments

Comments
 (0)