Skip to content

Commit d7474f9

Browse files
authored
Merge branch 'main' into henrymercer/diagnostics-verify-one-based
2 parents 3d1da8a + 128d102 commit d7474f9

File tree

211 files changed

+30267
-21435
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

211 files changed

+30267
-21435
lines changed

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,52 @@ module MergePathGraph<
361361
}
362362
}
363363
}
364+
365+
/**
366+
* Constructs a `PathGraph` from three `PathGraph`s by disjoint union.
367+
*/
368+
module MergePathGraph3<
369+
PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3,
370+
PathGraphSig<PathNode1> Graph1, PathGraphSig<PathNode2> Graph2, PathGraphSig<PathNode3> Graph3>
371+
{
372+
private module MergedInner = MergePathGraph<PathNode1, PathNode2, Graph1, Graph2>;
373+
374+
private module Merged =
375+
MergePathGraph<MergedInner::PathNode, PathNode3, MergedInner::PathGraph, Graph3>;
376+
377+
/** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */
378+
class PathNode instanceof Merged::PathNode {
379+
/** Gets this as a projection on the first given `PathGraph`. */
380+
PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() }
381+
382+
/** Gets this as a projection on the second given `PathGraph`. */
383+
PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() }
384+
385+
/** Gets this as a projection on the third given `PathGraph`. */
386+
PathNode3 asPathNode3() { result = super.asPathNode2() }
387+
388+
/** Gets a textual representation of this element. */
389+
string toString() { result = super.toString() }
390+
391+
/**
392+
* Holds if this element is at the specified location.
393+
* The location spans column `startcolumn` of line `startline` to
394+
* column `endcolumn` of line `endline` in file `filepath`.
395+
* For more information, see
396+
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
397+
*/
398+
predicate hasLocationInfo(
399+
string filepath, int startline, int startcolumn, int endline, int endcolumn
400+
) {
401+
super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn)
402+
}
403+
404+
/** Gets the underlying `Node`. */
405+
Node getNode() { result = super.getNode() }
406+
}
407+
408+
/**
409+
* Provides the query predicates needed to include a graph in a path-problem query.
410+
*/
411+
module PathGraph = Merged::PathGraph;
412+
}

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,52 @@ module MergePathGraph<
361361
}
362362
}
363363
}
364+
365+
/**
366+
* Constructs a `PathGraph` from three `PathGraph`s by disjoint union.
367+
*/
368+
module MergePathGraph3<
369+
PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3,
370+
PathGraphSig<PathNode1> Graph1, PathGraphSig<PathNode2> Graph2, PathGraphSig<PathNode3> Graph3>
371+
{
372+
private module MergedInner = MergePathGraph<PathNode1, PathNode2, Graph1, Graph2>;
373+
374+
private module Merged =
375+
MergePathGraph<MergedInner::PathNode, PathNode3, MergedInner::PathGraph, Graph3>;
376+
377+
/** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */
378+
class PathNode instanceof Merged::PathNode {
379+
/** Gets this as a projection on the first given `PathGraph`. */
380+
PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() }
381+
382+
/** Gets this as a projection on the second given `PathGraph`. */
383+
PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() }
384+
385+
/** Gets this as a projection on the third given `PathGraph`. */
386+
PathNode3 asPathNode3() { result = super.asPathNode2() }
387+
388+
/** Gets a textual representation of this element. */
389+
string toString() { result = super.toString() }
390+
391+
/**
392+
* Holds if this element is at the specified location.
393+
* The location spans column `startcolumn` of line `startline` to
394+
* column `endcolumn` of line `endline` in file `filepath`.
395+
* For more information, see
396+
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
397+
*/
398+
predicate hasLocationInfo(
399+
string filepath, int startline, int startcolumn, int endline, int endcolumn
400+
) {
401+
super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn)
402+
}
403+
404+
/** Gets the underlying `Node`. */
405+
Node getNode() { result = super.getNode() }
406+
}
407+
408+
/**
409+
* Provides the query predicates needed to include a graph in a path-problem query.
410+
*/
411+
module PathGraph = Merged::PathGraph;
412+
}
Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
package,sink,source,summary,sink:code,sink:encryption-decryptor,sink:encryption-encryptor,sink:encryption-keyprop,sink:encryption-symmetrickey,sink:html,sink:remote,sink:sql,sink:xss,source:file,source:local,source:remote,summary:taint,summary:value
2-
Dapper,55,,,,,,,,,,55,,,,,,
3-
JsonToItemsTaskFactory,,,7,,,,,,,,,,,,,7,
4-
Microsoft.ApplicationBlocks.Data,28,,,,,,,,,,28,,,,,,
5-
Microsoft.CSharp,,,24,,,,,,,,,,,,,24,
6-
Microsoft.EntityFrameworkCore,6,,,,,,,,,,6,,,,,,
7-
Microsoft.Extensions.Caching.Distributed,,,15,,,,,,,,,,,,,15,
8-
Microsoft.Extensions.Caching.Memory,,,46,,,,,,,,,,,,,45,1
9-
Microsoft.Extensions.Configuration,,,83,,,,,,,,,,,,,80,3
10-
Microsoft.Extensions.DependencyInjection,,,62,,,,,,,,,,,,,62,
11-
Microsoft.Extensions.DependencyModel,,,12,,,,,,,,,,,,,12,
12-
Microsoft.Extensions.FileProviders,,,16,,,,,,,,,,,,,16,
13-
Microsoft.Extensions.FileSystemGlobbing,,,15,,,,,,,,,,,,,13,2
14-
Microsoft.Extensions.Hosting,,,17,,,,,,,,,,,,,16,1
15-
Microsoft.Extensions.Http,,,10,,,,,,,,,,,,,10,
16-
Microsoft.Extensions.Logging,,,37,,,,,,,,,,,,,37,
17-
Microsoft.Extensions.Options,,,8,,,,,,,,,,,,,8,
18-
Microsoft.Extensions.Primitives,,,63,,,,,,,,,,,,,63,
19-
Microsoft.Interop,,,27,,,,,,,,,,,,,27,
20-
Microsoft.NET.Build.Tasks,,,1,,,,,,,,,,,,,1,
21-
Microsoft.NETCore.Platforms.BuildTasks,,,4,,,,,,,,,,,,,4,
22-
Microsoft.VisualBasic,,,10,,,,,,,,,,,,,5,5
23-
Microsoft.Win32,,,8,,,,,,,,,,,,,8,
24-
MySql.Data.MySqlClient,48,,,,,,,,,,48,,,,,,
25-
Newtonsoft.Json,,,91,,,,,,,,,,,,,73,18
26-
ServiceStack,194,,7,27,,,,,,75,92,,,,,7,
27-
System,65,8,12154,,8,8,9,,4,,33,3,1,3,4,10163,1991
28-
Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,,
1+
package,sink,source,summary,sink:code,sink:encryption-decryptor,sink:encryption-encryptor,sink:encryption-keyprop,sink:encryption-symmetrickey,sink:html,sink:remote,sink:sql,sink:xss,source:file,source:file-write,source:local,source:remote,summary:taint,summary:value
2+
Dapper,55,,,,,,,,,,55,,,,,,,
3+
JsonToItemsTaskFactory,,,7,,,,,,,,,,,,,,7,
4+
Microsoft.ApplicationBlocks.Data,28,,,,,,,,,,28,,,,,,,
5+
Microsoft.CSharp,,,24,,,,,,,,,,,,,,24,
6+
Microsoft.EntityFrameworkCore,6,,,,,,,,,,6,,,,,,,
7+
Microsoft.Extensions.Caching.Distributed,,,15,,,,,,,,,,,,,,15,
8+
Microsoft.Extensions.Caching.Memory,,,46,,,,,,,,,,,,,,45,1
9+
Microsoft.Extensions.Configuration,,,83,,,,,,,,,,,,,,80,3
10+
Microsoft.Extensions.DependencyInjection,,,62,,,,,,,,,,,,,,62,
11+
Microsoft.Extensions.DependencyModel,,,12,,,,,,,,,,,,,,12,
12+
Microsoft.Extensions.FileProviders,,,16,,,,,,,,,,,,,,16,
13+
Microsoft.Extensions.FileSystemGlobbing,,,15,,,,,,,,,,,,,,13,2
14+
Microsoft.Extensions.Hosting,,,17,,,,,,,,,,,,,,16,1
15+
Microsoft.Extensions.Http,,,10,,,,,,,,,,,,,,10,
16+
Microsoft.Extensions.Logging,,,37,,,,,,,,,,,,,,37,
17+
Microsoft.Extensions.Options,,,8,,,,,,,,,,,,,,8,
18+
Microsoft.Extensions.Primitives,,,63,,,,,,,,,,,,,,63,
19+
Microsoft.Interop,,,27,,,,,,,,,,,,,,27,
20+
Microsoft.NET.Build.Tasks,,,1,,,,,,,,,,,,,,1,
21+
Microsoft.NETCore.Platforms.BuildTasks,,,4,,,,,,,,,,,,,,4,
22+
Microsoft.VisualBasic,,,10,,,,,,,,,,,,,,5,5
23+
Microsoft.Win32,,,8,,,,,,,,,,,,,,8,
24+
MySql.Data.MySqlClient,48,,,,,,,,,,48,,,,,,,
25+
Newtonsoft.Json,,,91,,,,,,,,,,,,,,73,18
26+
ServiceStack,194,,7,27,,,,,,75,92,,,,,,7,
27+
System,65,25,12154,,8,8,9,,4,,33,3,1,17,3,4,10163,1991
28+
Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,,,

csharp/documentation/library-coverage/coverage.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ C# framework & library support
88

99
Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE-079` :sub:`Cross-site scripting`
1010
`ServiceStack <https://servicestack.net/>`_,"``ServiceStack.*``, ``ServiceStack``",,7,194,
11-
System,"``System.*``, ``System``",8,12154,65,7
11+
System,"``System.*``, ``System``",25,12154,65,7
1212
Others,"``Dapper``, ``JsonToItemsTaskFactory``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.CSharp``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.NETCore.Platforms.BuildTasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``, ``Windows.Security.Cryptography.Core``",,556,138,
13-
Totals,,8,12717,397,7
13+
Totals,,25,12717,397,7
1414

csharp/ql/lib/ext/System.IO.model.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,23 @@ extensions:
44
extensible: sourceModel
55
data:
66
- ["System.IO", "FileStream", False, "FileStream", "", "", "Argument[this]", "file", "manual"]
7+
- ["System.IO", "FileStream", False, "FileStream", "", "", "Argument[this]", "file-write", "manual"]
8+
- ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String)", "", "Argument[this]", "file-write", "manual"]
9+
- ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Boolean)", "", "Argument[this]", "file-write", "manual"]
10+
- ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Boolean,System.Text.Encoding)", "", "Argument[this]", "file-write", "manual"]
11+
- ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Boolean,System.Text.Encoding,System.Int32)", "", "Argument[this]", "file-write", "manual"]
12+
- ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.Text.Encoding,System.IO.FileStreamOptions)", "", "Argument[this]", "file-write", "manual"]
13+
- ["System.IO", "StreamWriter", False, "StreamWriter", "(System.String,System.IO.FileStreamOptions)", "", "Argument[this]", "file-write", "manual"]
14+
- ["System.IO", "File", False, "Open", "", "", "ReturnValue", "file-write", "manual"]
15+
- ["System.IO", "File", False, "OpenWrite", "", "", "ReturnValue", "file-write", "manual"]
16+
- ["System.IO", "File", False, "Create", "", "", "ReturnValue", "file-write", "manual"]
17+
- ["System.IO", "File", False, "CreateText", "", "", "ReturnValue", "file-write", "manual"]
18+
- ["System.IO", "File", False, "AppendText", "", "", "ReturnValue", "file-write", "manual"]
19+
- ["System.IO", "FileInfo", False, "Open", "", "", "ReturnValue", "file-write", "manual"]
20+
- ["System.IO", "FileInfo", False, "OpenWrite", "", "", "ReturnValue", "file-write", "manual"]
21+
- ["System.IO", "FileInfo", False, "Create", "", "", "ReturnValue", "file-write", "manual"]
22+
- ["System.IO", "FileInfo", False, "CreateText", "", "", "ReturnValue", "file-write", "manual"]
23+
- ["System.IO", "FileInfo", False, "AppendText", "", "", "ReturnValue", "file-write", "manual"]
724
- addsTo:
825
pack: codeql/csharp-all
926
extensible: summaryModel

csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ module ModelValidation {
215215
)
216216
or
217217
exists(string kind | sourceModel(_, _, _, _, _, _, _, kind, _) |
218-
not kind = ["local", "remote", "file"] and
218+
not kind = ["local", "remote", "file", "file-write"] and
219219
result = "Invalid kind \"" + kind + "\" in source model."
220220
)
221221
}

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,52 @@ module MergePathGraph<
361361
}
362362
}
363363
}
364+
365+
/**
366+
* Constructs a `PathGraph` from three `PathGraph`s by disjoint union.
367+
*/
368+
module MergePathGraph3<
369+
PathNodeSig PathNode1, PathNodeSig PathNode2, PathNodeSig PathNode3,
370+
PathGraphSig<PathNode1> Graph1, PathGraphSig<PathNode2> Graph2, PathGraphSig<PathNode3> Graph3>
371+
{
372+
private module MergedInner = MergePathGraph<PathNode1, PathNode2, Graph1, Graph2>;
373+
374+
private module Merged =
375+
MergePathGraph<MergedInner::PathNode, PathNode3, MergedInner::PathGraph, Graph3>;
376+
377+
/** A node in a graph of path explanations that is formed by disjoint union of the three given graphs. */
378+
class PathNode instanceof Merged::PathNode {
379+
/** Gets this as a projection on the first given `PathGraph`. */
380+
PathNode1 asPathNode1() { result = super.asPathNode1().asPathNode1() }
381+
382+
/** Gets this as a projection on the second given `PathGraph`. */
383+
PathNode2 asPathNode2() { result = super.asPathNode1().asPathNode2() }
384+
385+
/** Gets this as a projection on the third given `PathGraph`. */
386+
PathNode3 asPathNode3() { result = super.asPathNode2() }
387+
388+
/** Gets a textual representation of this element. */
389+
string toString() { result = super.toString() }
390+
391+
/**
392+
* Holds if this element is at the specified location.
393+
* The location spans column `startcolumn` of line `startline` to
394+
* column `endcolumn` of line `endline` in file `filepath`.
395+
* For more information, see
396+
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
397+
*/
398+
predicate hasLocationInfo(
399+
string filepath, int startline, int startcolumn, int endline, int endcolumn
400+
) {
401+
super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn)
402+
}
403+
404+
/** Gets the underlying `Node`. */
405+
Node getNode() { result = super.getNode() }
406+
}
407+
408+
/**
409+
* Provides the query predicates needed to include a graph in a path-problem query.
410+
*/
411+
module PathGraph = Merged::PathGraph;
412+
}

csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,10 @@ private import semmle.code.csharp.dataflow.TaintTracking2
1818
*/
1919
predicate xssFlow(XssNode source, XssNode sink, string message) {
2020
// standard taint-tracking
21-
exists(
22-
TaintTrackingConfiguration c, DataFlow2::PathNode sourceNode, DataFlow2::PathNode sinkNode
23-
|
21+
exists(XssTracking::PathNode sourceNode, XssTracking::PathNode sinkNode |
2422
sourceNode = source.asDataFlowNode() and
2523
sinkNode = sink.asDataFlowNode() and
26-
c.hasFlowPath(sourceNode, sinkNode) and
24+
XssTracking::flowPath(sourceNode, sinkNode) and
2725
message =
2826
"is written to HTML or JavaScript" +
2927
any(string explanation |
@@ -45,7 +43,7 @@ predicate xssFlow(XssNode source, XssNode sink, string message) {
4543
module PathGraph {
4644
/** Holds if `(pred,succ)` is an edge in the graph of data flow path explanations. */
4745
query predicate edges(XssNode pred, XssNode succ) {
48-
exists(DataFlow2::PathNode a, DataFlow2::PathNode b | DataFlow2::PathGraph::edges(a, b) |
46+
exists(XssTracking::PathNode a, XssTracking::PathNode b | XssTracking::PathGraph::edges(a, b) |
4947
pred.asDataFlowNode() = a and
5048
succ.asDataFlowNode() = b
5149
)
@@ -56,7 +54,7 @@ module PathGraph {
5654

5755
/** Holds if `n` is a node in the graph of data flow path explanations. */
5856
query predicate nodes(XssNode n, string key, string val) {
59-
DataFlow2::PathGraph::nodes(n.asDataFlowNode(), key, val)
57+
XssTracking::PathGraph::nodes(n.asDataFlowNode(), key, val)
6058
or
6159
xssFlow(n, n, _) and
6260
key = "semmle.label" and
@@ -69,13 +67,13 @@ module PathGraph {
6967
* `ret -> out` is summarized as the edge `arg -> out`.
7068
*/
7169
query predicate subpaths(XssNode arg, XssNode par, XssNode ret, XssNode out) {
72-
DataFlow2::PathGraph::subpaths(arg.asDataFlowNode(), par.asDataFlowNode(), ret.asDataFlowNode(),
73-
out.asDataFlowNode())
70+
XssTracking::PathGraph::subpaths(arg.asDataFlowNode(), par.asDataFlowNode(),
71+
ret.asDataFlowNode(), out.asDataFlowNode())
7472
}
7573
}
7674

7775
private newtype TXssNode =
78-
TXssDataFlowNode(DataFlow2::PathNode node) or
76+
TXssDataFlowNode(XssTracking::PathNode node) or
7977
TXssAspNode(AspInlineMember m)
8078

8179
/**
@@ -90,21 +88,25 @@ class XssNode extends TXssNode {
9088
/** Gets the location of this node. */
9189
Location getLocation() { none() }
9290

93-
/** Gets the data flow node corresponding to this node, if any. */
94-
DataFlow2::PathNode asDataFlowNode() { result = this.(XssDataFlowNode).getDataFlowNode() }
91+
/**
92+
* Gets the data flow node corresponding to this node, if any.
93+
*/
94+
XssTracking::PathNode asDataFlowNode() { result = this.(XssDataFlowNode).getDataFlowNode() }
9595

9696
/** Gets the ASP inline code element corresponding to this node, if any. */
9797
AspInlineMember asAspInlineMember() { result = this.(XssAspNode).getAspInlineMember() }
9898
}
9999

100-
/** A data flow node, viewed as an XSS flow node. */
100+
/**
101+
* A data flow node, viewed as an XSS flow node.
102+
*/
101103
class XssDataFlowNode extends TXssDataFlowNode, XssNode {
102-
DataFlow2::PathNode node;
104+
XssTracking::PathNode node;
103105

104106
XssDataFlowNode() { this = TXssDataFlowNode(node) }
105107

106108
/** Gets the data flow node corresponding to this node. */
107-
DataFlow2::PathNode getDataFlowNode() { result = node }
109+
XssTracking::PathNode getDataFlowNode() { result = node }
108110

109111
override string toString() { result = node.toString() }
110112

@@ -136,9 +138,11 @@ abstract class Source extends DataFlow::Node { }
136138
abstract class Sanitizer extends DataFlow::ExprNode { }
137139

138140
/**
141+
* DEPRECATED: Use `XssTracking` instead.
142+
*
139143
* A taint-tracking configuration for cross-site scripting (XSS) vulnerabilities.
140144
*/
141-
class TaintTrackingConfiguration extends TaintTracking2::Configuration {
145+
deprecated class TaintTrackingConfiguration extends TaintTracking2::Configuration {
142146
TaintTrackingConfiguration() { this = "XSSDataFlowConfiguration" }
143147

144148
override predicate isSource(DataFlow::Node source) { source instanceof Source }
@@ -148,6 +152,29 @@ class TaintTrackingConfiguration extends TaintTracking2::Configuration {
148152
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
149153
}
150154

155+
/**
156+
* A taint-tracking configuration for cross-site scripting (XSS) vulnerabilities.
157+
*/
158+
module XssTrackingConfig implements DataFlow::ConfigSig {
159+
/**
160+
* Holds if `source` is a relevant data flow source.
161+
*/
162+
predicate isSource(DataFlow::Node source) { source instanceof Source }
163+
164+
/**
165+
* Holds if `sink` is a relevant data flow sink.
166+
*/
167+
predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
168+
169+
/**
170+
* Holds if data flow through `node` is prohibited. This completely removes
171+
* `node` from the data flow graph.
172+
*/
173+
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
174+
}
175+
176+
module XssTracking = TaintTracking::Global<XssTrackingConfig>;
177+
151178
/** A source of remote user input. */
152179
private class RemoteSource extends Source instanceof RemoteFlowSource { }
153180

0 commit comments

Comments
 (0)