@@ -65,17 +65,27 @@ predicate resultFlowsToPrinter(DataFlow::CallNode authCodeURLCall) {
65
65
)
66
66
}
67
67
68
+ /** Gets dataflow nodes that read the value of os.Stdin */
69
+ DataFlow:: Node getAStdinNode ( ) {
70
+ result = any ( ValueEntity v | v .hasQualifiedName ( "os" , "Stdin" ) ) .getARead ( )
71
+ }
72
+
73
+ /**
74
+ * Gets a call to a scanner function that reads from os.Stdin, or which creates a scanner
75
+ * instance wrapping os.Stdin.
76
+ */
77
+ DataFlow:: CallNode getAScannerCall ( ) {
78
+ result instanceof Fmt:: ScannerCall or
79
+ result .( Fmt:: FScannerCall ) .getReader ( ) = getAStdinNode ( ) or
80
+ result .( Bufio:: NewScannerCall ) .getReader ( ) = getAStdinNode ( )
81
+ }
82
+
68
83
/**
69
84
* Holds if the provided CallNode is within the same root as a call
70
85
* to a scanner that reads from os.Stdin.
71
86
*/
72
- predicate rootContainsCallToStdinScanner ( DataFlow:: CallNode authCodeURLCall ) {
73
- exists ( Fmt:: ScannerCall scannerCall | scannerCall .getRoot ( ) = authCodeURLCall .getRoot ( ) )
74
- or
75
- exists ( Fmt:: FScannerCall fScannerCall |
76
- fScannerCall .getReader ( ) = any ( ValueEntity v | v .hasQualifiedName ( "os" , "Stdin" ) ) .getARead ( ) and
77
- fScannerCall .getRoot ( ) = authCodeURLCall .getRoot ( )
78
- )
87
+ predicate containsCallToStdinScanner ( FuncDef funcDef ) {
88
+ exists ( DataFlow:: CallNode call | call = getAScannerCall ( ) | call .getRoot ( ) = funcDef )
79
89
}
80
90
81
91
/**
@@ -86,7 +96,7 @@ predicate rootContainsCallToStdinScanner(DataFlow::CallNode authCodeURLCall) {
86
96
*/
87
97
predicate seemsLikeDoneWithinATerminal ( DataFlow:: CallNode authCodeURLCall ) {
88
98
resultFlowsToPrinter ( authCodeURLCall ) and
89
- rootContainsCallToStdinScanner ( authCodeURLCall )
99
+ containsCallToStdinScanner ( authCodeURLCall . getRoot ( ) )
90
100
}
91
101
92
102
from
0 commit comments