@@ -86,4 +86,38 @@ public void sendUserFileGood4(Socket sock, String user) throws IOException {
8686 fileLine = fileReader .readLine ();
8787 }
8888 }
89+
90+ public void sendUserFileGood5 (Socket sock , String user ) throws IOException {
91+ BufferedReader filenameReader =
92+ new BufferedReader (new InputStreamReader (sock .getInputStream (), "UTF-8" ));
93+ String filename = filenameReader .readLine ();
94+ File f1 = new File ("safe/file.txt" );
95+ // GOOD: ensure that the path does not contain ".." and is used as the
96+ // second argument to a `File` constructor
97+ if (!filename .contains (".." )) {
98+ File f2 = new File (f1 , filename );
99+ f2 .exists ();
100+
101+ // Only sanitize `f2`; `filename` is still tainted
102+ BufferedReader fileReader = new BufferedReader (new FileReader (filename )); // $ hasTaintFlow
103+ }
104+ }
105+
106+ public void sendUserFileGood6 (Socket sock , String user ) throws IOException {
107+ BufferedReader filenameReader =
108+ new BufferedReader (new InputStreamReader (sock .getInputStream (), "UTF-8" ));
109+ String filename = filenameReader .readLine ();
110+ File f1 = new File ("safe/file.txt" );
111+
112+ // GOOD: ensure that the path is normalized and is then used as the
113+ // second argument to a `File` constructor
114+ Path normalizedFilename = Paths .get (filename ).normalize ().toAbsolutePath ();
115+ String normalizedFilenameStr = normalizedFilename .toString ();
116+ File f2 = new File (f1 , normalizedFilenameStr );
117+ f2 .exists ();
118+
119+ // Only sanitize `f2`; `filename` and `normalizedFilenameStr` are still tainted
120+ BufferedReader fileReader = new BufferedReader (new FileReader (filename )); // $ hasTaintFlow
121+ BufferedReader fileReader2 = new BufferedReader (new FileReader (normalizedFilenameStr )); // $ hasTaintFlow
122+ }
89123}
0 commit comments