This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push: new ce6a3c9 Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63872 symlinked war ce6a3c9 is described below commit ce6a3c91402ea088fb2ce64ee34e4b92f3dbfa5f Author: Mark Thomas <ma...@apache.org> AuthorDate: Fri Nov 1 20:17:49 2019 +0100 Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63872 symlinked war Fix some edge cases where the docBase was not being set using a canonical path which in turn meant resource URLs were not being constructed as expected. --- .../org/apache/catalina/startup/ContextConfig.java | 71 ++++++++++++---------- webapps/docs/changelog.xml | 7 ++- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java index 0cc1b6a..39ca690 100644 --- a/java/org/apache/catalina/startup/ContextConfig.java +++ b/java/org/apache/catalina/startup/ContextConfig.java @@ -570,25 +570,29 @@ public class ContextConfig implements LifecycleListener { Host host = (Host) context.getParent(); File appBase = host.getAppBaseFile(); - String docBase = context.getDocBase(); - if (docBase == null) { + // This could be blank, relative, absolute or canonical + String docBaseConfigured = context.getDocBase(); + // If there is no explicit docBase, derive it from the path and version + if (docBaseConfigured == null) { // Trying to guess the docBase according to the path String path = context.getPath(); if (path == null) { return; } ContextName cn = new ContextName(path, context.getWebappVersion()); - docBase = cn.getBaseName(); + docBaseConfigured = cn.getBaseName(); } - File file = new File(docBase); - if (!file.isAbsolute()) { - docBase = (new File(appBase, docBase)).getCanonicalPath(); + // Obtain the absolute docBase in String and File form + String docBaseAbsolute; + File docBaseConfiguredFile = new File(docBaseConfigured); + if (!docBaseConfiguredFile.isAbsolute()) { + docBaseAbsolute = (new File(appBase, docBaseConfigured)).getAbsolutePath(); } else { - docBase = file.getCanonicalPath(); + docBaseAbsolute = docBaseConfiguredFile.getAbsolutePath(); } - file = new File(docBase); - String origDocBase = docBase; + File docBaseAbsoluteFile = new File(docBaseAbsolute); + String originalDocBase = docBaseAbsolute; ContextName cn = new ContextName(context.getPath(), context.getWebappVersion()); String pathName = cn.getBaseName(); @@ -601,28 +605,29 @@ public class ContextConfig implements LifecycleListener { } } - boolean docBaseInAppBase = docBase.startsWith(appBase.getPath() + File.separatorChar); - - if (docBase.toLowerCase(Locale.ENGLISH).endsWith(".war") && !file.isDirectory()) { - URL war = UriUtil.buildJarUrl(new File(docBase)); + // At this point we need to determine if we have a WAR file in the + // appBase that needs to be expanded. Therefore we consider the absolute + // docBase NOT the canonical docBase. This is because some users symlink + // WAR files into the appBase and we want this to work correctly. + boolean docBaseAbsoluteInAppBase = docBaseAbsolute.startsWith(appBase.getPath() + File.separatorChar); + if (docBaseAbsolute.toLowerCase(Locale.ENGLISH).endsWith(".war") && !docBaseAbsoluteFile.isDirectory()) { + URL war = UriUtil.buildJarUrl(docBaseAbsoluteFile); if (unpackWARs) { - docBase = ExpandWar.expand(host, war, pathName); - file = new File(docBase); - docBase = file.getCanonicalPath(); + docBaseAbsolute = ExpandWar.expand(host, war, pathName); + docBaseAbsoluteFile = new File(docBaseAbsolute); if (context instanceof StandardContext) { - ((StandardContext) context).setOriginalDocBase(origDocBase); + ((StandardContext) context).setOriginalDocBase(originalDocBase); } } else { ExpandWar.validate(host, war, pathName); } } else { - File docDir = new File(docBase); - File warFile = new File(docBase + ".war"); + File docBaseAbsoluteFileWar = new File(docBaseAbsolute + ".war"); URL war = null; - if (warFile.exists() && docBaseInAppBase) { - war = UriUtil.buildJarUrl(warFile); + if (docBaseAbsoluteFileWar.exists() && docBaseAbsoluteInAppBase) { + war = UriUtil.buildJarUrl(docBaseAbsoluteFileWar); } - if (docDir.exists()) { + if (docBaseAbsoluteFile.exists()) { if (war != null && unpackWARs) { // Check if WAR needs to be re-expanded (e.g. if it has // changed). Note: HostConfig.deployWar() takes care of @@ -633,31 +638,33 @@ public class ContextConfig implements LifecycleListener { } else { if (war != null) { if (unpackWARs) { - docBase = ExpandWar.expand(host, war, pathName); - file = new File(docBase); - docBase = file.getCanonicalPath(); + docBaseAbsolute = ExpandWar.expand(host, war, pathName); + docBaseAbsoluteFile = new File(docBaseAbsolute); } else { - docBase = warFile.getCanonicalPath(); + docBaseAbsolute = docBaseAbsoluteFileWar.getAbsolutePath(); + docBaseAbsoluteFile = docBaseAbsoluteFileWar; ExpandWar.validate(host, war, pathName); } } if (context instanceof StandardContext) { - ((StandardContext) context).setOriginalDocBase(origDocBase); + ((StandardContext) context).setOriginalDocBase(originalDocBase); } } } - // Re-calculate now docBase is a canonical path - docBaseInAppBase = docBase.startsWith(appBase.getPath() + File.separatorChar); + String docBaseCanonical = docBaseAbsoluteFile.getCanonicalPath(); - if (docBaseInAppBase) { - docBase = docBase.substring(appBase.getPath().length()); + // Re-calculate now docBase is a canonical path + boolean docBaseCanonicalInAppBase = docBaseCanonical.startsWith(appBase.getPath() + File.separatorChar); + String docBase; + if (docBaseCanonicalInAppBase) { + docBase = docBaseCanonical.substring(appBase.getPath().length()); docBase = docBase.replace(File.separatorChar, '/'); if (docBase.startsWith("/")) { docBase = docBase.substring(1); } } else { - docBase = docBase.replace(File.separatorChar, '/'); + docBase = docBaseCanonical.replace(File.separatorChar, '/'); } context.setDocBase(docBase); diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index ee822dc..ec97e0b 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -52,9 +52,14 @@ occurs on stop. (remm) </fix> <fix> - <bug>63836</bug> Ensure that references to the Host object are cleared + <bug>63836</bug>: Ensure that references to the Host object are cleared once the Host instance is destroyed. (markt) </fix> + <fix> + <bug>63872</bug>: Fix some edge cases where the docBase was not being + set using a canonical path which in turn meant resource URLs were not + being constructed as expected. (markt) + </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