This is an automated email from the git hooks/post-receive script.

nomadium pushed a commit to branch master
in repository libspring-java.

commit c5fd2efaee0283b8e76b6179bf048c3583d39ec3
Author: Miguel Landaeta <[email protected]>
Date:   Mon Mar 24 14:39:04 2014 -0300

    Work in progress for 3.0.6.RELEASE-13
---
 debian/changelog                   |   8 +
 debian/patches/CVE-2014-0054.patch | 742 +++++++++++++++++++++++++++++++++++++
 debian/patches/CVE-2014-1904.patch |  80 ++++
 debian/patches/series              |   2 +
 4 files changed, 832 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 2fb893b..40ad7e8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+libspring-java (3.0.6.RELEASE-13) UNRELEASED; urgency=high
+
+  TO-DO: the patches doesn't apply cleanly.
+
+  * Fix CVE-2014-0054 and CVE-2014-1904. (Closes: #735420).
+
+ -- Miguel Landaeta <[email protected]>  Mon, 24 Mar 2014 14:10:52 -0300
+
 libspring-java (3.0.6.RELEASE-12) unstable; urgency=low
 
   * Fix an FTBFS bug due to a packaging change in
diff --git a/debian/patches/CVE-2014-0054.patch 
b/debian/patches/CVE-2014-0054.patch
new file mode 100644
index 0000000..4ee51a7
--- /dev/null
+++ b/debian/patches/CVE-2014-0054.patch
@@ -0,0 +1,742 @@
+From: Miguel Landaeta <[email protected]>
+Date: Mon, 24 Mar 2014 14:10:00 -0300
+Subject: CVE-2013-6429
+
+Bug: http://bugs.debian.org/741604
+
+diff --git 
a/spring-oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java 
b/spring-oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java
+index adc403c..4189c0e 100644
+./projects/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java
+--- 
a/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java
++++ 
b/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java
+@@ -162,6 +162,11 @@ public class CastorMarshaller extends AbstractMarshaller 
implements Initializing
+               this.encoding = encoding;
+       }
+ 
++      @Override
++      protected String getDefaultEncoding() {
++              return this.encoding;
++      }
++
+       /**
+        * Set the locations of the Castor XML mapping files.
+        */
+diff --git 
a/spring-oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java 
b/spring-oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java
+index 0837695..93fa1a4 100644
+--- 
a/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java
++++ 
b/projects/org.springframework.oxmsrc/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java
+@@ -400,6 +400,13 @@ public class Jaxb2Marshaller implements MimeMarshaller, 
MimeUnmarshaller, Generi
+               this.processExternalEntities = processExternalEntities;
+       }
+ 
++      /**
++       * @return the configured value for whether XML external entities are 
allowed.
++       */
++      public boolean isProcessExternalEntities() {
++              return this.processExternalEntities;
++      }
++
+       @Override
+       public void setBeanClassLoader(ClassLoader classLoader) {
+               this.beanClassLoader = classLoader;
+diff --git 
a/spring-oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java 
b/spring-oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java
+index b184560..715ef4e 100644
+--- 
a/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java
++++ 
b/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2013 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -28,6 +28,7 @@ import javax.xml.stream.XMLEventWriter;
+ import javax.xml.stream.XMLStreamException;
+ import javax.xml.stream.XMLStreamReader;
+ import javax.xml.stream.XMLStreamWriter;
++import javax.xml.transform.OutputKeys;
+ import javax.xml.transform.Result;
+ import javax.xml.transform.Source;
+ import javax.xml.transform.Transformer;
+@@ -149,6 +150,11 @@ public class JibxMarshaller extends AbstractMarshaller 
implements InitializingBe
+               this.encoding = encoding;
+       }
+ 
++      @Override
++      protected String getDefaultEncoding() {
++              return this.encoding;
++      }
++
+       /**
+        * Set the document standalone flag for marshalling. By default, this 
flag is not present.
+        */
+@@ -338,7 +344,7 @@ public class JibxMarshaller extends AbstractMarshaller 
implements InitializingBe
+               }
+               catch (TransformerException ex) {
+                       throw new MarshallingFailureException(
+-                                      "Could not transform to [" + 
ClassUtils.getShortName(result.getClass()) + "]");
++                                      "Could not transform to [" + 
ClassUtils.getShortName(result.getClass()) + "]", ex);
+               }
+ 
+       }
+@@ -398,7 +404,7 @@ public class JibxMarshaller extends AbstractMarshaller 
implements InitializingBe
+       @Override
+       protected Object unmarshalDomNode(Node node) throws XmlMappingException 
{
+               try {
+-                      return transformAndUnmarshal(new DOMSource(node));
++                      return transformAndUnmarshal(new DOMSource(node), null);
+               }
+               catch (IOException ex) {
+                       throw new UnmarshallingFailureException("JiBX 
unmarshalling exception", ex);
+@@ -409,12 +415,15 @@ public class JibxMarshaller extends AbstractMarshaller 
implements InitializingBe
+       protected Object unmarshalSaxReader(XMLReader xmlReader, InputSource 
inputSource)
+                       throws XmlMappingException, IOException {
+ 
+-              return transformAndUnmarshal(new SAXSource(xmlReader, 
inputSource));
++              return transformAndUnmarshal(new SAXSource(xmlReader, 
inputSource), inputSource.getEncoding());
+       }
+ 
+-      private Object transformAndUnmarshal(Source source) throws IOException {
++      private Object transformAndUnmarshal(Source source, String encoding) 
throws IOException {
+               try {
+                       Transformer transformer = 
this.transformerFactory.newTransformer();
++                      if (encoding != null) {
++                              
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
++                      }
+                       ByteArrayOutputStream os = new ByteArrayOutputStream();
+                       transformer.transform(source, new StreamResult(os));
+                       ByteArrayInputStream is = new 
ByteArrayInputStream(os.toByteArray());
+@@ -422,7 +431,7 @@ public class JibxMarshaller extends AbstractMarshaller 
implements InitializingBe
+               }
+               catch (TransformerException ex) {
+                       throw new MarshallingFailureException(
+-                                      "Could not transform from [" + 
ClassUtils.getShortName(source.getClass()) + "]");
++                                      "Could not transform from [" + 
ClassUtils.getShortName(source.getClass()) + "]", ex);
+               }
+       }
+ 
+diff --git 
a/spring-oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java
 
b/spring-oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java
+index a118775..2df808e 100644
+--- 
a/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java
++++ 
b/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2013 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -73,6 +73,34 @@ public abstract class AbstractMarshaller implements 
Marshaller, Unmarshaller {
+ 
+       private final Object documentBuilderFactoryMonitor = new Object();
+ 
++      private boolean processExternalEntities = false;
++
++
++      /**
++       * Indicates whether external XML entities are processed when 
unmarshalling.
++       * <p>Default is {@code false}, meaning that external entities are not 
resolved.
++       * Note that processing of external entities will only be 
enabled/disabled when the
++       * {@code Source} passed to {@link #unmarshal(Source)} is a {@link 
SAXSource} or
++       * {@link StreamSource}. It has no effect for {@link DOMSource} or 
{@link StAXSource}
++       * instances.
++       */
++      public void setProcessExternalEntities(boolean processExternalEntities) 
{
++              this.processExternalEntities = processExternalEntities;
++      }
++
++      /**
++       * @return the configured value for whether XML external entities are 
allowed.
++       */
++      public boolean isProcessExternalEntities() {
++              return this.processExternalEntities;
++      }
++
++      /**
++       * @return the default encoding to use for marshalling or unmarshalling 
from
++       *      a byte stream, or {@code null}.
++       */
++      abstract protected String getDefaultEncoding();
++
+ 
+       /**
+        * Marshals the object graph with the given root into the provided 
{@code javax.xml.transform.Result}.
+@@ -133,7 +161,7 @@ public abstract class AbstractMarshaller implements 
Marshaller, Unmarshaller {
+                       return unmarshalSaxSource((SAXSource) source);
+               }
+               else if (source instanceof StreamSource) {
+-                      return unmarshalStreamSource((StreamSource) source);
++                      return 
unmarshalStreamSourceNoExternalEntitities((StreamSource) source);
+               }
+               else {
+                       throw new IllegalArgumentException("Unknown Source 
type: " + source.getClass());
+@@ -175,7 +203,9 @@ public abstract class AbstractMarshaller implements 
Marshaller, Unmarshaller {
+        * @throws SAXException if thrown by JAXP methods
+        */
+       protected XMLReader createXmlReader() throws SAXException {
+-              return XMLReaderFactory.createXMLReader();
++              XMLReader xmlReader = XMLReaderFactory.createXMLReader();
++              
xmlReader.setFeature("http://xml.org/sax/features/external-general-entities";, 
isProcessExternalEntities());
++              return xmlReader;
+       }
+ 
+ 
+@@ -358,8 +388,42 @@ public abstract class AbstractMarshaller implements 
Marshaller, Unmarshaller {
+       }
+ 
+       /**
++       * Template method for handling {@code StreamSource}s with protection 
against
++       * the XML External Entity (XXE) processing vulnerability taking into 
account
++       * the value of the {@link #setProcessExternalEntities(boolean)} 
property.
++       * <p>
++       * The default implementation wraps the StreamSource as a SAXSource and 
delegates
++       * to {@link #unmarshalSaxSource(javax.xml.transform.sax.SAXSource)}.
++       *
++       * @param streamSource the {@code StreamSource}
++       * @return the object graph
++       * @throws IOException if an I/O exception occurs
++       * @throws XmlMappingException if the given source cannot be mapped to 
an object
++       *
++       * @see <a 
href="https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing">XML_External_Entity_(XXE)_Processing</a>
++       */
++      protected Object unmarshalStreamSourceNoExternalEntitities(StreamSource 
streamSource) throws XmlMappingException, IOException {
++              InputSource inputSource;
++              if (streamSource.getInputStream() != null) {
++                      inputSource = new 
InputSource(streamSource.getInputStream());
++                      inputSource.setEncoding(getDefaultEncoding());
++              }
++              else if (streamSource.getReader() != null) {
++                      inputSource = new InputSource(streamSource.getReader());
++              }
++              else {
++                      inputSource = new 
InputSource(streamSource.getSystemId());
++              }
++              return unmarshalSaxSource(new SAXSource(inputSource));
++      }
++
++      /**
+        * Template method for handling {@code StreamSource}s.
+        * <p>This implementation defers to {@code unmarshalInputStream} or 
{@code unmarshalReader}.
++       * <p>As of 3.2.8 and 4.0.2 this method is no longer invoked from
++       * {@link #unmarshal(javax.xml.transform.Source)}. The method invoked 
instead is
++       * {@link 
#unmarshalStreamSourceNoExternalEntitities(javax.xml.transform.stream.StreamSource)}.
++       *
+        * @param streamSource the {@code StreamSource}
+        * @return the object graph
+        * @throws IOException if an I/O exception occurs
+diff --git 
a/spring-oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java
 
b/spring-oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java
+index 1fd4940..b3bb5cf 100644
+--- 
a/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java
++++ 
b/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2012 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -113,6 +113,10 @@ public class XmlBeansMarshaller extends 
AbstractMarshaller {
+               return this.validating;
+       }
+ 
++      @Override
++      protected String getDefaultEncoding() {
++              return null;
++      }
+ 
+       /**
+        * This implementation returns true if the given class is an 
implementation of {@link XmlObject}.
+diff --git 
a/spring-oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java
 
b/spring-oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java
+index de42e5b..52c121e 100644
+--- 
a/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java
++++ 
b/projects/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java
+@@ -27,11 +27,9 @@ import java.lang.reflect.Constructor;
+ import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
+-import javax.xml.stream.XMLEventReader;
+-import javax.xml.stream.XMLEventWriter;
+-import javax.xml.stream.XMLStreamException;
+-import javax.xml.stream.XMLStreamReader;
+-import javax.xml.stream.XMLStreamWriter;
++import javax.xml.stream.*;
++import javax.xml.transform.stax.StAXSource;
++import javax.xml.transform.stream.StreamSource;
+ 
+ import com.thoughtworks.xstream.MarshallingStrategy;
+ import com.thoughtworks.xstream.XStream;
+@@ -342,6 +340,11 @@ public class XStreamMarshaller extends AbstractMarshaller 
implements Initializin
+               this.encoding = encoding;
+       }
+ 
++      @Override
++      protected String getDefaultEncoding() {
++              return this.encoding;
++      }
++
+       /**
+        * Set the classes supported by this marshaller.
+        * <p>If this property is empty (the default), all classes are 
supported.
+@@ -701,6 +704,13 @@ public class XStreamMarshaller extends AbstractMarshaller 
implements Initializin
+       // Unmarshalling
+ 
+       @Override
++      protected Object unmarshalStreamSourceNoExternalEntitities(StreamSource 
streamSource)
++                      throws XmlMappingException, IOException {
++
++              return super.unmarshalStreamSource(streamSource);
++      }
++
++      @Override
+       protected Object unmarshalDomNode(Node node) throws XmlMappingException 
{
+               HierarchicalStreamReader streamReader;
+               if (node instanceof Document) {
+diff --git 
a/spring-oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java
 
b/spring-oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java
+index 5856408..5500642 100644
+--- 
a/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java
++++ 
b/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2013 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -19,6 +19,8 @@ package org.springframework.oxm.castor;
+ import java.io.ByteArrayInputStream;
+ import java.io.IOException;
+ import java.io.StringReader;
++import java.util.concurrent.atomic.AtomicReference;
++import javax.xml.transform.sax.SAXSource;
+ import javax.xml.transform.stream.StreamSource;
+ 
+ import org.junit.Ignore;
+@@ -28,9 +30,13 @@ import org.springframework.core.io.ClassPathResource;
+ import org.springframework.oxm.AbstractUnmarshallerTests;
+ import org.springframework.oxm.MarshallingException;
+ import org.springframework.oxm.Unmarshaller;
++import org.xml.sax.InputSource;
++import org.xml.sax.XMLReader;
+ 
++import static junit.framework.Assert.assertNotNull;
+ import static org.hamcrest.CoreMatchers.*;
+ import static org.junit.Assert.*;
++import static org.junit.Assert.assertEquals;
+ 
+ /**
+  * @author Arjen Poutsma
+@@ -203,4 +209,59 @@ public class CastorUnmarshallerTests extends 
AbstractUnmarshallerTests {
+               StreamSource source = new StreamSource(new StringReader(xml));
+               return unmarshaller.unmarshal(source);
+       }
++
++      @Test
++      public void unmarshalStreamSourceExternalEntities() throws Exception {
++
++              final AtomicReference<XMLReader> result = new 
AtomicReference<XMLReader>();
++              CastorMarshaller marshaller = new CastorMarshaller() {
++                      @Override
++                      protected Object unmarshalSaxReader(XMLReader 
xmlReader, InputSource inputSource) {
++                              result.set(xmlReader);
++                              return null;
++                      }
++              };
++
++              // 1. external-general-entities disabled (default)
++
++              marshaller.unmarshal(new StreamSource("1"));
++              assertNotNull(result.get());
++              assertEquals(false, 
result.get().getFeature("http://xml.org/sax/features/external-general-entities";));
++
++              // 2. external-general-entities disabled (default)
++
++              result.set(null);
++              marshaller.setProcessExternalEntities(true);
++              marshaller.unmarshal(new StreamSource("1"));
++              assertNotNull(result.get());
++              assertEquals(true, 
result.get().getFeature("http://xml.org/sax/features/external-general-entities";));
++      }
++
++      @Test
++      public void unmarshalSaxSourceExternalEntities() throws Exception {
++
++              final AtomicReference<XMLReader> result = new 
AtomicReference<XMLReader>();
++              CastorMarshaller marshaller = new CastorMarshaller() {
++                      @Override
++                      protected Object unmarshalSaxReader(XMLReader 
xmlReader, InputSource inputSource) {
++                              result.set(xmlReader);
++                              return null;
++                      }
++              };
++
++              // 1. external-general-entities disabled (default)
++
++              marshaller.unmarshal(new SAXSource(new InputSource("1")));
++              assertNotNull(result.get());
++              assertEquals(false, 
result.get().getFeature("http://xml.org/sax/features/external-general-entities";));
++
++              // 2. external-general-entities disabled (default)
++
++              result.set(null);
++              marshaller.setProcessExternalEntities(true);
++              marshaller.unmarshal(new SAXSource(new InputSource("1")));
++              assertNotNull(result.get());
++              assertEquals(true, 
result.get().getFeature("http://xml.org/sax/features/external-general-entities";));
++      }
++
+ }
+diff --git 
a/spring-oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java
 
b/spring-oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java
+index af99408..921a4b2 100644
+--- 
a/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java
++++ 
b/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2013 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -31,9 +31,12 @@ import javax.xml.bind.annotation.XmlType;
+ import javax.xml.namespace.QName;
+ import javax.xml.transform.Result;
+ import javax.xml.transform.sax.SAXResult;
++import javax.xml.transform.sax.SAXSource;
+ import javax.xml.transform.stream.StreamResult;
++import javax.xml.transform.stream.StreamSource;
+ 
+ import org.junit.Test;
++import org.mockito.ArgumentCaptor;
+ import org.mockito.InOrder;
+ import org.springframework.core.io.ClassPathResource;
+ import org.springframework.core.io.Resource;
+@@ -47,9 +50,7 @@ import org.springframework.oxm.jaxb.test.ObjectFactory;
+ import org.springframework.oxm.mime.MimeContainer;
+ import org.springframework.util.FileCopyUtils;
+ import org.springframework.util.ReflectionUtils;
+-import org.xml.sax.Attributes;
+-import org.xml.sax.ContentHandler;
+-import org.xml.sax.Locator;
++import org.xml.sax.*;
+ 
+ import static org.junit.Assert.*;
+ import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
+@@ -289,7 +290,7 @@ public class Jaxb2MarshallerTests extends 
AbstractMarshallerTests {
+       public void marshalAWrappedObjectHoldingAnXmlElementDeclElement() 
throws Exception {
+               // SPR-10714
+               marshaller = new Jaxb2Marshaller();
+-              marshaller.setPackagesToScan(new String[] { 
"org.springframework.oxm.jaxb" });
++              marshaller.setPackagesToScan(new 
String[]{"org.springframework.oxm.jaxb"});
+               marshaller.afterPropertiesSet();
+               Airplane airplane = new Airplane();
+               airplane.setName("test");
+@@ -300,6 +301,75 @@ public class Jaxb2MarshallerTests extends 
AbstractMarshallerTests {
+                               writer.toString(), 
"<airplane><name>test</name></airplane>");
+       }
+ 
++      // SPR-10806
++
++      @Test
++      public void unmarshalStreamSourceExternalEntities() throws Exception {
++
++              final javax.xml.bind.Unmarshaller unmarshaller = 
mock(javax.xml.bind.Unmarshaller.class);
++              Jaxb2Marshaller marshaller = new Jaxb2Marshaller() {
++                      @Override
++                      protected javax.xml.bind.Unmarshaller 
createUnmarshaller() {
++                              return unmarshaller;
++                      }
++              };
++
++              // 1. external-general-entities disabled (default)
++
++              marshaller.unmarshal(new StreamSource("1"));
++              ArgumentCaptor<SAXSource> sourceCaptor = 
ArgumentCaptor.forClass(SAXSource.class);
++              verify(unmarshaller).unmarshal(sourceCaptor.capture());
++
++              SAXSource result = sourceCaptor.getValue();
++              assertEquals(false, 
result.getXMLReader().getFeature("http://xml.org/sax/features/external-general-entities";));
++
++              // 2. external-general-entities enabled
++
++              reset(unmarshaller);
++              marshaller.setProcessExternalEntities(true);
++
++              marshaller.unmarshal(new StreamSource("1"));
++              verify(unmarshaller).unmarshal(sourceCaptor.capture());
++
++              result = sourceCaptor.getValue();
++              assertEquals(true, 
result.getXMLReader().getFeature("http://xml.org/sax/features/external-general-entities";));
++      }
++
++      // SPR-10806
++
++      @Test
++      public void unmarshalSaxSourceExternalEntities() throws Exception {
++
++              final javax.xml.bind.Unmarshaller unmarshaller = 
mock(javax.xml.bind.Unmarshaller.class);
++              Jaxb2Marshaller marshaller = new Jaxb2Marshaller() {
++                      @Override
++                      protected javax.xml.bind.Unmarshaller 
createUnmarshaller() {
++                              return unmarshaller;
++                      }
++              };
++
++              // 1. external-general-entities disabled (default)
++
++              marshaller.unmarshal(new SAXSource(new InputSource("1")));
++              ArgumentCaptor<SAXSource> sourceCaptor = 
ArgumentCaptor.forClass(SAXSource.class);
++              verify(unmarshaller).unmarshal(sourceCaptor.capture());
++
++              SAXSource result = sourceCaptor.getValue();
++              assertEquals(false, 
result.getXMLReader().getFeature("http://xml.org/sax/features/external-general-entities";));
++
++              // 2. external-general-entities enabled
++
++              reset(unmarshaller);
++              marshaller.setProcessExternalEntities(true);
++
++              marshaller.unmarshal(new SAXSource(new InputSource("1")));
++              verify(unmarshaller).unmarshal(sourceCaptor.capture());
++
++              result = sourceCaptor.getValue();
++              assertEquals(true, 
result.getXMLReader().getFeature("http://xml.org/sax/features/external-general-entities";));
++      }
++
++
+       @XmlRootElement
+       @SuppressWarnings("unused")
+       public static class DummyRootElement {
+diff --git 
a/spring-oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java
 
b/spring-oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java
+index 14ab19c..f7d26af 100644
+--- 
a/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java
++++ 
b/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java
+@@ -16,21 +16,34 @@
+ 
+ package org.springframework.oxm.jibx;
+ 
++import java.io.IOException;
+ import java.io.StringWriter;
++import java.util.concurrent.atomic.AtomicReference;
++import javax.xml.transform.sax.SAXSource;
+ import javax.xml.transform.stream.StreamResult;
++import javax.xml.transform.stream.StreamSource;
+ 
+ import org.custommonkey.xmlunit.XMLUnit;
+ import org.junit.BeforeClass;
+ import org.junit.Test;
+ 
++import org.mockito.ArgumentCaptor;
+ import org.springframework.oxm.AbstractMarshallerTests;
+ import org.springframework.oxm.Marshaller;
++import org.springframework.oxm.XmlMappingException;
++import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+ import org.springframework.tests.Assume;
+ import org.springframework.tests.TestGroup;
++import org.xml.sax.InputSource;
++import org.xml.sax.XMLReader;
+ 
+ import static org.custommonkey.xmlunit.XMLAssert.*;
++import static org.junit.Assert.assertEquals;
+ import static org.junit.Assert.assertFalse;
+ import static org.junit.Assert.assertTrue;
++import static org.mockito.Mockito.mock;
++import static org.mockito.Mockito.reset;
++import static org.mockito.Mockito.verify;
+ 
+ /**
+  * @author Arjen Poutsma
+@@ -107,5 +120,4 @@ public class JibxMarshallerTests extends 
AbstractMarshallerTests {
+               assertFalse("JibxMarshaller supports illegal type", 
marshaller.supports(getClass()));
+       }
+ 
+-
+ }
+diff --git 
a/spring-oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java
 
b/spring-oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java
+index b1e460d..5ceeab2 100644
+--- 
a/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java
++++ 
b/projects/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java
+@@ -28,7 +28,9 @@ import org.springframework.oxm.Unmarshaller;
+ import org.springframework.tests.Assume;
+ import org.springframework.tests.TestGroup;
+ 
+-import static org.junit.Assert.*;
++import static org.junit.Assert.assertEquals;
++import static org.junit.Assert.assertNotNull;
++
+ 
+ /**
+  * @author Arjen Poutsma
+diff --git 
a/spring-web/src/main/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverter.java
 
b/spring-web/src/main/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverter.java
+index 676f6d6..ad8d7d9 100644
+--- 
a/projects/org.springframework.web/src/main/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverter.java
++++ 
b/projects/org.springframework.web/src/main/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverter.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2010 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -28,6 +28,9 @@ import javax.xml.bind.annotation.XmlRootElement;
+ import javax.xml.bind.annotation.XmlType;
+ import javax.xml.transform.Result;
+ import javax.xml.transform.Source;
++import javax.xml.transform.dom.DOMSource;
++import javax.xml.transform.sax.SAXSource;
++import javax.xml.transform.stream.StreamSource;
+ 
+ import org.springframework.core.annotation.AnnotationUtils;
+ import org.springframework.http.HttpHeaders;
+@@ -36,6 +39,11 @@ import 
org.springframework.http.converter.HttpMessageConversionException;
+ import org.springframework.http.converter.HttpMessageNotReadableException;
+ import org.springframework.http.converter.HttpMessageNotWritableException;
+ import org.springframework.util.ClassUtils;
++import org.springframework.util.xml.StaxUtils;
++import org.xml.sax.InputSource;
++import org.xml.sax.SAXException;
++import org.xml.sax.XMLReader;
++import org.xml.sax.helpers.XMLReaderFactory;
+ 
+ /**
+  * Implementation of {@link 
org.springframework.http.converter.HttpMessageConverter HttpMessageConverter} 
that can read
+@@ -49,6 +57,17 @@ import org.springframework.util.ClassUtils;
+  */
+ public class Jaxb2RootElementHttpMessageConverter extends 
AbstractJaxb2HttpMessageConverter<Object> {
+ 
++      private boolean processExternalEntities = false;
++
++
++      /**
++       * Indicates whether external XML entities are processed when 
converting to a Source.
++       * <p>Default is {@code false}, meaning that external entities are not 
resolved.
++       */
++      public void setProcessExternalEntities(boolean processExternalEntities) 
{
++              this.processExternalEntities = processExternalEntities;
++      }
++
+       @Override
+       public boolean canRead(Class<?> clazz, MediaType mediaType) {
+               return (clazz.isAnnotationPresent(XmlRootElement.class) || 
clazz.isAnnotationPresent(XmlType.class)) &&
+@@ -69,6 +88,7 @@ public class Jaxb2RootElementHttpMessageConverter extends 
AbstractJaxb2HttpMessa
+       @Override
+       protected Object readFromSource(Class<?> clazz, HttpHeaders headers, 
Source source) throws IOException {
+               try {
++                      source = processSource(source);
+                       Unmarshaller unmarshaller = createUnmarshaller(clazz);
+                       if (clazz.isAnnotationPresent(XmlRootElement.class)) {
+                               return unmarshaller.unmarshal(source);
+@@ -87,6 +107,26 @@ public class Jaxb2RootElementHttpMessageConverter extends 
AbstractJaxb2HttpMessa
+               }
+       }
+ 
++      protected Source processSource(Source source) {
++              if (source instanceof StreamSource) {
++                      StreamSource streamSource = (StreamSource) source;
++                      InputSource inputSource = new 
InputSource(streamSource.getInputStream());
++                      try {
++                              XMLReader xmlReader = 
XMLReaderFactory.createXMLReader();
++                              String featureName = 
"http://xml.org/sax/features/external-general-entities";;
++                              xmlReader.setFeature(featureName, 
this.processExternalEntities);
++                              return new SAXSource(xmlReader, inputSource);
++                      }
++                      catch (SAXException ex) {
++                              logger.warn("Processing of external entities 
could not be disabled", ex);
++                              return source;
++                      }
++              }
++              else {
++                      return source;
++              }
++      }
++
+       @Override
+       protected void writeToResult(Object o, HttpHeaders headers, Result 
result) throws IOException {
+               try {
+diff --git 
a/spring-web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java
 
b/spring-web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java
+index e970450..ec7daec 100644
+--- 
a/projects/org.springframework.web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java
++++ 
b/projects/org.springframework.web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java
+@@ -95,6 +95,12 @@ public class SourceHttpMessageConverter<T extends Source> 
extends AbstractHttpMe
+               this.processExternalEntities = processExternalEntities;
+       }
+ 
++      /**
++       * @return the configured value for whether XML external entities are 
allowed.
++       */
++      public boolean isProcessExternalEntities() {
++              return this.processExternalEntities;
++      }
+ 
+       @Override
+       public boolean supports(Class<?> clazz) {
+@@ -159,8 +165,7 @@ public class SourceHttpMessageConverter<T extends Source> 
extends AbstractHttpMe
+       private Source readStAXSource(InputStream body) {
+               try {
+                       XMLInputFactory inputFactory = 
XMLInputFactory.newFactory();
+-                      inputFactory.setProperty(
+-                                      
"javax.xml.stream.isSupportingExternalEntities", this.processExternalEntities);
++                      
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, 
this.processExternalEntities);
+                       XMLStreamReader streamReader = 
inputFactory.createXMLStreamReader(body);
+                       return new StAXSource(streamReader);
+               }
+diff --git 
a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java
 
b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java
+index 30b7cc0..fe1e392 100644
+--- 
a/projects/org.springframework.web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java
++++ 
b/projects/org.springframework.web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java
+@@ -32,9 +32,13 @@ import org.junit.Test;
+ import org.springframework.aop.framework.AdvisedSupport;
+ import org.springframework.aop.framework.AopProxy;
+ import org.springframework.aop.framework.DefaultAopProxyFactory;
++import org.springframework.core.io.ClassPathResource;
++import org.springframework.core.io.Resource;
+ import org.springframework.http.MediaType;
+ import org.springframework.http.MockHttpInputMessage;
+ import org.springframework.http.MockHttpOutputMessage;
++import org.springframework.http.converter.HttpMessageNotReadableException;
++import org.xml.sax.SAXParseException;
+ 
+ /** @author Arjen Poutsma */
+ public class Jaxb2RootElementHttpMessageConverterTests {
+@@ -96,6 +100,33 @@ public class Jaxb2RootElementHttpMessageConverterTests {
+       }
+ 
+       @Test
++      public void readXmlRootElementExternalEntityDisabled() throws Exception 
{
++              Resource external = new ClassPathResource("external.txt", 
getClass());
++              String content =  "<!DOCTYPE root [" +
++                              "  <!ELEMENT external ANY >\n" +
++                              "  <!ENTITY ext SYSTEM \"" + external.getURI() 
+ "\" >]>" +
++                              "  
<rootElement><external>&ext;</external></rootElement>";
++              MockHttpInputMessage inputMessage = new 
MockHttpInputMessage(content.getBytes("UTF-8"));
++              RootElement rootElement = (RootElement) 
converter.read(RootElement.class, inputMessage);
++
++              assertEquals("", rootElement.external);
++      }
++
++      @Test
++      public void readXmlRootElementExternalEntityEnabled() throws Exception {
++              Resource external = new ClassPathResource("external.txt", 
getClass());
++              String content =  "<!DOCTYPE root [" +
++                              "  <!ELEMENT external ANY >\n" +
++                              "  <!ENTITY ext SYSTEM \"" + external.getURI() 
+ "\" >]>" +
++                              "  
<rootElement><external>&ext;</external></rootElement>";
++              MockHttpInputMessage inputMessage = new 
MockHttpInputMessage(content.getBytes("UTF-8"));
++              this.converter.setProcessExternalEntities(true);
++              RootElement rootElement = (RootElement) 
converter.read(RootElement.class, inputMessage);
++
++              assertEquals("Foo Bar", rootElement.external);
++      }
++
++      @Test
+       public void writeXmlRootElement() throws Exception {
+               MockHttpOutputMessage outputMessage = new 
MockHttpOutputMessage();
+               converter.write(rootElement, null, outputMessage);
+@@ -120,6 +151,9 @@ public class Jaxb2RootElementHttpMessageConverterTests {
+ 
+               private Type type = new Type();
+ 
++              @XmlElement(required=false)
++              public String external;
++
+               public Type getType() {
+                       return this.type;
+               }
diff --git a/debian/patches/CVE-2014-1904.patch 
b/debian/patches/CVE-2014-1904.patch
new file mode 100644
index 0000000..e59e02d
--- /dev/null
+++ b/debian/patches/CVE-2014-1904.patch
@@ -0,0 +1,80 @@
+From: Miguel Landaeta <[email protected]>
+Date: Mon, 24 Mar 2014 14:35:39 -0300
+Subject: CVE-2013-6429
+
+Bug: http://bugs.debian.org/741604
+
+diff --git 
a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java
 
b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java
+index a6aa59c..8c50bde 100644
+--- 
a/projects/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java
++++ 
b/projects/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2013 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -16,6 +16,7 @@
+ 
+ package org.springframework.web.servlet.tags.form;
+ 
++import java.io.UnsupportedEncodingException;
+ import java.util.Map;
+ 
+ import javax.servlet.ServletRequest;
+@@ -32,6 +33,7 @@ import org.springframework.util.ObjectUtils;
+ import org.springframework.util.StringUtils;
+ import org.springframework.web.servlet.support.RequestDataValueProcessor;
+ import org.springframework.web.util.HtmlUtils;
++import org.springframework.web.util.UriUtils;
+ 
+ /**
+  * Databinding-aware JSP tag for rendering an HTML '{@code form}' whose
+@@ -442,6 +444,13 @@ public class FormTag extends AbstractHtmlElementTag {
+               }
+               else {
+                       String requestUri = getRequestContext().getRequestUri();
++                      String encoding = 
pageContext.getResponse().getCharacterEncoding();
++                      try {
++                              requestUri = UriUtils.encodePath(requestUri, 
encoding);
++                      }
++                      catch (UnsupportedEncodingException e) {
++                              throw new JspException(e);
++                      }
+                       ServletResponse response = 
this.pageContext.getResponse();
+                       if (response instanceof HttpServletResponse) {
+                               requestUri = ((HttpServletResponse) 
response).encodeURL(requestUri);
+diff --git 
a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java
 
b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java
+index 8fdcc1c..2612761 100644
+--- 
a/projects/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java
++++ 
b/projects/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2002-2013 the original author or authors.
++ * Copyright 2002-2014 the original author or authors.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+@@ -340,6 +340,21 @@ public class FormTagTests extends 
AbstractHtmlElementTagTests {
+               assertFormTagClosed(output);
+       }
+ 
++      public void testDefaultActionEncoded() throws Exception {
++
++              this.request.setRequestURI("/a b c");
++              request.setQueryString("");
++
++              this.tag.doStartTag();
++              this.tag.doEndTag();
++              this.tag.doFinally();
++
++              String output = getOutput();
++              String formOutput = getFormTag(output);
++
++              assertContainsAttribute(formOutput, "action", "/a%20b%20c");
++      }
++
+       private String getFormTag(String output) {
+               int inputStart = output.indexOf("<", 1);
+               int inputEnd = output.lastIndexOf(">", output.length() - 2);
diff --git a/debian/patches/series b/debian/patches/series
index c989a84..36fe668 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -12,3 +12,5 @@
 Add-processExternalEntities-to-JAXB2Marshaller.patch
 CVE-2013-6429.patch
 CVE-2013-6430.patch
+#CVE-2014-0054.patch
+CVE-2014-1904.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-java/libspring-java.git

_______________________________________________
pkg-java-commits mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

Reply via email to