Skip to content

Commit 4f9a6c1

Browse files
committed
Dataflow: Code review fixes.
1 parent 683f853 commit 4f9a6c1

File tree

24 files changed

+1008
-1080
lines changed

24 files changed

+1008
-1080
lines changed

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -607,9 +607,9 @@ private module Stage1 {
607607

608608
pragma[nomagic]
609609
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
610-
exists(Node node, boolean toReturn |
611-
revFlow(node, toReturn, config) and
612-
revFlowInToReturn(call, node, config) and
610+
exists(ArgNode arg, boolean toReturn |
611+
revFlow(arg, toReturn, config) and
612+
revFlowInToReturn(call, arg, config) and
613613
revFlowIsReturned(call, toReturn, config)
614614
)
615615
}
@@ -838,12 +838,11 @@ private module Stage2 {
838838

839839
pragma[nomagic]
840840
private predicate flowThroughOutOfCall(
841-
DataFlowCall call, ReturnNodeExt node1, Node node2, boolean allowsFieldFlow,
842-
Configuration config
841+
DataFlowCall call, ReturnNodeExt ret, Node out, boolean allowsFieldFlow, Configuration config
843842
) {
844-
flowOutOfCall(call, node1, node2, allowsFieldFlow, pragma[only_bind_into](config)) and
843+
flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and
845844
PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and
846-
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(node1), _,
845+
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(ret), _,
847846
pragma[only_bind_into](config))
848847
}
849848

@@ -1029,22 +1028,22 @@ private module Stage2 {
10291028

10301029
pragma[nomagic]
10311030
private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) {
1032-
exists(Ap argAp0, Node node, Cc cc, ApOption argAp, Ap ap |
1033-
fwdFlow(node, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
1031+
exists(Ap argAp0, Node out, Cc cc, ApOption argAp, Ap ap |
1032+
fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
10341033
pragma[only_bind_into](config)) and
1035-
fwdFlowOutFromArg(call, node, argAp0, ap, config) and
1034+
fwdFlowOutFromArg(call, out, argAp0, ap, config) and
10361035
fwdFlowIsEntered(call, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), argAp0,
10371036
pragma[only_bind_into](config))
10381037
)
10391038
}
10401039

10411040
pragma[nomagic]
10421041
private predicate flowThroughIntoCall(
1043-
DataFlowCall call, ArgNode node1, ParamNode node2, boolean allowsFieldFlow, Configuration config
1042+
DataFlowCall call, ArgNode arg, ParamNode p, boolean allowsFieldFlow, Configuration config
10441043
) {
1045-
flowIntoCall(call, node1, node2, allowsFieldFlow, config) and
1046-
fwdFlow(node1, _, _, _, pragma[only_bind_into](config)) and
1047-
PrevStage::parameterMayFlowThrough(node2, _, _, pragma[only_bind_into](config)) and
1044+
flowIntoCall(call, arg, p, allowsFieldFlow, config) and
1045+
fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and
1046+
PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and
10481047
callMayFlowThroughFwd(call, pragma[only_bind_into](config))
10491048
}
10501049

@@ -1256,9 +1255,9 @@ private module Stage2 {
12561255

12571256
pragma[nomagic]
12581257
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
1259-
exists(Ap returnAp0, Node node, boolean toReturn, ApOption returnAp, Ap ap |
1260-
revFlow(node, toReturn, returnAp, ap, config) and
1261-
revFlowInToReturn(call, node, returnAp0, ap, config) and
1258+
exists(Ap returnAp0, ArgNode arg, boolean toReturn, ApOption returnAp, Ap ap |
1259+
revFlow(arg, toReturn, returnAp, ap, config) and
1260+
revFlowInToReturn(call, arg, returnAp0, ap, config) and
12621261
revFlowIsReturned(call, toReturn, returnAp, returnAp0, config)
12631262
)
12641263
}
@@ -1513,12 +1512,11 @@ private module Stage3 {
15131512

15141513
pragma[nomagic]
15151514
private predicate flowThroughOutOfCall(
1516-
DataFlowCall call, ReturnNodeExt node1, Node node2, boolean allowsFieldFlow,
1517-
Configuration config
1515+
DataFlowCall call, ReturnNodeExt ret, Node out, boolean allowsFieldFlow, Configuration config
15181516
) {
1519-
flowOutOfCall(call, node1, node2, allowsFieldFlow, pragma[only_bind_into](config)) and
1517+
flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and
15201518
PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and
1521-
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(node1), _,
1519+
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(ret), _,
15221520
pragma[only_bind_into](config))
15231521
}
15241522

@@ -1711,22 +1709,22 @@ private module Stage3 {
17111709

17121710
pragma[nomagic]
17131711
private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) {
1714-
exists(Ap argAp0, Node node, Cc cc, ApOption argAp, Ap ap |
1715-
fwdFlow(node, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
1712+
exists(Ap argAp0, Node out, Cc cc, ApOption argAp, Ap ap |
1713+
fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
17161714
pragma[only_bind_into](config)) and
1717-
fwdFlowOutFromArg(call, node, argAp0, ap, config) and
1715+
fwdFlowOutFromArg(call, out, argAp0, ap, config) and
17181716
fwdFlowIsEntered(call, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), argAp0,
17191717
pragma[only_bind_into](config))
17201718
)
17211719
}
17221720

17231721
pragma[nomagic]
17241722
private predicate flowThroughIntoCall(
1725-
DataFlowCall call, ArgNode node1, ParamNode node2, boolean allowsFieldFlow, Configuration config
1723+
DataFlowCall call, ArgNode arg, ParamNode p, boolean allowsFieldFlow, Configuration config
17261724
) {
1727-
flowIntoCall(call, node1, node2, allowsFieldFlow, config) and
1728-
fwdFlow(node1, _, _, _, pragma[only_bind_into](config)) and
1729-
PrevStage::parameterMayFlowThrough(node2, _, _, pragma[only_bind_into](config)) and
1725+
flowIntoCall(call, arg, p, allowsFieldFlow, config) and
1726+
fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and
1727+
PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and
17301728
callMayFlowThroughFwd(call, pragma[only_bind_into](config))
17311729
}
17321730

@@ -1938,9 +1936,9 @@ private module Stage3 {
19381936

19391937
pragma[nomagic]
19401938
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
1941-
exists(Ap returnAp0, Node node, boolean toReturn, ApOption returnAp, Ap ap |
1942-
revFlow(node, toReturn, returnAp, ap, config) and
1943-
revFlowInToReturn(call, node, returnAp0, ap, config) and
1939+
exists(Ap returnAp0, ArgNode arg, boolean toReturn, ApOption returnAp, Ap ap |
1940+
revFlow(arg, toReturn, returnAp, ap, config) and
1941+
revFlowInToReturn(call, arg, returnAp0, ap, config) and
19441942
revFlowIsReturned(call, toReturn, returnAp, returnAp0, config)
19451943
)
19461944
}
@@ -2269,12 +2267,11 @@ private module Stage4 {
22692267

22702268
pragma[nomagic]
22712269
private predicate flowThroughOutOfCall(
2272-
DataFlowCall call, ReturnNodeExt node1, Node node2, boolean allowsFieldFlow,
2273-
Configuration config
2270+
DataFlowCall call, ReturnNodeExt ret, Node out, boolean allowsFieldFlow, Configuration config
22742271
) {
2275-
flowOutOfCall(call, node1, node2, allowsFieldFlow, pragma[only_bind_into](config)) and
2272+
flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and
22762273
PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and
2277-
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(node1), _,
2274+
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(ret), _,
22782275
pragma[only_bind_into](config))
22792276
}
22802277

@@ -2467,22 +2464,22 @@ private module Stage4 {
24672464

24682465
pragma[nomagic]
24692466
private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) {
2470-
exists(Ap argAp0, Node node, Cc cc, ApOption argAp, Ap ap |
2471-
fwdFlow(node, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
2467+
exists(Ap argAp0, Node out, Cc cc, ApOption argAp, Ap ap |
2468+
fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
24722469
pragma[only_bind_into](config)) and
2473-
fwdFlowOutFromArg(call, node, argAp0, ap, config) and
2470+
fwdFlowOutFromArg(call, out, argAp0, ap, config) and
24742471
fwdFlowIsEntered(call, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), argAp0,
24752472
pragma[only_bind_into](config))
24762473
)
24772474
}
24782475

24792476
pragma[nomagic]
24802477
private predicate flowThroughIntoCall(
2481-
DataFlowCall call, ArgNode node1, ParamNode node2, boolean allowsFieldFlow, Configuration config
2478+
DataFlowCall call, ArgNode arg, ParamNode p, boolean allowsFieldFlow, Configuration config
24822479
) {
2483-
flowIntoCall(call, node1, node2, allowsFieldFlow, config) and
2484-
fwdFlow(node1, _, _, _, pragma[only_bind_into](config)) and
2485-
PrevStage::parameterMayFlowThrough(node2, _, _, pragma[only_bind_into](config)) and
2480+
flowIntoCall(call, arg, p, allowsFieldFlow, config) and
2481+
fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and
2482+
PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and
24862483
callMayFlowThroughFwd(call, pragma[only_bind_into](config))
24872484
}
24882485

@@ -2694,9 +2691,9 @@ private module Stage4 {
26942691

26952692
pragma[nomagic]
26962693
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
2697-
exists(Ap returnAp0, Node node, boolean toReturn, ApOption returnAp, Ap ap |
2698-
revFlow(node, toReturn, returnAp, ap, config) and
2699-
revFlowInToReturn(call, node, returnAp0, ap, config) and
2694+
exists(Ap returnAp0, ArgNode arg, boolean toReturn, ApOption returnAp, Ap ap |
2695+
revFlow(arg, toReturn, returnAp, ap, config) and
2696+
revFlowInToReturn(call, arg, returnAp0, ap, config) and
27002697
revFlowIsReturned(call, toReturn, returnAp, returnAp0, config)
27012698
)
27022699
}

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -607,9 +607,9 @@ private module Stage1 {
607607

608608
pragma[nomagic]
609609
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
610-
exists(Node node, boolean toReturn |
611-
revFlow(node, toReturn, config) and
612-
revFlowInToReturn(call, node, config) and
610+
exists(ArgNode arg, boolean toReturn |
611+
revFlow(arg, toReturn, config) and
612+
revFlowInToReturn(call, arg, config) and
613613
revFlowIsReturned(call, toReturn, config)
614614
)
615615
}
@@ -838,12 +838,11 @@ private module Stage2 {
838838

839839
pragma[nomagic]
840840
private predicate flowThroughOutOfCall(
841-
DataFlowCall call, ReturnNodeExt node1, Node node2, boolean allowsFieldFlow,
842-
Configuration config
841+
DataFlowCall call, ReturnNodeExt ret, Node out, boolean allowsFieldFlow, Configuration config
843842
) {
844-
flowOutOfCall(call, node1, node2, allowsFieldFlow, pragma[only_bind_into](config)) and
843+
flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and
845844
PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and
846-
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(node1), _,
845+
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(ret), _,
847846
pragma[only_bind_into](config))
848847
}
849848

@@ -1029,22 +1028,22 @@ private module Stage2 {
10291028

10301029
pragma[nomagic]
10311030
private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) {
1032-
exists(Ap argAp0, Node node, Cc cc, ApOption argAp, Ap ap |
1033-
fwdFlow(node, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
1031+
exists(Ap argAp0, Node out, Cc cc, ApOption argAp, Ap ap |
1032+
fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
10341033
pragma[only_bind_into](config)) and
1035-
fwdFlowOutFromArg(call, node, argAp0, ap, config) and
1034+
fwdFlowOutFromArg(call, out, argAp0, ap, config) and
10361035
fwdFlowIsEntered(call, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), argAp0,
10371036
pragma[only_bind_into](config))
10381037
)
10391038
}
10401039

10411040
pragma[nomagic]
10421041
private predicate flowThroughIntoCall(
1043-
DataFlowCall call, ArgNode node1, ParamNode node2, boolean allowsFieldFlow, Configuration config
1042+
DataFlowCall call, ArgNode arg, ParamNode p, boolean allowsFieldFlow, Configuration config
10441043
) {
1045-
flowIntoCall(call, node1, node2, allowsFieldFlow, config) and
1046-
fwdFlow(node1, _, _, _, pragma[only_bind_into](config)) and
1047-
PrevStage::parameterMayFlowThrough(node2, _, _, pragma[only_bind_into](config)) and
1044+
flowIntoCall(call, arg, p, allowsFieldFlow, config) and
1045+
fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and
1046+
PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and
10481047
callMayFlowThroughFwd(call, pragma[only_bind_into](config))
10491048
}
10501049

@@ -1256,9 +1255,9 @@ private module Stage2 {
12561255

12571256
pragma[nomagic]
12581257
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
1259-
exists(Ap returnAp0, Node node, boolean toReturn, ApOption returnAp, Ap ap |
1260-
revFlow(node, toReturn, returnAp, ap, config) and
1261-
revFlowInToReturn(call, node, returnAp0, ap, config) and
1258+
exists(Ap returnAp0, ArgNode arg, boolean toReturn, ApOption returnAp, Ap ap |
1259+
revFlow(arg, toReturn, returnAp, ap, config) and
1260+
revFlowInToReturn(call, arg, returnAp0, ap, config) and
12621261
revFlowIsReturned(call, toReturn, returnAp, returnAp0, config)
12631262
)
12641263
}
@@ -1513,12 +1512,11 @@ private module Stage3 {
15131512

15141513
pragma[nomagic]
15151514
private predicate flowThroughOutOfCall(
1516-
DataFlowCall call, ReturnNodeExt node1, Node node2, boolean allowsFieldFlow,
1517-
Configuration config
1515+
DataFlowCall call, ReturnNodeExt ret, Node out, boolean allowsFieldFlow, Configuration config
15181516
) {
1519-
flowOutOfCall(call, node1, node2, allowsFieldFlow, pragma[only_bind_into](config)) and
1517+
flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and
15201518
PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and
1521-
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(node1), _,
1519+
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(ret), _,
15221520
pragma[only_bind_into](config))
15231521
}
15241522

@@ -1711,22 +1709,22 @@ private module Stage3 {
17111709

17121710
pragma[nomagic]
17131711
private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) {
1714-
exists(Ap argAp0, Node node, Cc cc, ApOption argAp, Ap ap |
1715-
fwdFlow(node, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
1712+
exists(Ap argAp0, Node out, Cc cc, ApOption argAp, Ap ap |
1713+
fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
17161714
pragma[only_bind_into](config)) and
1717-
fwdFlowOutFromArg(call, node, argAp0, ap, config) and
1715+
fwdFlowOutFromArg(call, out, argAp0, ap, config) and
17181716
fwdFlowIsEntered(call, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), argAp0,
17191717
pragma[only_bind_into](config))
17201718
)
17211719
}
17221720

17231721
pragma[nomagic]
17241722
private predicate flowThroughIntoCall(
1725-
DataFlowCall call, ArgNode node1, ParamNode node2, boolean allowsFieldFlow, Configuration config
1723+
DataFlowCall call, ArgNode arg, ParamNode p, boolean allowsFieldFlow, Configuration config
17261724
) {
1727-
flowIntoCall(call, node1, node2, allowsFieldFlow, config) and
1728-
fwdFlow(node1, _, _, _, pragma[only_bind_into](config)) and
1729-
PrevStage::parameterMayFlowThrough(node2, _, _, pragma[only_bind_into](config)) and
1725+
flowIntoCall(call, arg, p, allowsFieldFlow, config) and
1726+
fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and
1727+
PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and
17301728
callMayFlowThroughFwd(call, pragma[only_bind_into](config))
17311729
}
17321730

@@ -1938,9 +1936,9 @@ private module Stage3 {
19381936

19391937
pragma[nomagic]
19401938
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
1941-
exists(Ap returnAp0, Node node, boolean toReturn, ApOption returnAp, Ap ap |
1942-
revFlow(node, toReturn, returnAp, ap, config) and
1943-
revFlowInToReturn(call, node, returnAp0, ap, config) and
1939+
exists(Ap returnAp0, ArgNode arg, boolean toReturn, ApOption returnAp, Ap ap |
1940+
revFlow(arg, toReturn, returnAp, ap, config) and
1941+
revFlowInToReturn(call, arg, returnAp0, ap, config) and
19441942
revFlowIsReturned(call, toReturn, returnAp, returnAp0, config)
19451943
)
19461944
}
@@ -2269,12 +2267,11 @@ private module Stage4 {
22692267

22702268
pragma[nomagic]
22712269
private predicate flowThroughOutOfCall(
2272-
DataFlowCall call, ReturnNodeExt node1, Node node2, boolean allowsFieldFlow,
2273-
Configuration config
2270+
DataFlowCall call, ReturnNodeExt ret, Node out, boolean allowsFieldFlow, Configuration config
22742271
) {
2275-
flowOutOfCall(call, node1, node2, allowsFieldFlow, pragma[only_bind_into](config)) and
2272+
flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and
22762273
PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and
2277-
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(node1), _,
2274+
PrevStage::parameterMayFlowThrough(_, getNodeEnclosingCallable(ret), _,
22782275
pragma[only_bind_into](config))
22792276
}
22802277

@@ -2467,22 +2464,22 @@ private module Stage4 {
24672464

24682465
pragma[nomagic]
24692466
private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) {
2470-
exists(Ap argAp0, Node node, Cc cc, ApOption argAp, Ap ap |
2471-
fwdFlow(node, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
2467+
exists(Ap argAp0, Node out, Cc cc, ApOption argAp, Ap ap |
2468+
fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap,
24722469
pragma[only_bind_into](config)) and
2473-
fwdFlowOutFromArg(call, node, argAp0, ap, config) and
2470+
fwdFlowOutFromArg(call, out, argAp0, ap, config) and
24742471
fwdFlowIsEntered(call, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), argAp0,
24752472
pragma[only_bind_into](config))
24762473
)
24772474
}
24782475

24792476
pragma[nomagic]
24802477
private predicate flowThroughIntoCall(
2481-
DataFlowCall call, ArgNode node1, ParamNode node2, boolean allowsFieldFlow, Configuration config
2478+
DataFlowCall call, ArgNode arg, ParamNode p, boolean allowsFieldFlow, Configuration config
24822479
) {
2483-
flowIntoCall(call, node1, node2, allowsFieldFlow, config) and
2484-
fwdFlow(node1, _, _, _, pragma[only_bind_into](config)) and
2485-
PrevStage::parameterMayFlowThrough(node2, _, _, pragma[only_bind_into](config)) and
2480+
flowIntoCall(call, arg, p, allowsFieldFlow, config) and
2481+
fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and
2482+
PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and
24862483
callMayFlowThroughFwd(call, pragma[only_bind_into](config))
24872484
}
24882485

@@ -2694,9 +2691,9 @@ private module Stage4 {
26942691

26952692
pragma[nomagic]
26962693
predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) {
2697-
exists(Ap returnAp0, Node node, boolean toReturn, ApOption returnAp, Ap ap |
2698-
revFlow(node, toReturn, returnAp, ap, config) and
2699-
revFlowInToReturn(call, node, returnAp0, ap, config) and
2694+
exists(Ap returnAp0, ArgNode arg, boolean toReturn, ApOption returnAp, Ap ap |
2695+
revFlow(arg, toReturn, returnAp, ap, config) and
2696+
revFlowInToReturn(call, arg, returnAp0, ap, config) and
27002697
revFlowIsReturned(call, toReturn, returnAp, returnAp0, config)
27012698
)
27022699
}

0 commit comments

Comments
 (0)