@@ -65,17 +65,27 @@ predicate resultFlowsToPrinter(DataFlow::CallNode authCodeURLCall) {
6565 )
6666}
6767
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+
6883/**
6984 * Holds if the provided CallNode is within the same root as a call
7085 * to a scanner that reads from os.Stdin.
7186 */
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 )
7989}
8090
8191/**
@@ -86,7 +96,7 @@ predicate rootContainsCallToStdinScanner(DataFlow::CallNode authCodeURLCall) {
8696 */
8797predicate seemsLikeDoneWithinATerminal ( DataFlow:: CallNode authCodeURLCall ) {
8898 resultFlowsToPrinter ( authCodeURLCall ) and
89- rootContainsCallToStdinScanner ( authCodeURLCall )
99+ containsCallToStdinScanner ( authCodeURLCall . getRoot ( ) )
90100}
91101
92102from
0 commit comments