diff --git a/apache-commons-fileupload-CVE-2014-0050.patch b/apache-commons-fileupload-CVE-2014-0050.patch new file mode 100644 index 0000000..3780736 --- /dev/null +++ b/apache-commons-fileupload-CVE-2014-0050.patch @@ -0,0 +1,151 @@ +diff --git a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java +index b693744..c8f5ca1 100644 +--- a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java ++++ b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java +@@ -991,7 +991,12 @@ public abstract class FileUploadBase { + } + + notifier = new MultipartStream.ProgressNotifier(listener, requestSize); +- multi = new MultipartStream(input, boundary, notifier); ++ try { ++ multi = new MultipartStream(input, boundary, notifier); ++ } catch (IllegalArgumentException iae) { ++ throw new InvalidContentTypeException( ++ format("The boundary specified in the %s header is too long", CONTENT_TYPE), iae); ++ } + multi.setHeaderEncoding(charEncoding); + + skipPreamble = true; +@@ -1183,7 +1188,7 @@ public abstract class FileUploadBase { + * detail message. + */ + public InvalidContentTypeException() { +- // Nothing to do. ++ super(); + } + + /** +@@ -1196,6 +1201,9 @@ public abstract class FileUploadBase { + super(message); + } + ++ public InvalidContentTypeException(String msg, Throwable cause) { ++ super(msg, cause); ++ } + } + + /** +diff --git a/src/main/java/org/apache/commons/fileupload/MultipartStream.java b/src/main/java/org/apache/commons/fileupload/MultipartStream.java +index 9088947..0474ef9 100644 +--- a/src/main/java/org/apache/commons/fileupload/MultipartStream.java ++++ b/src/main/java/org/apache/commons/fileupload/MultipartStream.java +@@ -268,10 +268,8 @@ public class MultipartStream { + /** + * Creates a new instance. + * +- * @deprecated 1.2.1 Use {@link #MultipartStream(InputStream, byte[], +- * org.apache.commons.fileupload.MultipartStream.ProgressNotifier)}, +- * or {@link #MultipartStream(InputStream, byte[], int, +- * org.apache.commons.fileupload.MultipartStream.ProgressNotifier)} ++ * @deprecated 1.2.1 Use {@link #MultipartStream(InputStream, byte[], int, ++ * ProgressNotifier)} + */ + @Deprecated + public MultipartStream() { +@@ -292,10 +290,8 @@ public class MultipartStream { + * encapsulations. + * @param bufSize The size of the buffer to be used, in bytes. + * +- * @see #MultipartStream(InputStream, byte[], +- * MultipartStream.ProgressNotifier) + * @deprecated 1.2.1 Use {@link #MultipartStream(InputStream, byte[], int, +- * org.apache.commons.fileupload.MultipartStream.ProgressNotifier)}. ++ * ProgressNotifier)}. + */ + @Deprecated + public MultipartStream(InputStream input, byte[] boundary, int bufSize) { +@@ -317,8 +313,7 @@ public class MultipartStream { + * @param pNotifier The notifier, which is used for calling the + * progress listener, if any. + * +- * @see #MultipartStream(InputStream, byte[], +- * MultipartStream.ProgressNotifier) ++ * @throws IllegalArgumentException If the buffer size is too small + */ + MultipartStream(InputStream input, + byte[] boundary, +@@ -331,9 +326,14 @@ public class MultipartStream { + + // We prepend CR/LF to the boundary to chop trailing CR/LF from + // body-data tokens. +- this.boundary = new byte[boundary.length + BOUNDARY_PREFIX.length]; + this.boundaryLength = boundary.length + BOUNDARY_PREFIX.length; ++ if (bufSize < this.boundaryLength + 1) { ++ throw new IllegalArgumentException( ++ "The buffer size specified for the MultipartStream is too small"); ++ } ++ this.boundary = new byte[this.boundaryLength]; + this.keepRegion = this.boundary.length; ++ + System.arraycopy(BOUNDARY_PREFIX, 0, this.boundary, 0, + BOUNDARY_PREFIX.length); + System.arraycopy(boundary, 0, this.boundary, BOUNDARY_PREFIX.length, +@@ -352,8 +352,7 @@ public class MultipartStream { + * @param pNotifier An object for calling the progress listener, if any. + * + * +- * @see #MultipartStream(InputStream, byte[], int, +- * MultipartStream.ProgressNotifier) ++ * @see #MultipartStream(InputStream, byte[], int, ProgressNotifier) + */ + MultipartStream(InputStream input, + byte[] boundary, +@@ -368,10 +367,8 @@ public class MultipartStream { + * @param boundary The token used for dividing the stream into + * encapsulations. + * +- * @deprecated 1.2.1 Use {@link #MultipartStream(InputStream, byte[], +- * MultipartStream.ProgressNotifier)}. +- * @see #MultipartStream(InputStream, byte[], int, +- * MultipartStream.ProgressNotifier) ++ * @deprecated 1.2.1 Use {@link #MultipartStream(InputStream, byte[], int, ++ * ProgressNotifier)}. + */ + @Deprecated + public MultipartStream(InputStream input, +diff --git a/src/test/java/org/apache/commons/fileupload/MultipartStreamTest.java b/src/test/java/org/apache/commons/fileupload/MultipartStreamTest.java +index 7148d81..80871f4 100644 +--- a/src/test/java/org/apache/commons/fileupload/MultipartStreamTest.java ++++ b/src/test/java/org/apache/commons/fileupload/MultipartStreamTest.java +@@ -38,7 +38,8 @@ public class MultipartStreamTest { + final byte[] contents = strData.getBytes(); + InputStream input = new ByteArrayInputStream(contents); + byte[] boundary = BOUNDARY_TEXT.getBytes(); +- int iBufSize = boundary.length; ++ int iBufSize = ++ boundary.length + MultipartStream.BOUNDARY_PREFIX.length + 1; + MultipartStream ms = new MultipartStream( + input, + boundary, +@@ -47,6 +48,21 @@ public class MultipartStreamTest { + assertNotNull(ms); + } + ++ @Test(expected=IllegalArgumentException.class) ++ public void testSmallBuffer() throws Exception { ++ final String strData = "foobar"; ++ final byte[] contents = strData.getBytes(); ++ InputStream input = new ByteArrayInputStream(contents); ++ byte[] boundary = BOUNDARY_TEXT.getBytes(); ++ int iBufSize = 1; ++ @SuppressWarnings("unused") ++ MultipartStream ms = new MultipartStream( ++ input, ++ boundary, ++ iBufSize, ++ new MultipartStream.ProgressNotifier(null, contents.length)); ++ } ++ + @Test + public void testTwoParamConstructor() throws Exception { + final String strData = "foobar"; diff --git a/apache-commons-fileupload.spec b/apache-commons-fileupload.spec index 4b8813d..c00bc7d 100644 --- a/apache-commons-fileupload.spec +++ b/apache-commons-fileupload.spec @@ -3,7 +3,7 @@ Name: apache-%{short_name} Version: 1.3 -Release: 4%{?dist} +Release: 5%{?dist} Summary: This package provides an api to work with html file upload License: ASL 2.0 Group: Development/Libraries @@ -11,6 +11,8 @@ URL: http://commons.apache.org/%{base_name}/ Source0: http://www.apache.org/dist/commons/%{base_name}/source/%{short_name}-%{version}-src.tar.gz BuildArch: noarch +# Backported from upstream revision 1565143 +Patch0: %{name}-CVE-2014-0050.patch Patch1: %{name}-portlet20.patch BuildRequires: java-devel >= 1:1.6.0 @@ -63,6 +65,7 @@ This package contains the API documentation for %{name}. %prep %setup -q -n %{short_name}-%{version}-src +%patch0 -p1 sed -i 's/\r//' LICENSE.txt sed -i 's/\r//' NOTICE.txt @@ -123,6 +126,10 @@ rm -rf $(readlink -f %{_javadocdir}/%{name}) %{_javadocdir}/%{name} || : # ----------------------------------------------------------------------------- %changelog +* Thu Feb 6 2014 Mikolaj Izdebski - 1.3-5 +- Add backported upstream patch to fix DoS vulnerability +- Resolves: CVE-2014-0050 + * Sat Aug 03 2013 Fedora Release Engineering - 1.3-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild