This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/11.0.x by this push:
new c3fffb051e Improve detection of case sensitive vs case insensitive
file systems
c3fffb051e is described below
commit c3fffb051eb5b54aa8c1302d47151834f3f61370
Author: Mark Thomas <[email protected]>
AuthorDate: Tue Feb 18 09:46:45 2025 +0000
Improve detection of case sensitive vs case insensitive file systems
---
.../catalina/webresources/DirResourceSet.java | 42 +++++++++++++----
webapps/docs/changelog.xml | 53 ++--------------------
2 files changed, 38 insertions(+), 57 deletions(-)
diff --git a/java/org/apache/catalina/webresources/DirResourceSet.java
b/java/org/apache/catalina/webresources/DirResourceSet.java
index 4f39e87378..dbbc126c41 100644
--- a/java/org/apache/catalina/webresources/DirResourceSet.java
+++ b/java/org/apache/catalina/webresources/DirResourceSet.java
@@ -369,22 +369,48 @@ public class DirResourceSet extends
AbstractFileResourceSet implements WebResour
/*
* Determines if this ResourceSet is based on a case sensitive file system
or not.
+ *
+ * File systems are usually case sensitive or not. Windows, via the
command 'fsutil.exe file setCaseSensitiveInfo
+ * <path> enable', may be case sensitive in some directories and case
insensitive in others.
+ *
+ * If this method incorrectly determines that the DirResourceSet is case
sensitive, the file locking mechanism that
+ * ensures write operations are performed atomically will not operate
correctly. If this method incorrectly
+ * determines that the DirResourceSet is case insensitive, there is a
small performance penalty for writes.
+ *
+ * Given the above, this method only reports the file system as case
sensitive if no indication of case
+ * insensitivity is detected. This does mean that Windows based
DirResourceSet instances will be reported as case
+ * insensitive even all of the directories in the DirResourceSet have been
configured as case sensitive.
*/
private boolean isCaseSensitive() {
try {
String canonicalPath = getFileBase().getCanonicalPath();
+ /*
+ * If any lower case characters are found in the canonical file
name formed by converting the test file name
+ * to upper case, the underlying file system must be, at least in
part, case insensitive.
+ */
File upper = new File(canonicalPath.toUpperCase(Locale.ENGLISH));
- if (!canonicalPath.equals(upper.getCanonicalPath())) {
- return true;
- }
- File lower = new File(canonicalPath.toLowerCase(Locale.ENGLISH));
- if (!canonicalPath.equals(lower.getCanonicalPath())) {
- return true;
+ String upperCanonicalPath = upper.getCanonicalPath();
+ char[] upperCharacters = upperCanonicalPath.toCharArray();
+ for (char c : upperCharacters) {
+ if (Character.isLowerCase(c)) {
+ return false;
+ }
}
+
/*
- * Both upper and lower case versions of the current fileBase have
the same canonical path so the file
- * system must be case insensitive.
+ * If any upper case characters are found in the canonical file
name formed by converting the test file name
+ * to lower case, the underlying file system must be, at least in
part, case insensitive.
*/
+ File lower = new File(canonicalPath.toLowerCase(Locale.ENGLISH));
+ String lowerCanonicalPath = lower.getCanonicalPath();
+ char[] lowerCharacters = lowerCanonicalPath.toCharArray();
+ for (char c : lowerCharacters) {
+ if (Character.isUpperCase(c)) {
+ return false;
+ }
+ }
+
+ return true;
} catch (IOException ioe) {
log.warn(sm.getString("dirResourceSet.isCaseSensitive.fail",
getFileBase().getAbsolutePath()), ioe);
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index c4a39bb95c..82e666d497 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -116,6 +116,10 @@
possible that cached 'not found' results could effectively hide lookup
results using the correct resource name. (markt)
</fix>
+ <fix>
+ Improve the mechanism for detecting whether a web application has been
+ deployed to a case sensitive or a case insensitive file system. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Other">
@@ -699,55 +703,6 @@
controlled via the new <code>notFoundClassResourceCacheSize</code> on
the StandardContext. (markt)
</fix>
- <fix>
- Stop after <code>INITIALIZED</code> state should be a noop since it is
- possible for subcomponents to be in <code>FAILED</code> after init.
- (remm)
- </fix>
- <fix>
- Fix incorrect web resource cache size calculations when there are
- concurrent <code>PUT</code> and <code>DELETE</code> requests for the
- same resource. (markt)
- </fix>
- <add>
- Add debug logging for the web resource cache so the current size can be
- tracked as resources are added and removed. (markt)
- </add>
- <update>
- Replace legacy WebDAV <code>opaquelocktoken:</code> scheme for lock
- tokens with <code>urn:uuid:</code> as recommended by RFC 4918, and
- remove <code>secret</code> init parameter. (remm)
- </update>
- <fix>
- Concurrent reads and writes (e.g. <code>GET</code> and <code>PUT</code>
- / <code>DELETE</code>) for the same path caused corruption of the
- <code>FileResource</code> where some of the fields were set as if the
- file exists and some were set as if it does not. This resulted in
- inconsistent metadata. (markt)
- </fix>
- <fix>
- <bug>69415</bug>: Ensure that the <code>ExpiresFilter</code> only sets
- cache headers on <code>GET</code> and <code>HEAD</code> requests. Also
- skip requests where the application has set <code>Cache-Control:
- no-store</code>. (markt)
- </fix>
- <fix>
- <bug>69419</bug>: Improve the performance of
- <code>ServletRequest.getAttribute()</code> when there are multiple
- levels of nested includes. Based on a patch provided by John
- Engebretson. (markt)
- </fix>
- <fix>
- <bug>69426</bug>: Restore providing a value (rather than null) for
- <code>Class.getProtectionDomain().getCodeSource().getLocation()</code>
- as a number of libraries and JRE features depend on this being non-null
- even when a SecurityManager is not is use. (markt)
- </fix>
- <add>
- All applications to send an early hints informational response by
- calling <code>HttpServletResponse.sendError()</code> with a status code
- of 103. (schultz)
- </add>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]