Author: tn
Date: Sat Nov 10 18:20:55 2012
New Revision: 1407867

URL: http://svn.apache.org/viewvc?rev=1407867&view=rev
Log:
[EMAIL-116] Prevent external modification of internal array in 
DataSourceCompositeResolver.

Modified:
    commons/proper/email/trunk/src/changes/changes.xml
    
commons/proper/email/trunk/src/java/org/apache/commons/mail/resolver/DataSourceCompositeResolver.java
    
commons/proper/email/trunk/src/test/org/apache/commons/mail/resolver/DataSourceCompositeResolverTest.java

Modified: commons/proper/email/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/email/trunk/src/changes/changes.xml?rev=1407867&r1=1407866&r2=1407867&view=diff
==============================================================================
--- commons/proper/email/trunk/src/changes/changes.xml (original)
+++ commons/proper/email/trunk/src/changes/changes.xml Sat Nov 10 18:20:55 2012
@@ -23,6 +23,9 @@
 
   <body>
     <release version="1.3" date="as in SVN">
+      <action dev="tn" type="fix" issue="EMAIL-116" date="2012-11-10" 
due-to="sebb">
+        Prevent external modification of internal array in 
DataSourceCompositeResolver.
+      </action>
       <action dev="tn" type="fix" issue="EMAIL-120" date="2012-11-07" 
due-to="Mike Bell">
         Close temporary input stream in MultiPartEmail#attach(DataSource, 
String, String)
         to prevent locking of file resources on windows systems.

Modified: 
commons/proper/email/trunk/src/java/org/apache/commons/mail/resolver/DataSourceCompositeResolver.java
URL: 
http://svn.apache.org/viewvc/commons/proper/email/trunk/src/java/org/apache/commons/mail/resolver/DataSourceCompositeResolver.java?rev=1407867&r1=1407866&r2=1407867&view=diff
==============================================================================
--- 
commons/proper/email/trunk/src/java/org/apache/commons/mail/resolver/DataSourceCompositeResolver.java
 (original)
+++ 
commons/proper/email/trunk/src/java/org/apache/commons/mail/resolver/DataSourceCompositeResolver.java
 Sat Nov 10 18:20:55 2012
@@ -63,7 +63,10 @@ public class DataSourceCompositeResolver
      */
     public DataSourceResolver[] getDataSourceResolvers()
     {
-        return dataSourceResolvers;
+        // clone the internal array to prevent external modification (see 
EMAIL-116)
+        final DataSourceResolver[] resolvers = new 
DataSourceResolver[dataSourceResolvers.length];
+        System.arraycopy(dataSourceResolvers, 0, resolvers, 0, 
dataSourceResolvers.length);
+        return resolvers;
     }
 
     public DataSource resolve(String resourceLocation) throws IOException

Modified: 
commons/proper/email/trunk/src/test/org/apache/commons/mail/resolver/DataSourceCompositeResolverTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/org/apache/commons/mail/resolver/DataSourceCompositeResolverTest.java?rev=1407867&r1=1407866&r2=1407867&view=diff
==============================================================================
--- 
commons/proper/email/trunk/src/test/org/apache/commons/mail/resolver/DataSourceCompositeResolverTest.java
 (original)
+++ 
commons/proper/email/trunk/src/test/org/apache/commons/mail/resolver/DataSourceCompositeResolverTest.java
 Sat Nov 10 18:20:55 2012
@@ -71,6 +71,24 @@ public class DataSourceCompositeResolver
         }
     }
 
+    public void testExternalModification() throws Exception
+    {
+        DataSourceResolver urlResolver = new DataSourceUrlResolver(new 
URL("http://www.apache.org";), false);
+        DataSourceResolver classPathResolver = new 
DataSourceClassPathResolver("/images", false);
+        DataSourceResolver[] dataSourceResolvers = new DataSourceResolver[] { 
urlResolver, classPathResolver };
+        DataSourceCompositeResolver dataSourceResolver = new 
DataSourceCompositeResolver(dataSourceResolvers, true);
+
+        DataSourceResolver[] arr = dataSourceResolver.getDataSourceResolvers();
+        
+        // modify an element in the returned array
+        arr[0] = null;
+        
+        DataSourceResolver[] arr2 = 
dataSourceResolver.getDataSourceResolvers();
+        
+        // assert that the external modification is not propagated to the 
internal array
+        assertNotNull(arr2[0]);        
+    }
+
     private byte[] toByteArray(DataSource dataSource) throws IOException
     {
         if(dataSource != null)


Reply via email to