From 2c89768c451c94cdbee78a8ba34ffa07cc08e892 Mon Sep 17 00:00:00 2001 From: xuwei-k <6b656e6a69@gmail.com> Date: Fri, 5 Mar 2021 15:19:25 +0900 Subject: [PATCH] fix Int overflow in BodyParsers.anyContent(maxLength: Option[Long]) --- .../it/http/parsing/AnyContentBodyParserSpec.scala | 12 ++++++++++-- .../src/main/scala/play/api/mvc/BodyParsers.scala | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/play-integration-test/src/it/scala/play/it/http/parsing/AnyContentBodyParserSpec.scala b/core/play-integration-test/src/it/scala/play/it/http/parsing/AnyContentBodyParserSpec.scala index a1ea534be11..7f076dc7c03 100644 --- a/core/play-integration-test/src/it/scala/play/it/http/parsing/AnyContentBodyParserSpec.scala +++ b/core/play-integration-test/src/it/scala/play/it/http/parsing/AnyContentBodyParserSpec.scala @@ -12,11 +12,13 @@ import play.api.test._ class AnyContentBodyParserSpec extends PlaySpecification { "The anyContent body parser" should { - def parse(method: String, contentType: Option[String], body: ByteString)(implicit app: Application) = { + def parse(method: String, contentType: Option[String], body: ByteString, maxLength: Option[Long] = None)( + implicit app: Application + ) = { implicit val mat = app.materializer val parsers = app.injector.instanceOf[PlayBodyParsers] val request = FakeRequest(method, "/x").withHeaders(contentType.map(CONTENT_TYPE -> _).toSeq: _*) - await(parsers.anyContent(request).run(Source.single(body))) + await(parsers.anyContent(maxLength).apply(request).run(Source.single(body))) } "parse text bodies for DELETE requests" in new WithApplication(_.globalApp(false)) { @@ -66,5 +68,11 @@ class AnyContentBodyParserSpec extends PlaySpecification { } } } + + "accept greater than 2G bytes. not Int overflow" in new WithApplication(_.globalApp(false)) { + parse("POST", Some("text/plain"), ByteString("bar"), maxLength = Some(Int.MaxValue.toLong + 2L)) must beRight( + AnyContentAsText("bar") + ) + } } } diff --git a/core/play/src/main/scala/play/api/mvc/BodyParsers.scala b/core/play/src/main/scala/play/api/mvc/BodyParsers.scala index 79039a7d7f7..7bdaf718ceb 100644 --- a/core/play/src/main/scala/play/api/mvc/BodyParsers.scala +++ b/core/play/src/main/scala/play/api/mvc/BodyParsers.scala @@ -918,7 +918,7 @@ trait PlayBodyParsers extends BodyParserUtils { def anyContent(maxLength: Option[Long]): BodyParser[AnyContent] = BodyParser("anyContent") { request => import Execution.Implicits.trampoline - def maxLengthOrDefault = maxLength.fold(DefaultMaxTextLength)(_.toInt) + def maxLengthOrDefault = maxLength.getOrElse(DefaultMaxTextLength) def maxLengthOrDefaultLarge = maxLength.getOrElse(DefaultMaxDiskLength) val contentType: Option[String] = request.contentType.map(_.toLowerCase(Locale.ENGLISH)) contentType match {