On 09/01/2025 15:29, r...@apache.org wrote:
This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new 80ae858419 Avoid caching bogus 0 content length
80ae858419 is described below
commit 80ae858419d816eb82a2377c7db0e34aef52c8c1
Author: remm <r...@apache.org>
AuthorDate: Thu Jan 9 16:29:24 2025 +0100
Avoid caching bogus 0 content length
This breaks the previous fix for cache size corruption.
The size for the cache entry needs to be consistent (even if it isn't
correct).
Mark
When using getResources, the actual webResource is not retrieved. If
calling getContentLength, it would cache 0 as the content length.
Also initialize the cached resource a bit more to avoid a very likely
concurrent eviction if somehow the cache is full.
Possible fix for 69527.
---
java/org/apache/catalina/webresources/CachedResource.java | 10 +++++-----
webapps/docs/changelog.xml | 4 ++++
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/java/org/apache/catalina/webresources/CachedResource.java
b/java/org/apache/catalina/webresources/CachedResource.java
index 31c13ba7a1..834588e547 100644
--- a/java/org/apache/catalina/webresources/CachedResource.java
+++ b/java/org/apache/catalina/webresources/CachedResource.java
@@ -85,6 +85,7 @@ public class CachedResource implements WebResource {
this.root = root;
this.webAppPath = path;
this.ttl = ttl;
+ nextCheck = ttl + System.currentTimeMillis();
this.objectMaxSizeBytes = objectMaxSizeBytes;
this.usesClassLoaderResources = usesClassLoaderResources;
}
@@ -247,6 +248,9 @@ public class CachedResource implements WebResource {
@Override
public long getContentLength() {
+ if (webResource == null) {
+ return Long.valueOf(0);
+ }
/*
* Cache the content length for two reasons.
*
@@ -263,11 +267,7 @@ public class CachedResource implements WebResource {
if (cachedContentLength == null) {
synchronized (cachedContentLengthLock) {
if (cachedContentLength == null) {
- if (webResource == null) {
- cachedContentLength = Long.valueOf(0);
- } else {
- cachedContentLength =
Long.valueOf(webResource.getContentLength());
- }
+ cachedContentLength =
Long.valueOf(webResource.getContentLength());
}
}
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index ab16f2677b..c9276112e4 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -150,6 +150,10 @@
attribute value will also be used by the default and WebDAV Servlets.
(remm)
</update>
+ <fix>
+ <bug>69527</bug>: Avoid rare cases where a cached resource could be set
+ with 0 content length, or could be evicted immediately. (remm)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org