-
Patch
-
Resolution: Obsolete
-
Minor
-
None
-
None
-
Low
Attached are minor candidate patches for jboss (against a CVS checkout of the sources on 2006 03 08) that ensure that resources are closed properly in some unlikely exceptional cases. These changse should not affect jboss functionality at all aside from ensuring that resources are closed in a few more cases.
This is hardly the most exciting sort of bugfix in the world, but jboss does seem to be concerned with leaks and being ironclad in these situations. The patches all have the general flavor of changing "open; work; close" to "try
{ open; work; }finally
{ close; }". It should take a knowledgeable dev at most a few minutes to eyeball them and accept or reject them.
I'm not sure how to attach the patch file, so I'm copying it here. My apologies if this is the wrong place for this sort of thing.
— jboss-20060308-orig/src/main/org/jboss/ejb/plugins/CMPInMemoryPersistenceManager.java 2006-03-08 16:29:45.917109700 -0500
+++ jboss-20060308/src/main/org/jboss/ejb/plugins/CMPInMemoryPersistenceManager.java 2006-03-08 16:34:15.141058700 -0500
@@ -355,11 +355,12 @@
*/
public void loadEntity (EntityEnterpriseContext ctx)
{
+ java.io.ObjectInputStream in = null;
try
- in.close ();
}
catch (Exception e) { throw new EJBException ("Load failed", e); }+ finally
{ in.close(); } catch (Exception e) { } }
+ {
+ if (in != null) { try
+ }
}
/**
— jboss-20060308-orig/src/main/org/jboss/invocation/http/interfaces/Util.java 2006-03-08 16:29:47.899706700 -0500
+++ jboss-20060308/src/main/org/jboss/invocation/http/interfaces/Util.java 2006-03-08 17:32:40.259780600 -0500
@@ -158,7 +158,9 @@
conn.setRequestProperty("ContentType", REQUEST_CONTENT_TYPE);
conn.setRequestMethod("POST");
OutputStream os = conn.getOutputStream();
+ ObjectInputStream ois = null;
ObjectOutputStream oos = new ObjectOutputStream(os);
+ try {
try
{ oos.writeObject(mi); @@ -173,12 +175,14 @@ // Get the response MarshalledValue object InputStream is = conn.getInputStream(); - ObjectInputStream ois = new ObjectInputStream(is); + ois = new ObjectInputStream(is); MarshalledValue mv = (MarshalledValue) ois.readObject(); // A hack for jsse connection pooling (see patch ). ois.read(); - ois.close(); - oos.close(); + } finally {
+ if (ois != null) { try { ois.close(); } catch (Exception e) { } }
+ if (oos != null) { try { oos.close(); } catch (Exception e) { } }
+ }
// If the encoded value is an exception throw it
Object value = mv.get();
— jboss-20060308-orig/src/main/org/jboss/invocation/MarshalledValue.java 2006-03-08 16:29:48.008983700 -0500
+++ jboss-20060308/src/main/org/jboss/invocation/MarshalledValue.java 2006-03-08 17:30:01.198298600 -0500
@@ -89,9 +89,12 @@
ByteArrayInputStream bais = new ByteArrayInputStream(serializedForm);
MarshalledValueInputStream mvis = new MarshalledValueInputStream(bais);
+ try { Object retValue = mvis.readObject(); - mvis.close(); return retValue; + } finally { + mvis.close(); + }
}
public byte[] toByteArray()
— jboss-20060308-orig/src/main/org/jboss/invocation/pooled/interfaces/PooledMarshalledValue.java 2006-03-08 16:29:48.055816700 -0500
+++ jboss-20060308/src/main/org/jboss/invocation/pooled/interfaces/PooledMarshalledValue.java 2006-03-08 17:34:20.946787700 -0500
@@ -90,9 +90,12 @@
ByteArrayInputStream bais = new ByteArrayInputStream(serializedForm);
ObjectInputStream mvis = new OptimizedObjectInputStream(bais);
+ try { Object retValue = mvis.readObject();- mvis.close(); return retValue;+ } finally {
+ try { mvis.close(); } catch (Exception e) { }
+ }
}
public byte[] toByteArray()
— jboss-20060308-orig/src/main/org/jboss/naming/HttpNamingContextFactory.java 2006-03-08 16:29:48.914421700 -0500
+++ jboss-20060308/src/main/org/jboss/naming/HttpNamingContextFactory.java 2006-03-08 17:35:39.213414500 -0500
@@ -132,8 +132,12 @@
InputStream is = conn.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
- MarshalledValue mv = (MarshalledValue) ois.readObject();
- ois.close();
+ MarshalledValue mv = null;
+ try { + mv = (MarshalledValue) ois.readObject(); + } finally {
+ try { ois.close(); } catch (Exception e) { }
+ }
Object obj = mv.get();
if( (obj instanceof Naming) == false )
— jboss-20060308-orig/src/main/org/jboss/web/AbstractWebContainer.java 2006-03-08 16:29:49.413973700 -0500
+++ jboss-20060308/src/main/org/jboss/web/AbstractWebContainer.java 2006-03-08 17:37:40.449341300 -0500
@@ -322,8 +322,11 @@
throw new DeploymentException("Was unable to mkdir: "+expWarFile);
log.debug("Unpacking war to: "+expWarFile);
FileInputStream fis = new FileInputStream(warFile);
+ try { JarUtils.unjar(fis, expWarFile); - fis.close(); + } finally {
+ try { fis.close(); } catch (Exception e) { }
+ }
log.debug("Replaced war with unpacked contents");
if (warFile.delete() == false)
log.debug("Was unable to delete war file");
@@ -416,6 +419,7 @@
FileInputStream fis = new FileInputStream(warFile);
JarInputStream jin = new JarInputStream(fis);
+ try {
ZipEntry entry = jin.getNextEntry();
while (entry != null)
{ @@ -426,8 +430,9 @@ }
entry = jin.getNextEntry();
}
- jin.close();
-
+ } finally {
+ try { jin.close(); } catch (Exception e) { }
+ }
URL[] urlArr = new URL[urlList.size()];
urlList.toArray(urlArr);
di.annotationsCl = new URLClassLoader(urlArr, di.ucl);
@@ -706,6 +711,7 @@
// First check for a WEB-INF/web.xml and a WEB-INF/jboss-web.xml
InputStream warIS = warURL.openStream();
java.util.zip.ZipInputStream zipIS = new java.util.zip.ZipInputStream(warIS);
+ try { java.util.zip.ZipEntry entry; byte[] buffer = new byte[512]; int bytes; @@ -730,7 +736,9 @@ jbossWebIS = new ByteArrayInputStream(baos.toByteArray()); }
}
- zipIS.close();
+ } finally {
+ try { zipIS.close(); } catch (Exception e) { }
+ }
}
XmlFileLoader xmlLoader = new XmlFileLoader();
— jboss-20060308-orig/src/main/org/jboss/web/WebServer.java 2006-03-08 16:29:49.445195700 -0500
+++ jboss-20060308/src/main/org/jboss/web/WebServer.java 2006-03-08 17:38:28.403080100 -0500
@@ -1,4 +1,4 @@
-/*
+/* } catch (Exception e) { }
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
@@ -521,6 +521,7 @@
protected byte[] getBytes(URL url) throws IOException
{
InputStream in = new BufferedInputStream(url.openStream());
+ try {
log.debug("Retrieving " + url);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] tmp = new byte[1024];
@@ -529,8 +530,10 @@
{ out.write(tmp, 0, bytes); }
- in.close();
return out.toByteArray();
+ } finally {
+ try { in.close(); }catch (Exception e) { }
+ }
}
/**
— jboss-20060308-orig/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCDB2IdentityValLocalCreateCommand.java 2006-03-08 16:29:45.323891700 -0500
+++ jboss-20060308/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCDB2IdentityValLocalCreateCommand.java 2006-03-08 17:19:47.443491800 -0500
@@ -44,8 +44,9 @@
protected int executeInsert(int paramIndex, PreparedStatement ps, EntityEnterpriseContext ctx ) throws SQLException {
int rows = ps.executeUpdate();
ResultSet results = null;
+ Connection conn = null;
try {
- Connection conn = ps.getConnection();
+ conn = ps.getConnection();
results = conn.prepareStatement( SQL ).executeQuery();
if( !results.next() ) { throw new EJBException( "identity_val_local() returned an empty ResultSet" ); @@ -58,6 +59,7 @@ throw new EJBException( "Error extracting identity_val_local()", e ); }finally
{ JDBCUtil.safeClose( results ); + JDBCUtil.safeClose(con); }return rows;
}-
- jboss-20060308-orig/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCPostgreSQLCreateCommand.java 2006-03-08 16:29:45.355113700 -0500
+++ jboss-20060308/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCPostgreSQLCreateCommand.java 2006-03-08 17:22:01.854042800 -0500
@@ -74,11 +74,12 @@
- jboss-20060308-orig/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCPostgreSQLCreateCommand.java 2006-03-08 16:29:45.355113700 -0500
-
Statement s = null;
ResultSet rs = null;
+ Connection c = null;
try {
if (trace)
- Connection c = ps.getConnection();
+ c = ps.getConnection();
s = c.createStatement();
rs = s.executeQuery(sequenceSQL);
if (!rs.next()) { @@ -93,6 +94,7 @@ }finally
{ JDBCUtil.safeClose(rs); JDBCUtil.safeClose(s); + JDBCUtil.safeClose(c); }
return rows;
— jboss-20060308-orig/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCSQLServerCreateCommand.java 2006-03-08 16:29:45.355113700 -0500
+++ jboss-20060308/src/main/org/jboss/ejb/plugins/cmp/jdbc/keygen/JDBCSQLServerCreateCommand.java 2006-03-08 17:23:29.513540100 -0500
@@ -61,10 +61,10 @@
protected int executeInsert(int index, PreparedStatement ps, EntityEnterpriseContext ctx) throws SQLException
{
- ps.execute();
ResultSet rs = null;
try
{
+ ps.execute();
int rows = ps.getUpdateCount();
if(rows != 1)Unknown macro: {@@ -95,6 +95,7 @@ finally { JDBCUtil.safeClose(rs); + JDBCUtil.safeClose(ps); } }}