You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/03/04 23:08:26 UTC
svn commit: r1664163 -
/tomcat/trunk/java/org/apache/catalina/startup/ExpandWar.java
Author: markt
Date: Wed Mar 4 22:08:26 2015
New Revision: 1664163
URL: http://svn.apache.org/r1664163
Log:
Really fix the file leak this time by getting - and closing - the right InputStream.
Modified:
tomcat/trunk/java/org/apache/catalina/startup/ExpandWar.java
Modified: tomcat/trunk/java/org/apache/catalina/startup/ExpandWar.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ExpandWar.java?rev=1664163&r1=1664162&r2=1664163&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ExpandWar.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ExpandWar.java Wed Mar 4 22:08:26 2015
@@ -24,6 +24,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
+import java.net.URLConnection;
import java.nio.channels.FileChannel;
import java.util.Enumeration;
import java.util.jar.JarEntry;
@@ -72,57 +73,62 @@ public class ExpandWar {
public static String expand(Host host, URL war, String pathname)
throws IOException {
- // Open the connection to the WAR. There is no explicit close method.
- // You have to get the InputStream and close that.
+ /* Obtaining the last modified time opens an InputStream and there is no
+ * explicit close method. We have to obtain and then close the
+ * InputStream to avoid a file leak and the associated locked file.
+ */
JarURLConnection juc = (JarURLConnection) war.openConnection();
juc.setUseCaches(false);
+ URL jarFileUrl = juc.getJarFileURL();
+ URLConnection jfuc = jarFileUrl.openConnection();
- // Set up the variables used in the finally block of the following try
boolean success = false;
File docBase = new File(host.getAppBaseFile(), pathname);
File warTracker = new File(host.getAppBaseFile(), pathname + Constants.WarTracker);
+ long warLastModified = -1;
- try (JarFile jarFile = juc.getJarFile();
- InputStream is = juc.getInputStream()) {
-
+ try (InputStream is = jfuc.getInputStream()) {
// Get the last modified time for the WAR
- long warLastModified = juc.getLastModified();
+ warLastModified = jfuc.getLastModified();
+ }
- // Check to see of the WAR has been expanded previously
- if (docBase.exists()) {
- // A WAR was expanded. Tomcat will have set the last modified
- // time of the expanded directory to the last modified time of
- // the WAR so changes to the WAR while Tomcat is stopped can be
- // detected
- if (!warTracker.exists() || warTracker.lastModified() == warLastModified) {
- // No (detectable) changes to the WAR
- success = true;
- return (docBase.getAbsolutePath());
- }
-
- // WAR must have been modified. Remove expanded directory.
- log.info(sm.getString("expandWar.deleteOld", docBase));
- if (!delete(docBase)) {
- throw new IOException(sm.getString("expandWar.deleteFailed", docBase));
- }
+ // Check to see of the WAR has been expanded previously
+ if (docBase.exists()) {
+ // A WAR was expanded. Tomcat will have set the last modified
+ // time of the expanded directory to the last modified time of
+ // the WAR so changes to the WAR while Tomcat is stopped can be
+ // detected
+ if (!warTracker.exists() || warTracker.lastModified() == warLastModified) {
+ // No (detectable) changes to the WAR
+ success = true;
+ return (docBase.getAbsolutePath());
}
- // Create the new document base directory
- if(!docBase.mkdir() && !docBase.isDirectory()) {
- throw new IOException(sm.getString("expandWar.createFailed", docBase));
+ // WAR must have been modified. Remove expanded directory.
+ log.info(sm.getString("expandWar.deleteOld", docBase));
+ if (!delete(docBase)) {
+ throw new IOException(sm.getString("expandWar.deleteFailed", docBase));
}
+ }
- // Expand the WAR into the new document base directory
- String canonicalDocBasePrefix = docBase.getCanonicalPath();
- if (!canonicalDocBasePrefix.endsWith(File.separator)) {
- canonicalDocBasePrefix += File.separator;
- }
+ // Create the new document base directory
+ if(!docBase.mkdir() && !docBase.isDirectory()) {
+ throw new IOException(sm.getString("expandWar.createFailed", docBase));
+ }
+
+ // Expand the WAR into the new document base directory
+ String canonicalDocBasePrefix = docBase.getCanonicalPath();
+ if (!canonicalDocBasePrefix.endsWith(File.separator)) {
+ canonicalDocBasePrefix += File.separator;
+ }
+
+ // Creating war tracker parent (normally META-INF)
+ File warTrackerParent = warTracker.getParentFile();
+ if (!warTrackerParent.isDirectory() && !warTrackerParent.mkdirs()) {
+ throw new IOException(sm.getString("expandWar.createFailed", warTrackerParent.getAbsolutePath()));
+ }
- // Creating war tracker parent (normally META-INF)
- File warTrackerParent = warTracker.getParentFile();
- if (!warTrackerParent.isDirectory() && !warTrackerParent.mkdirs()) {
- throw new IOException(sm.getString("expandWar.createFailed", warTrackerParent.getAbsolutePath()));
- }
+ try (JarFile jarFile = juc.getJarFile()) {
Enumeration<JarEntry> jarEntries = jarFile.entries();
while (jarEntries.hasMoreElements()) {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org