@@ -306,7 +306,7 @@ module NodeJSLib {
306306
307307 FsFlowTarget ( ) {
308308 exists ( DataFlow:: CallNode call , string methodName |
309- call = DataFlow :: moduleMember ( "fs" , methodName ) .getACall ( )
309+ call = Fs :: moduleMember ( methodName ) .getACall ( )
310310 |
311311 methodName = "realpathSync" and
312312 tainted = call .getArgument ( 0 ) and
@@ -430,27 +430,32 @@ module NodeJSLib {
430430 }
431431
432432 /**
433- * A member `member` from module `fs` or its drop-in replacements `graceful-fs`, `fs-extra`, `original-fs` .
433+ * Provides predicates for working with the "fs" module and its variants as a single module .
434434 */
435- private DataFlow:: SourceNode fsModuleMember ( string member ) {
436- result = fsModule ( DataFlow:: TypeTracker:: end ( ) ) .getAPropertyRead ( member )
437- }
435+ module Fs {
436+ /**
437+ * A member `member` from module `fs` or its drop-in replacements `graceful-fs`, `fs-extra`, `original-fs`.
438+ */
439+ DataFlow:: SourceNode moduleMember ( string member ) {
440+ result = fsModule ( DataFlow:: TypeTracker:: end ( ) ) .getAPropertyRead ( member )
441+ }
438442
439- private DataFlow:: SourceNode fsModule ( DataFlow:: TypeTracker t ) {
440- exists ( string moduleName |
441- moduleName = "fs" or
442- moduleName = "graceful-fs" or
443- moduleName = "fs-extra" or
444- moduleName = "original-fs"
445- |
446- result = DataFlow:: moduleImport ( moduleName )
443+ private DataFlow:: SourceNode fsModule ( DataFlow:: TypeTracker t ) {
444+ exists ( string moduleName |
445+ moduleName = "fs" or
446+ moduleName = "graceful-fs" or
447+ moduleName = "fs-extra" or
448+ moduleName = "original-fs"
449+ |
450+ result = DataFlow:: moduleImport ( moduleName )
451+ or
452+ // extra support for flexible names
453+ result .asExpr ( ) .( Require ) .getArgument ( 0 ) .mayHaveStringValue ( moduleName )
454+ ) and
455+ t .start ( )
447456 or
448- // extra support for flexible names
449- result .asExpr ( ) .( Require ) .getArgument ( 0 ) .mayHaveStringValue ( moduleName )
450- ) and
451- t .start ( )
452- or
453- exists ( DataFlow:: TypeTracker t2 | result = fsModule ( t2 ) .track ( t2 , t ) )
457+ exists ( DataFlow:: TypeTracker t2 | result = fsModule ( t2 ) .track ( t2 , t ) )
458+ }
454459 }
455460
456461 /**
@@ -459,7 +464,7 @@ module NodeJSLib {
459464 private class NodeJSFileSystemAccess extends FileSystemAccess , DataFlow:: CallNode {
460465 string methodName ;
461466
462- NodeJSFileSystemAccess ( ) { this = maybePromisified ( fsModuleMember ( methodName ) ) .getACall ( ) }
467+ NodeJSFileSystemAccess ( ) { this = maybePromisified ( Fs :: moduleMember ( methodName ) ) .getACall ( ) }
463468
464469 /**
465470 * Gets the name of the called method.
@@ -582,8 +587,8 @@ module NodeJSLib {
582587 name = "readdir" or
583588 name = "realpath"
584589 |
585- this = fsModuleMember ( name ) .getACall ( ) .getCallback ( [ 1 .. 2 ] ) .getParameter ( 1 ) or
586- this = fsModuleMember ( name + "Sync" ) .getACall ( )
590+ this = Fs :: moduleMember ( name ) .getACall ( ) .getCallback ( [ 1 .. 2 ] ) .getParameter ( 1 ) or
591+ this = Fs :: moduleMember ( name + "Sync" ) .getACall ( )
587592 )
588593 }
589594 }
0 commit comments