remm 02/03/14 12:55:47
Modified: catalina/src/share/org/apache/naming/resources
FileDirContext.java
Log:
- Tighten up the file access so that there is no way to request a path above
the base, regarless of what path is passed. This is for robustness and peace of
mind
only; I haven't sound any security vulnerabiltiy. Note: The performance impact
is minimal because of the cache.
Revision Changes Path
1.12 +23 -12
jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/FileDirContext.java
Index: FileDirContext.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- FileDirContext.java 27 Feb 2002 19:06:35 -0000 1.11
+++ FileDirContext.java 14 Mar 2002 20:55:47 -0000 1.12
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v
1.11 2002/02/27 19:06:35 remm Exp $
- * $Revision: 1.11 $
- * $Date: 2002/02/27 19:06:35 $
+ * $Header:
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v
1.12 2002/03/14 20:55:47 remm Exp $
+ * $Revision: 1.12 $
+ * $Date: 2002/03/14 20:55:47 $
*
* ====================================================================
*
@@ -99,7 +99,7 @@
* Filesystem Directory Context implementation helper class.
*
* @author Remy Maucherat
- * @version $Revision: 1.11 $ $Date: 2002/02/27 19:06:35 $
+ * @version $Revision: 1.12 $ $Date: 2002/03/14 20:55:47 $
*/
public class FileDirContext extends BaseDirContext {
@@ -186,7 +186,7 @@
if (!base.exists() || !base.isDirectory() || !base.canRead())
throw new IllegalArgumentException
(sm.getString("fileResources.base", docBase));
- this.absoluteBase = normalize(base.getAbsolutePath());
+ this.absoluteBase = base.getAbsolutePath();
super.setDocBase(docBase);
}
@@ -854,28 +854,38 @@
*/
protected File file(String name) {
+/*
name = normalize(name);
if (name == null)
return (null);
if (File.separatorChar == '\\')
name = name.replace('/', File.separatorChar);
+*/
File file = new File(base, name);
if (file.exists() && file.canRead()) {
+
+ // Check that this file belongs to our root path
+ String canPath = null;
+ try {
+ canPath = file.getCanonicalPath();
+ } catch (IOException e) {
+ }
+ if (canPath == null)
+ return null;
+
+ if (!canPath.startsWith(absoluteBase))
+ return null;
+
// Windows only check
if ((caseSensitive) && (File.separatorChar == '\\')) {
String fileAbsPath = file.getAbsolutePath();
if (fileAbsPath.endsWith("."))
fileAbsPath = fileAbsPath + "/";
String absPath = normalize(fileAbsPath);
- String canPath = null;
- try {
- canPath = file.getCanonicalPath();
- if (canPath != null)
- canPath = normalize(canPath);
- } catch (IOException e) {
- }
+ if (canPath != null)
+ canPath = normalize(canPath);
if ((absoluteBase.length() < absPath.length())
&& (absoluteBase.length() < canPath.length())) {
absPath = absPath.substring(absoluteBase.length());
@@ -890,6 +900,7 @@
return null;
}
}
+
} else {
return null;
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>