Control: tags -1 -moreinfo
Control: retitle -1 unblock: ruby-rack/2.2.6.4-1

On Fri, Mar 24 2023 at 06:45:30 PM +01:00:00 +01:00:00, Sebastian Ramacher <sramac...@debian.org> wrote:
Control: tags -1 moreinfo

On 2023-03-24 01:50:25 +0530, Pirate Praveen wrote:
 Package: release.debian.org
 Severity: normal
 User: release.debian....@packages.debian.org
 Usertags: unblock
 X-Debbugs-Cc: ruby-r...@packages.debian.org
 Control: affects -1 + src:ruby-rack

Please see these changes for ruby-rack (I have not uploaded yet) is ok.

Please go ahead and let us know once the package is available in
unstable.

Uploaded ruby-rack/2.2.6.4-1 to unstable.


Cheers


 [ Reason ]
 It fixes two CVEs (though it includes some other bug fixes too)

 [ Impact ]
Some of the changes included in this release are already included in the
 debian package as patches, this just reduces maintenance effort.

 [ Tests ]
Upstream testsuite passes, gitlab is already using the 2.2.6.4 version.

 [ Risks ]
If this is not unblocked, two CVEs would have to be backported to 2.2.4


 [ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

 [ Other info ]

 unblock ruby-rack/2.2.6.4-1


diff -Nru ruby-rack-2.2.4/CHANGELOG.md ruby-rack-2.2.6.4/CHANGELOG.md
 --- ruby-rack-2.2.4/CHANGELOG.md       2022-07-01 03:48:29.000000000 +0530
+++ ruby-rack-2.2.6.4/CHANGELOG.md 2023-03-13 23:37:51.000000000 +0530
 @@ -2,6 +2,33 @@

All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/).

 +## [2.2.6.4] - 2023-03-13
 +
 +- [CVE-2023-27539] Avoid ReDoS in header parsing
 +
 +## [2.2.6.3] - 2023-03-02
 +
+- [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts
 +
 +## [2.2.6.2] - 2022-01-17
 +
 +- [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges
 +
 +## [2.2.6.1] - 2022-01-17
 +
 +- [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser
+- [CVE-2022-44572] Forbid control characters in attributes (also ReDoS)
 +
 +## [2.2.6] - 2022-01-17
 +
+- Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2011](https://github.com/rack/rack/pull/2011), [@byroot](https://github.com/byroot))
 +
 +## [2.2.5] - 2022-12-27
 +
 +### Fixed
 +
+- `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng))
 +
  ## [2.2.4] - 2022-06-30

- Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix)) diff -Nru ruby-rack-2.2.4/debian/changelog ruby-rack-2.2.6.4/debian/changelog --- ruby-rack-2.2.4/debian/changelog 2023-02-09 16:17:17.000000000 +0530 +++ ruby-rack-2.2.6.4/debian/changelog 2023-03-24 01:32:43.000000000 +0530
 @@ -1,3 +1,10 @@
 +ruby-rack (2.2.6.4-1) unstable; urgency=medium
 +
 +  * Team Upload
+ * New upstream version 2.2.6.4 (Fixes: CVE-2023-27530, CVE-2023-27539)
 +
+ -- Pirate Praveen <prav...@debian.org> Fri, 24 Mar 2023 01:32:43 +0530
 +
  ruby-rack (2.2.4-3) unstable; urgency=high

    * Team upload
diff -Nru ruby-rack-2.2.4/debian/patches/Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch ruby-rack-2.2.6.4/debian/patches/Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch --- ruby-rack-2.2.4/debian/patches/Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch 2023-02-09 16:17:17.000000000 +0530 +++ ruby-rack-2.2.6.4/debian/patches/Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch 1970-01-01 05:30:00.000000000 +0530
 @@ -1,26 +0,0 @@
 ---- a/lib/rack/utils.rb
 -+++ b/lib/rack/utils.rb
 -@@ -348,17 +348,18 @@
- return nil unless http_range && http_range =~ /bytes=([^;]+)/
 -       ranges = []
 -       $1.split(/,\s*/).each do |range_spec|
 --        return nil  unless range_spec =~ /(\d*)-(\d*)/
 --        r0, r1 = $1, $2
 --        if r0.empty?
 --          return nil  if r1.empty?
 -+        return nil unless range_spec.include?('-')
 -+        range = range_spec.split('-')
 -+        r0, r1 = range[0], range[1]
 -+        if r0.nil? || r0.empty?
 -+          return nil if r1.nil?
- # suffix-byte-range-spec, represents trailing suffix of file
 -           r0 = size - r1.to_i
 -           r0 = 0  if r0 < 0
 -           r1 = size - 1
 -         else
 -           r0 = r0.to_i
 --          if r1.empty?
 -+          if r1.nil?
 -             r1 = size - 1
 -           else
 -             r1 = r1.to_i
diff -Nru ruby-rack-2.2.4/debian/patches/Fix-ReDoS-vulnerability-in-multipart-parser.patch ruby-rack-2.2.6.4/debian/patches/Fix-ReDoS-vulnerability-in-multipart-parser.patch --- ruby-rack-2.2.4/debian/patches/Fix-ReDoS-vulnerability-in-multipart-parser.patch 2023-02-09 16:17:17.000000000 +0530 +++ ruby-rack-2.2.6.4/debian/patches/Fix-ReDoS-vulnerability-in-multipart-parser.patch 1970-01-01 05:30:00.000000000 +0530
 @@ -1,11 +0,0 @@
 ---- a/lib/rack/multipart.rb
 -+++ b/lib/rack/multipart.rb
 -@@ -18,7 +18,7 @@
 -     VALUE = /"(?:\\"|[^"])*"|#{TOKEN}/
 -     BROKEN = /^#{CONDISP}.*;\s*filename=(#{VALUE})/i
 -     MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni
-- MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*;\s*name=(#{VALUE})/ni -+ MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:[^:]*;\s*name=(#{VALUE})/ni
 -     MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
 -     # Updated definitions from RFC 2231
 -     ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]}
diff -Nru ruby-rack-2.2.4/debian/patches/Forbid-control-characters-in-attributes.patch ruby-rack-2.2.6.4/debian/patches/Forbid-control-characters-in-attributes.patch --- ruby-rack-2.2.4/debian/patches/Forbid-control-characters-in-attributes.patch 2023-02-09 16:17:17.000000000 +0530 +++ ruby-rack-2.2.6.4/debian/patches/Forbid-control-characters-in-attributes.patch 1970-01-01 05:30:00.000000000 +0530
 @@ -1,13 +0,0 @@
 -This patch restricts the characters accepted in ATTRIBUTE_CHAR,
 -forbidding control characters and fixing a ReDOS vulnerability.
 ---- a/lib/rack/multipart.rb
 -+++ b/lib/rack/multipart.rb
 -@@ -21,7 +21,7 @@
- MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:[^:]*;\s*name=(#{VALUE})/ni
 -     MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
 -     # Updated definitions from RFC 2231
 --    ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]}
 -+    ATTRIBUTE_CHAR = %r{[^ \x00-\x1f\x7f)(><@,;:\\"/\[\]?='*%]}
 -     ATTRIBUTE = /#{ATTRIBUTE_CHAR}+/
 -     SECTION = /\*[0-9]+/
 -     REGULAR_PARAMETER_NAME = /#{ATTRIBUTE}#{SECTION}?/
diff -Nru ruby-rack-2.2.4/debian/patches/Remove-leading-dot-to-fix-compatibility-with-latest-cgi-gem.patch ruby-rack-2.2.6.4/debian/patches/Remove-leading-dot-to-fix-compatibility-with-latest-cgi-gem.patch --- ruby-rack-2.2.4/debian/patches/Remove-leading-dot-to-fix-compatibility-with-latest-cgi-gem.patch 2023-02-09 16:17:17.000000000 +0530 +++ ruby-rack-2.2.6.4/debian/patches/Remove-leading-dot-to-fix-compatibility-with-latest-cgi-gem.patch 1970-01-01 05:30:00.000000000 +0530
 @@ -1,31 +0,0 @@
 ---- a/test/spec_mock.rb
 -+++ b/test/spec_mock.rb
 -@@ -19,8 +19,8 @@
 -     req.GET["status"] || 200,
 -     "Content-Type" => "text/yaml"
 -   )
-- response.set_cookie("session_test", { value: "session_test", domain: ".test.com", path: "/" }) -- response.set_cookie("secure_test", { value: "secure_test", domain: ".test.com", path: "/", secure: true }) -+ response.set_cookie("session_test", { value: "session_test", domain: "test.com", path: "/" }) -+ response.set_cookie("secure_test", { value: "secure_test", domain: "test.com", path: "/", secure: true }) - response.set_cookie("persistent_test", { value: "persistent_test", max_age: 15552000, path: "/" })
 -   response.finish
 - })
 -@@ -293,7 +293,7 @@
 -     res = Rack::MockRequest.new(app).get("")
 -     session_cookie = res.cookie("session_test")
 -     session_cookie.value[0].must_equal "session_test"
 --    session_cookie.domain.must_equal ".test.com"
 -+    session_cookie.domain.must_equal "test.com"
 -     session_cookie.path.must_equal "/"
 -     session_cookie.secure.must_equal false
 -     session_cookie.expires.must_be_nil
 -@@ -314,7 +314,7 @@
 -     res = Rack::MockRequest.new(app).get("")
 -     secure_cookie = res.cookie("secure_test")
 -     secure_cookie.value[0].must_equal "secure_test"
 --    secure_cookie.domain.must_equal ".test.com"
 -+    secure_cookie.domain.must_equal "test.com"
 -     secure_cookie.path.must_equal "/"
 -     secure_cookie.secure.must_equal true
 -     secure_cookie.expires.must_be_nil
diff -Nru ruby-rack-2.2.4/debian/patches/series ruby-rack-2.2.6.4/debian/patches/series --- ruby-rack-2.2.4/debian/patches/series 2023-02-09 16:17:17.000000000 +0530 +++ ruby-rack-2.2.6.4/debian/patches/series 2023-03-24 01:32:43.000000000 +0530
 @@ -1,7 +1,3 @@
  skip-random-failure.patch
  0002-Make-tests-pass-on-hosts-that-have-no-ipv4-connectiv.patch
  skip-unreadable-dir-test.patch
 -Remove-leading-dot-to-fix-compatibility-with-latest-cgi-gem.patch
 -Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch
 -Fix-ReDoS-vulnerability-in-multipart-parser.patch
 -Forbid-control-characters-in-attributes.patch
diff -Nru ruby-rack-2.2.4/.github/workflows/development.yml ruby-rack-2.2.6.4/.github/workflows/development.yml --- ruby-rack-2.2.4/.github/workflows/development.yml 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/.github/workflows/development.yml 2023-03-13 23:37:51.000000000 +0530
 @@ -8,7 +8,7 @@
        fail-fast: false
        matrix:
          os: [ubuntu-20.04]
 -        ruby: [2.3, 2.4, 2.5, 2.6, 2.7, '3.0', 3.1]
 +        ruby: [2.3, 2.4, 2.5, 2.6, 2.7, '3.0', 3.1, 3.2]
      runs-on: ${{matrix.os}}
      steps:
      - uses: actions/checkout@v2
 @@ -29,7 +29,6 @@

      - name: Bundle install...
        run: |
 -        gem update --system
          bundle config path vendor/bundle
          bundle install

diff -Nru ruby-rack-2.2.4/lib/rack/method_override.rb ruby-rack-2.2.6.4/lib/rack/method_override.rb --- ruby-rack-2.2.4/lib/rack/method_override.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/method_override.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -43,7 +43,7 @@

      def method_override_param(req)
        req.POST[METHOD_OVERRIDE_PARAM_KEY]
 -    rescue Utils::InvalidParameterError, Utils::ParameterTypeError
+ rescue Utils::InvalidParameterError, Utils::ParameterTypeError, QueryParser::ParamsTooDeepError req.get_header(RACK_ERRORS).puts "Invalid or incomplete POST params"
      rescue EOFError
        req.get_header(RACK_ERRORS).puts "Bad request content body"
diff -Nru ruby-rack-2.2.4/lib/rack/multipart/parser.rb ruby-rack-2.2.6.4/lib/rack/multipart/parser.rb --- ruby-rack-2.2.4/lib/rack/multipart/parser.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/multipart/parser.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -5,6 +5,7 @@
  module Rack
    module Multipart
      class MultipartPartLimitError < Errno::EMFILE; end
 +    class MultipartTotalPartLimitError < StandardError; end

      class Parser
(require_relative '../core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4'
 @@ -140,7 +141,7 @@

@mime_parts[mime_index] = klass.new(body, head, filename, content_type, name)

 -          check_open_files
 +          check_part_limits
          end

          def on_mime_body(mime_index, content)
 @@ -152,13 +153,23 @@

          private

 -        def check_open_files
 -          if Utils.multipart_part_limit > 0
 -            if @open_files >= Utils.multipart_part_limit
 +        def check_part_limits
 +          file_limit = Utils.multipart_file_limit
 +          part_limit = Utils.multipart_total_part_limit
 +
 +          if file_limit && file_limit > 0
 +            if @open_files >= file_limit
                @mime_parts.each(&:close)
raise MultipartPartLimitError, 'Maximum file multiparts in content reached'
              end
            end
 +
 +          if part_limit && part_limit > 0
 +            if @mime_parts.size >= part_limit
 +              @mime_parts.each(&:close)
+ raise MultipartTotalPartLimitError, 'Maximum total multiparts in content reached'
 +            end
 +          end
          end
        end

diff -Nru ruby-rack-2.2.4/lib/rack/multipart.rb ruby-rack-2.2.6.4/lib/rack/multipart.rb --- ruby-rack-2.2.4/lib/rack/multipart.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/multipart.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -18,10 +18,10 @@
      VALUE = /"(?:\\"|[^"])*"|#{TOKEN}/
      BROKEN = /^#{CONDISP}.*;\s*filename=(#{VALUE})/i
      MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni
- MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*;\s*name=(#{VALUE})/ni + MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:[^:]*;\s*name=(#{VALUE})/ni
      MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
      # Updated definitions from RFC 2231
 -    ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]}
 +    ATTRIBUTE_CHAR = %r{[^ \x00-\x1f\x7f)(><@,;:\\"/\[\]?='*%]}
      ATTRIBUTE = /#{ATTRIBUTE_CHAR}+/
      SECTION = /\*[0-9]+/
      REGULAR_PARAMETER_NAME = /#{ATTRIBUTE}#{SECTION}?/
diff -Nru ruby-rack-2.2.4/lib/rack/request.rb ruby-rack-2.2.6.4/lib/rack/request.rb --- ruby-rack-2.2.4/lib/rack/request.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/request.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -572,8 +572,8 @@
        end

        def parse_http_accept_header(header)
 -        header.to_s.split(/\s*,\s*/).map do |part|
 -          attribute, parameters = part.split(/\s*;\s*/, 2)
 +        header.to_s.split(",").each(&:strip!).map do |part|
 +          attribute, parameters = part.split(";", 2).each(&:strip!)
            quality = 1.0
            if parameters and /\Aq=([\d.]+)/ =~ parameters
              quality = $1.to_f
diff -Nru ruby-rack-2.2.4/lib/rack/urlmap.rb ruby-rack-2.2.6.4/lib/rack/urlmap.rb --- ruby-rack-2.2.4/lib/rack/urlmap.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/urlmap.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -35,7 +35,7 @@
          end

          location = location.chomp('/')
- match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n') + match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", Regexp::NOENCODING)

          [host, location, match, app]
        }.sort_by do |(host, location, _, _)|
diff -Nru ruby-rack-2.2.4/lib/rack/utils.rb ruby-rack-2.2.6.4/lib/rack/utils.rb --- ruby-rack-2.2.4/lib/rack/utils.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/utils.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -58,13 +58,24 @@
      end

      class << self
 -      attr_accessor :multipart_part_limit
 +      attr_accessor :multipart_total_part_limit
 +
 +      attr_accessor :multipart_file_limit
 +
+ # multipart_part_limit is the original name of multipart_file_limit, but
 +      # the limit only counts parts with filenames.
 +      alias multipart_part_limit multipart_file_limit
 +      alias multipart_part_limit= multipart_file_limit=
      end

- # The maximum number of parts a request can contain. Accepting too many part
 -    # can lead to the server running out of file handles.
+ # The maximum number of file parts a request can contain. Accepting too + # many parts can lead to the server running out of file handles.
      # Set to `0` for no limit.
- self.multipart_part_limit = (ENV['RACK_MULTIPART_PART_LIMIT'] || 128).to_i + self.multipart_file_limit = (ENV['RACK_MULTIPART_PART_LIMIT'] || ENV['RACK_MULTIPART_FILE_LIMIT'] || 128).to_i
 +
+ # The maximum total number of parts a request can contain. Accepting too
 +    # many can lead to excessive memory use and parsing time.
+ self.multipart_total_part_limit = (ENV['RACK_MULTIPART_TOTAL_PART_LIMIT'] || 4096).to_i

      def self.param_depth_limit
        default_query_parser.param_depth_limit
 @@ -348,17 +359,18 @@
        return nil unless http_range && http_range =~ /bytes=([^;]+)/
        ranges = []
        $1.split(/,\s*/).each do |range_spec|
 -        return nil  unless range_spec =~ /(\d*)-(\d*)/
 -        r0, r1 = $1, $2
 -        if r0.empty?
 -          return nil  if r1.empty?
 +        return nil unless range_spec.include?('-')
 +        range = range_spec.split('-')
 +        r0, r1 = range[0], range[1]
 +        if r0.nil? || r0.empty?
 +          return nil if r1.nil?
# suffix-byte-range-spec, represents trailing suffix of file
            r0 = size - r1.to_i
            r0 = 0  if r0 < 0
            r1 = size - 1
          else
            r0 = r0.to_i
 -          if r1.empty?
 +          if r1.nil?
              r1 = size - 1
            else
              r1 = r1.to_i
diff -Nru ruby-rack-2.2.4/lib/rack/version.rb ruby-rack-2.2.6.4/lib/rack/version.rb --- ruby-rack-2.2.4/lib/rack/version.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/lib/rack/version.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -20,7 +20,7 @@
      VERSION.join(".")
    end

 -  RELEASE = "2.2.4"
 +  RELEASE = "2.2.6.4"

    # Return the Rack release as a dotted string.
    def self.release
 diff -Nru ruby-rack-2.2.4/README.rdoc ruby-rack-2.2.6.4/README.rdoc
 --- ruby-rack-2.2.4/README.rdoc        2022-07-01 03:48:29.000000000 +0530
+++ ruby-rack-2.2.6.4/README.rdoc 2023-03-13 23:37:51.000000000 +0530
 @@ -202,16 +202,30 @@

  Defaults to 100.

 -=== multipart_part_limit
 +=== multipart_file_limit

 -The maximum number of parts a request can contain.
 +The maximum number of parts with a filename a request can contain.
Accepting too many part can lead to the server running out of file handles.

The default is 128, which means that a single request can't upload more than 128 files at once.

  Set to 0 for no limit.

-Can also be set via the +RACK_MULTIPART_PART_LIMIT+ environment variable. +Can also be set via the +RACK_MULTIPART_FILE_LIMIT+ environment variable.
 +
+(This is also aliased as +multipart_part_limit+ and +RACK_MULTIPART_PART_LIMIT+ for compatibility)
 +
 +=== multipart_total_part_limit
 +
+The maximum total number of parts a request can contain of any type, including
 +both file and non-file form fields.
 +
+The default is 4096, which means that a single request can't contain more than
 +4096 parts.
 +
 +Set to 0 for no limit.
 +
+Can also be set via the +RACK_MULTIPART_TOTAL_PART_LIMIT+ environment variable.

  == Changelog

diff -Nru ruby-rack-2.2.4/test/spec_method_override.rb ruby-rack-2.2.6.4/test/spec_method_override.rb --- ruby-rack-2.2.4/test/spec_method_override.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/test/spec_method_override.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -100,6 +100,13 @@
env[Rack::RACK_ERRORS].read.must_match /Bad request content body/
    end

+ it "not modify REQUEST_METHOD for POST requests when the params are unparseable because too deep" do + env = Rack::MockRequest.env_for("/", method: "POST", input: ("[a]" * 36) + "=1")
 +    app.call env
 +
 +    env["REQUEST_METHOD"].must_equal "POST"
 +  end
 +
it "not modify REQUEST_METHOD for POST requests when the params are unparseable" do env = Rack::MockRequest.env_for("/", method: "POST", input: "(%bad-params%)")
      app.call env
diff -Nru ruby-rack-2.2.4/test/spec_mock.rb ruby-rack-2.2.6.4/test/spec_mock.rb --- ruby-rack-2.2.4/test/spec_mock.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/test/spec_mock.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -19,8 +19,8 @@
      req.GET["status"] || 200,
      "Content-Type" => "text/yaml"
    )
- response.set_cookie("session_test", { value: "session_test", domain: ".test.com", path: "/" }) - response.set_cookie("secure_test", { value: "secure_test", domain: ".test.com", path: "/", secure: true }) + response.set_cookie("session_test", { value: "session_test", domain: "test.com", path: "/" }) + response.set_cookie("secure_test", { value: "secure_test", domain: "test.com", path: "/", secure: true }) response.set_cookie("persistent_test", { value: "persistent_test", max_age: 15552000, path: "/" })
    response.finish
  })
 @@ -293,7 +293,7 @@
      res = Rack::MockRequest.new(app).get("")
      session_cookie = res.cookie("session_test")
      session_cookie.value[0].must_equal "session_test"
 -    session_cookie.domain.must_equal ".test.com"
 +    session_cookie.domain.must_equal "test.com"
      session_cookie.path.must_equal "/"
      session_cookie.secure.must_equal false
      session_cookie.expires.must_be_nil
 @@ -314,7 +314,7 @@
      res = Rack::MockRequest.new(app).get("")
      secure_cookie = res.cookie("secure_test")
      secure_cookie.value[0].must_equal "secure_test"
 -    secure_cookie.domain.must_equal ".test.com"
 +    secure_cookie.domain.must_equal "test.com"
      secure_cookie.path.must_equal "/"
      secure_cookie.secure.must_equal true
      secure_cookie.expires.must_be_nil
diff -Nru ruby-rack-2.2.4/test/spec_multipart.rb ruby-rack-2.2.6.4/test/spec_multipart.rb --- ruby-rack-2.2.4/test/spec_multipart.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/test/spec_multipart.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -632,6 +632,18 @@
      end
    end

 +  it "reach a multipart total limit" do
 +    begin
 +      previous_limit = Rack::Utils.multipart_total_part_limit
 +      Rack::Utils.multipart_total_part_limit = 5
 +
+ env = Rack::MockRequest.env_for '/', multipart_fixture(:three_files_three_fields) + lambda { Rack::Multipart.parse_multipart(env) }.must_raise Rack::Multipart::MultipartTotalPartLimitError
 +    ensure
 +      Rack::Utils.multipart_total_part_limit = previous_limit
 +    end
 +  end
 +
    it "return nil if no UploadedFiles were used" do
data = Rack::Multipart.build_multipart("people" => [{ "submit-name" => "Larry", "files" => "contents" }])
      data.must_be_nil
diff -Nru ruby-rack-2.2.4/test/spec_request.rb ruby-rack-2.2.6.4/test/spec_request.rb --- ruby-rack-2.2.4/test/spec_request.rb 2022-07-01 03:48:29.000000000 +0530 +++ ruby-rack-2.2.6.4/test/spec_request.rb 2023-03-13 23:37:51.000000000 +0530
 @@ -1000,7 +1000,7 @@
      f[:tempfile].size.must_equal 76
    end

- it "MultipartPartLimitError when request has too many multipart parts if limit set" do + it "MultipartPartLimitError when request has too many multipart file parts if limit set" do
      begin
data = 10000.times.map { "--AaB03x\r\nContent-Type: text/plain\r\nContent-Disposition: attachment; name=#{SecureRandom.hex(10)}; filename=#{SecureRandom.hex(10)}\r\n\r\ncontents\r\n" }.join("\r\n")
        data += "--AaB03x--\r"
 @@ -1016,6 +1016,22 @@
      end
    end

+ it "MultipartPartLimitError when request has too many multipart total parts if limit set" do
 +    begin
+ data = 10000.times.map { "--AaB03x\r\ncontent-type: text/plain\r\ncontent-disposition: attachment; name=#{SecureRandom.hex(10)}\r\n\r\ncontents\r\n" }.join("\r\n")
 +      data += "--AaB03x--\r"
 +
 +      options = {
 +        "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
 +        "CONTENT_LENGTH" => data.length.to_s,
 +        :input => StringIO.new(data)
 +      }
 +
+ request = make_request Rack::MockRequest.env_for("/", options) + lambda { request.POST }.must_raise Rack::Multipart::MultipartTotalPartLimitError
 +    end
 +  end
 +
it 'closes tempfiles it created in the case of too many created' do
      begin
data = 10000.times.map { "--AaB03x\r\nContent-Type: text/plain\r\nContent-Disposition: attachment; name=#{SecureRandom.hex(10)}; filename=#{SecureRandom.hex(10)}\r\n\r\ncontents\r\n" }.join("\r\n")


--
Sebastian Ramacher

Reply via email to