Skip to content

Go: Convert models for variadic functions to use models-as-data #16592

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 21 commits into
base: main
Choose a base branch
from
Draft
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: deprecated
---
* The following classes have been deprecated: `Url::JoinPath` and `Url::JoinPathMethod` in `Stdlib`; `Zap::FieldsFunction` in `Zap`. Use a locally defined class instead.
2 changes: 2 additions & 0 deletions go/ql/lib/ext/database.sql.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extensions:
- ["database/sql", "Conn", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
- ["database/sql", "DB", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
- ["database/sql", "DB", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
- ["database/sql", "Row", True, "Scan", "", "", "Argument[-1]", "Argument[0].ArrayElement", "taint", "manual"]
- ["database/sql", "Rows", True, "Scan", "", "", "Argument[-1]", "Argument[0].ArrayElement", "taint", "manual"]
- ["database/sql", "Scanner", True, "Scan", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"]
- ["database/sql", "Tx", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
- ["database/sql", "Tx", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"]
1 change: 1 addition & 0 deletions go/ql/lib/ext/errors.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ extensions:
extensible: summaryModel
data:
- ["errors", "", False, "As", "", "", "Argument[0]", "Argument[1]", "taint", "manual"]
- ["errors", "", False, "Join", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["errors", "", False, "New", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["errors", "", False, "Unwrap", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
12 changes: 12 additions & 0 deletions go/ql/lib/ext/fmt.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,19 @@ extensions:
- ["fmt", "", True, "Appendf", "", "", "Argument[2].ArrayElement", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Appendln", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Appendln", "", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Errorf", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Errorf", "", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Fprint", "", "", "Argument[1].ArrayElement", "Argument[0]", "taint", "manual"]
- ["fmt", "", True, "Fprintf", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["fmt", "", True, "Fprintf", "", "", "Argument[2].ArrayElement", "Argument[0]", "taint", "manual"]
- ["fmt", "", True, "Fprintln", "", "", "Argument[1].ArrayElement", "Argument[0]", "taint", "manual"]
- ["fmt", "", True, "Fscan", "", "", "Argument[0]", "Argument[1].ArrayElement", "taint", "manual"]
- ["fmt", "", True, "Fscanf", "", "", "Argument[0..1]", "Argument[2].ArrayElement", "taint", "manual"]
- ["fmt", "", True, "Fscanln", "", "", "Argument[0]", "Argument[1].ArrayElement", "taint", "manual"]
- ["fmt", "", True, "Sprint", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Sprintf", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Sprintf", "", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Sprintln", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["fmt", "", True, "Sscan", "", "", "Argument[0]", "Argument[1].ArrayElement", "taint", "manual"]
- ["fmt", "", True, "Sscanf", "", "", "Argument[0..1]", "Argument[2].ArrayElement", "taint", "manual"]
- ["fmt", "", True, "Sscanln", "", "", "Argument[0]", "Argument[1].ArrayElement", "taint", "manual"]
2 changes: 2 additions & 0 deletions go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ extensions:
pack: codeql/go-all
extensible: summaryModel
data:
- ["github.com/astaxie/beego/utils", "", False, "GetDisplayString", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["github.com/astaxie/beego/utils", "", False, "SliceChunk", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["github.com/astaxie/beego/utils", "", False, "SliceDiff", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["github.com/astaxie/beego/utils", "", False, "SliceFilter", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
Expand All @@ -16,6 +17,7 @@ extensions:
- ["github.com/astaxie/beego/utils", "BeeMap", True, "Get", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
- ["github.com/astaxie/beego/utils", "BeeMap", True, "Items", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
- ["github.com/astaxie/beego/utils", "BeeMap", True, "Set", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"]
- ["github.com/beego/beego/core/utils", "", False, "GetDisplayString", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["github.com/beego/beego/core/utils", "", False, "SliceChunk", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["github.com/beego/beego/core/utils", "", False, "SliceDiff", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["github.com/beego/beego/core/utils", "", False, "SliceFilter", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
Expand Down
10 changes: 10 additions & 0 deletions go/ql/lib/ext/github.com.davecgh.go-spew.spew.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
extensions:
- addsTo:
pack: codeql/go-all
extensible: summaryModel
data:
- ["github.com/davecgh/go-spew/spew", "", False, "Sdump", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["github.com/davecgh/go-spew/spew", "", False, "Sprint", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["github.com/davecgh/go-spew/spew", "", False, "Sprintf", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["github.com/davecgh/go-spew/spew", "", False, "Sprintf", "", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"]
- ["github.com/davecgh/go-spew/spew", "", False, "Sprintln", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
1 change: 1 addition & 0 deletions go/ql/lib/ext/go.uber.org.zap.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ extensions:
- ["go.uber.org/zap", "", False, "ByteStrings", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["go.uber.org/zap", "", False, "Error", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["go.uber.org/zap", "", False, "Errors", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["go.uber.org/zap", "", False, "Fields", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["go.uber.org/zap", "", False, "NamedError", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["go.uber.org/zap", "", False, "Reflect", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["go.uber.org/zap", "", False, "String", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
Expand Down
3 changes: 3 additions & 0 deletions go/ql/lib/ext/html.template.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ extensions:
extensible: summaryModel
data:
- ["html/template", "", False, "HTMLEscape", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["html/template", "", False, "HTMLEscaper", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["html/template", "", False, "HTMLEscapeString", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["html/template", "", False, "JSEscape", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["html/template", "", False, "JSEscaper", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["html/template", "", False, "JSEscapeString", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["html/template", "", False, "URLQueryEscaper", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["html/template", "Template", True, "Execute", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["html/template", "Template", True, "ExecuteTemplate", "", "", "Argument[2]", "Argument[0]", "taint", "manual"]
1 change: 1 addition & 0 deletions go/ql/lib/ext/io.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ extensions:
- ["io", "", False, "CopyBuffer", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["io", "", False, "CopyN", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["io", "", False, "LimitReader", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["io", "", False, "MultiReader", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["io", "", False, "NewSectionReader", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["io", "", False, "NopCloser", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["io", "", False, "ReadAll", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
Expand Down
12 changes: 12 additions & 0 deletions go/ql/lib/ext/log.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@ extensions:
pack: codeql/go-all
extensible: summaryModel
data:
- ["log", "Logger", True, "Fatal", "", "", "Argument[0].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Fatalf", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Fatalf", "", "", "Argument[1].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Fatalln", "", "", "Argument[0].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Panic", "", "", "Argument[0].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Panicf", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Panicf", "", "", "Argument[1].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Panicln", "", "", "Argument[0].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Print", "", "", "Argument[0].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Printf", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Printf", "", "", "Argument[1].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Println", "", "", "Argument[0].ArrayElement", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "SetOutput", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"]
- ["log", "Logger", True, "SetPrefix", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"]
- ["log", "Logger", True, "Writer", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
2 changes: 2 additions & 0 deletions go/ql/lib/ext/net.textproto.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ extensions:
- ["net/textproto", "Reader", True, "ReadLineBytes", "", "", "Argument[-1]", "ReturnValue[0]", "taint", "manual"]
- ["net/textproto", "Reader", True, "ReadMIMEHeader", "", "", "Argument[-1]", "ReturnValue[0]", "taint", "manual"]
- ["net/textproto", "Reader", True, "ReadResponse", "", "", "Argument[-1]", "ReturnValue[1]", "taint", "manual"]
- ["net/textproto", "Writer", True, "PrintfLine", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"]
- ["net/textproto", "Writer", True, "PrintfLine", "", "", "Argument[1].ArrayElement", "Argument[-1]", "taint", "manual"]
4 changes: 4 additions & 0 deletions go/ql/lib/ext/net.url.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ extensions:
pack: codeql/go-all
extensible: summaryModel
data:
- ["net/url", "", False, "JoinPath", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
- ["net/url", "", False, "JoinPath", "", "", "Argument[1].ArrayElement", "ReturnValue[0]", "taint", "manual"]
- ["net/url", "", False, "Parse", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
- ["net/url", "", False, "ParseQuery", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
- ["net/url", "", False, "ParseRequestURI", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
Expand All @@ -14,6 +16,8 @@ extensions:
- ["net/url", "", False, "UserPassword", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["net/url", "URL", True, "EscapedPath", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
- ["net/url", "URL", True, "Hostname", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
- ["net/url", "URL", True, "JoinPath", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
- ["net/url", "URL", True, "JoinPath", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["net/url", "URL", True, "MarshalBinary", "", "", "Argument[-1]", "ReturnValue[0]", "taint", "manual"]
- ["net/url", "URL", True, "Parse", "", "", "Argument[-1]", "ReturnValue[0]", "taint", "manual"]
- ["net/url", "URL", True, "Parse", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
Expand Down
1 change: 1 addition & 0 deletions go/ql/lib/ext/path.filepath.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ extensions:
- ["path/filepath", "", False, "Ext", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["path/filepath", "", False, "FromSlash", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["path/filepath", "", False, "Glob", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"]
- ["path/filepath", "", False, "Join", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["path/filepath", "", False, "Rel", "", "", "Argument[0..1]", "ReturnValue[0]", "taint", "manual"]
- ["path/filepath", "", False, "Split", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"]
- ["path/filepath", "", False, "SplitList", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
Expand Down
1 change: 1 addition & 0 deletions go/ql/lib/ext/path.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ extensions:
- ["path", "", False, "Clean", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["path", "", False, "Dir", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["path", "", False, "Ext", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["path", "", False, "Join", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["path", "", False, "Split", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"]
2 changes: 2 additions & 0 deletions go/ql/lib/ext/reflect.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ extensions:
pack: codeql/go-all
extensible: summaryModel
data:
- ["reflect", "", False, "Append", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["reflect", "", False, "Append", "", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"]
- ["reflect", "", False, "AppendSlice", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["reflect", "", False, "Copy", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["reflect", "", False, "Indirect", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
Expand Down
1 change: 1 addition & 0 deletions go/ql/lib/ext/strings.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ extensions:
- ["strings", "", False, "Join", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"]
- ["strings", "", False, "Map", "", "", "Argument[1]", "ReturnValue", "taint", "manual"]
- ["strings", "", False, "NewReader", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["strings", "", False, "NewReplacer", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["strings", "", False, "Repeat", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["strings", "", False, "Replace", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["strings", "", False, "Replace", "", "", "Argument[2]", "ReturnValue", "taint", "manual"]
Expand Down
3 changes: 3 additions & 0 deletions go/ql/lib/ext/text.template.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ extensions:
extensible: summaryModel
data:
- ["text/template", "", False, "HTMLEscape", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["text/template", "", False, "HTMLEscaper", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["text/template", "", False, "HTMLEscapeString", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["text/template", "", False, "JSEscape", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["text/template", "", False, "JSEscaper", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["text/template", "", False, "JSEscapeString", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["text/template", "", False, "URLQueryEscaper", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"]
- ["text/template", "Template", True, "Execute", "", "", "Argument[1]", "Argument[0]", "taint", "manual"]
- ["text/template", "Template", True, "ExecuteTemplate", "", "", "Argument[2]", "Argument[0]", "taint", "manual"]
10 changes: 0 additions & 10 deletions go/ql/lib/semmle/go/frameworks/Beego.qll
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import go
import semmle.go.security.Xss
private import semmle.go.security.SafeUrlFlowCustomizations

// Some TaintTracking::FunctionModel subclasses remain because varargs functions don't work with Models-as-Data sumamries yet.
/**
* Provides classes for working with remote flow sources, sinks and taint propagators
* from the [Beego](https://github.com/beego/beego) package.
Expand Down Expand Up @@ -327,13 +326,4 @@ module Beego {

override Http::ResponseWriter getResponseWriter() { none() }
}

private class UtilsTaintPropagators extends TaintTracking::FunctionModel {
UtilsTaintPropagators() { this.hasQualifiedName(utilsPackagePath(), "GetDisplayString") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isParameter(_) and
output.isResult(0)
}
}
}
10 changes: 0 additions & 10 deletions go/ql/lib/semmle/go/frameworks/Spew.qll
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,4 @@ module Spew {
result = this.getSyntacticArgument(any(int i | i >= target.getFirstPrintedArg()))
}
}

// These are expressed using TaintTracking::FunctionModel because varargs functions don't work with Models-as-Data sumamries yet.
/** The `Sprint` function or one of its variants. */
class Sprinter extends TaintTracking::FunctionModel {
Sprinter() { this.hasQualifiedName(packagePath(), ["Sdump", "Sprint", "Sprintln", "Sprintf"]) }

override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) {
inp.isParameter(_) and outp.isResult()
}
}
}
31 changes: 12 additions & 19 deletions go/ql/lib/semmle/go/frameworks/Stdlib.qll
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import semmle.go.frameworks.stdlib.EncodingGob
import semmle.go.frameworks.stdlib.EncodingJson
import semmle.go.frameworks.stdlib.EncodingPem
import semmle.go.frameworks.stdlib.EncodingXml
import semmle.go.frameworks.stdlib.Errors
import semmle.go.frameworks.stdlib.Fmt
import semmle.go.frameworks.stdlib.Html
import semmle.go.frameworks.stdlib.HtmlTemplate
Expand All @@ -33,12 +32,8 @@ import semmle.go.frameworks.stdlib.NetHttp
import semmle.go.frameworks.stdlib.NetHttpHttputil
import semmle.go.frameworks.stdlib.NetTextproto
import semmle.go.frameworks.stdlib.Os
import semmle.go.frameworks.stdlib.Path
import semmle.go.frameworks.stdlib.PathFilepath
import semmle.go.frameworks.stdlib.Reflect
import semmle.go.frameworks.stdlib.Regexp
import semmle.go.frameworks.stdlib.Strconv
import semmle.go.frameworks.stdlib.Strings
import semmle.go.frameworks.stdlib.Syscall
import semmle.go.frameworks.stdlib.TextTabwriter
import semmle.go.frameworks.stdlib.TextTemplate
Expand Down Expand Up @@ -97,24 +92,22 @@ module IntegerParser {

/** Provides models of commonly used functions in the `net/url` package. */
module Url {
// These are expressed using TaintTracking::FunctionModel because varargs functions don't work with Models-as-Data sumamries yet.
/** The `JoinPath` function. */
class JoinPath extends TaintTracking::FunctionModel {
/**
* DEPRECATED: Use a locally defined class instead.
*
* The `JoinPath` function.
*/
class JoinPath extends Function {
JoinPath() { this.hasQualifiedName("net/url", "JoinPath") }

override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) {
inp.isParameter(_) and outp.isResult(0)
}
}

/** The method `URL.JoinPath`. */
class JoinPathMethod extends TaintTracking::FunctionModel, Method {
/**
* DEPRECATED: Use a locally defined class instead.
*
* The method `URL.JoinPath`.
*/
class JoinPathMethod extends Method {
JoinPathMethod() { this.hasQualifiedName("net/url", "URL", "JoinPath") }

override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) {
(inp.isReceiver() or inp.isParameter(_)) and
outp.isResult(0)
}
}

/** A method that returns a part of a URL. */
Expand Down
Loading
Loading