Hello community,

here is the log from the commit of package rubygem-rack-1_4 for 
openSUSE:Factory checked in at 2015-06-23 11:58:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-rack-1_4 (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-rack-1_4.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-rack-1_4"

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-rack-1_4/rubygem-rack-1_4.changes        
2014-11-24 11:13:03.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.rubygem-rack-1_4.new/rubygem-rack-1_4.changes   
2015-06-23 11:58:02.000000000 +0200
@@ -1,0 +2,12 @@
+Fri Jun 19 04:32:35 UTC 2015 - co...@suse.com
+
+- updated to version 1.4.7
+  no changelog found
+
+-------------------------------------------------------------------
+Wed Jun 17 04:37:53 UTC 2015 - co...@suse.com
+
+- updated to version 1.4.6
+  no changelog found
+
+-------------------------------------------------------------------

Old:
----
  rack-1.4.5.gem

New:
----
  rack-1.4.7.gem

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rubygem-rack-1_4.spec ++++++
--- /var/tmp/diff_new_pack.4U62Gq/_old  2015-06-23 11:58:02.000000000 +0200
+++ /var/tmp/diff_new_pack.4U62Gq/_new  2015-06-23 11:58:02.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package rubygem-rack-1_4
 #
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -24,7 +24,7 @@
 #
 
 Name:           rubygem-rack-1_4
-Version:        1.4.5
+Version:        1.4.7
 Release:        0
 %define mod_name rack
 %define mod_full_name %{mod_name}-%{version}

++++++ rack-1.4.5.gem -> rack-1.4.7.gem ++++++
Files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/rack/multipart/parser.rb 
new/lib/rack/multipart/parser.rb
--- old/lib/rack/multipart/parser.rb    1970-01-01 01:00:00.000000000 +0100
+++ new/lib/rack/multipart/parser.rb    2015-06-18 23:12:06.000000000 +0200
@@ -2,6 +2,8 @@
 
 module Rack
   module Multipart
+    class MultipartLimitError < Errno::EMFILE; end
+
     class Parser
       BUFSIZE = 16384
 
@@ -14,10 +16,17 @@
 
         fast_forward_to_first_boundary
 
+        opened_files = 0
         loop do
+
           head, filename, content_type, name, body =
             get_current_head_and_filename_and_content_type_and_name_and_body
 
+          if Utils.multipart_part_limit > 0
+            opened_files += 1 if filename
+            raise MultipartLimitError, 'Maximum file multiparts in content 
reached' if opened_files >= Utils.multipart_part_limit
+          end
+
           # Save the rest.
           if i = @buf.index(rx)
             body << @buf.slice!(0, i)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/rack/server.rb new/lib/rack/server.rb
--- old/lib/rack/server.rb      1970-01-01 01:00:00.000000000 +0100
+++ new/lib/rack/server.rb      2015-06-18 23:12:06.000000000 +0200
@@ -337,6 +337,8 @@
         return :exited unless ::File.exist?(options[:pid])
 
         pid = ::File.read(options[:pid]).to_i
+        return :dead if pid == 0
+
         Process.kill(0, pid)
         :running
       rescue Errno::ESRCH
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/rack/utils.rb new/lib/rack/utils.rb
--- old/lib/rack/utils.rb       1970-01-01 01:00:00.000000000 +0100
+++ new/lib/rack/utils.rb       2015-06-18 23:12:06.000000000 +0200
@@ -51,12 +51,23 @@
 
     class << self
       attr_accessor :key_space_limit
+      attr_accessor :param_depth_limit
+      attr_accessor :multipart_part_limit
     end
 
     # The default number of bytes to allow parameter keys to take up.
     # This helps prevent a rogue client from flooding a Request.
     self.key_space_limit = 65536
 
+    # Default depth at which the parameter parser will raise an exception for
+    # being too deep.  This helps prevent SystemStackErrors
+    self.param_depth_limit = 100
+    #
+    # The maximum number of parts a request can contain. Accepting to many part
+    # 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
+
     # Stolen from Mongrel, with some small modifications:
     # Parses a query string by breaking it up at the '&'
     # and ';' characters.  You can also use this to parse
@@ -100,7 +111,9 @@
     end
     module_function :parse_nested_query
 
-    def normalize_params(params, name, v = nil)
+    def normalize_params(params, name, v = nil, depth = 
Utils.param_depth_limit)
+      raise RangeError if depth <= 0
+
       name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
       k = $1 || ''
       after = $' || ''
@@ -118,14 +131,14 @@
         params[k] ||= []
         raise TypeError, "expected Array (got #{params[k].class.name}) for 
param `#{k}'" unless params[k].is_a?(Array)
         if params_hash_type?(params[k].last) && !params[k].last.key?(child_key)
-          normalize_params(params[k].last, child_key, v)
+          normalize_params(params[k].last, child_key, v, depth - 1)
         else
-          params[k] << normalize_params(params.class.new, child_key, v)
+          params[k] << normalize_params(params.class.new, child_key, v, depth 
- 1)
         end
       else
         params[k] ||= params.class.new
         raise TypeError, "expected Hash (got #{params[k].class.name}) for 
param `#{k}'" unless params_hash_type?(params[k])
-        params[k] = normalize_params(params[k], after, v)
+        params[k] = normalize_params(params[k], after, v, depth - 1)
       end
 
       return params
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/rack.rb new/lib/rack.rb
--- old/lib/rack.rb     1970-01-01 01:00:00.000000000 +0100
+++ new/lib/rack.rb     2015-06-18 23:12:06.000000000 +0200
@@ -20,7 +20,7 @@
 
   # Return the Rack release as a dotted string.
   def self.release
-    "1.4"
+    "1.4.7"
   end
 
   autoload :Builder, "rack/builder"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        1970-01-01 01:00:00.000000000 +0100
+++ new/metadata        2015-06-18 23:12:06.000000000 +0200
@@ -1,128 +1,120 @@
---- !ruby/object:Gem::Specification 
+--- !ruby/object:Gem::Specification
 name: rack
-version: !ruby/object:Gem::Version 
-  hash: 13
-  prerelease: 
-  segments: 
-  - 1
-  - 4
-  - 5
-  version: 1.4.5
+version: !ruby/object:Gem::Version
+  version: 1.4.7
 platform: ruby
-authors: 
+authors:
 - Christian Neukirchen
 autorequire: 
 bindir: bin
 cert_chain: []
-
-date: 2013-02-08 00:00:00 Z
-dependencies: 
-- !ruby/object:Gem::Dependency 
+date: 2015-06-18 00:00:00.000000000 Z
+dependencies:
+- !ruby/object:Gem::Dependency
   name: bacon
-  prerelease: false
-  requirement: &id001 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id001
-- !ruby/object:Gem::Dependency 
-  name: rake
   prerelease: false
-  requirement: &id002 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: rake
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id002
-- !ruby/object:Gem::Dependency 
-  name: ruby-fcgi
   prerelease: false
-  requirement: &id003 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: ruby-fcgi
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id003
-- !ruby/object:Gem::Dependency 
-  name: memcache-client
   prerelease: false
-  requirement: &id004 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: memcache-client
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id004
-- !ruby/object:Gem::Dependency 
-  name: mongrel
   prerelease: false
-  requirement: &id005 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3904189667
-        segments: 
-        - 1
-        - 2
-        - 0
-        - pre
-        - 2
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: mongrel
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
         version: 1.2.0.pre2
   type: :development
-  version_requirements: *id005
-- !ruby/object:Gem::Dependency 
-  name: thin
   prerelease: false
-  requirement: &id006 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: 1.2.0.pre2
+- !ruby/object:Gem::Dependency
+  name: thin
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id006
+  prerelease: false
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ">="
+      - !ruby/object:Gem::Version
+        version: '0'
 description: |
   Rack provides a minimal, modular and adaptable interface for developing
   web applications in Ruby.  By wrapping HTTP requests and responses in
   the simplest way possible, it unifies and distills the API for web
   servers, web frameworks, and software in between (the so-called
   middleware) into a single method call.
-  
-  Also see http://rack.github.com/.
 
+  Also see http://rack.github.com/.
 email: chneukirc...@gmail.com
-executables: 
+executables:
 - rackup
 extensions: []
-
-extra_rdoc_files: 
+extra_rdoc_files:
 - README.rdoc
 - KNOWN-ISSUES
-files: 
+files:
+- COPYING
+- KNOWN-ISSUES
+- README.rdoc
+- Rakefile
+- SPEC
 - bin/rackup
 - contrib/rack.png
 - contrib/rack.svg
@@ -131,6 +123,7 @@
 - example/lobster.ru
 - example/protectedlobster.rb
 - example/protectedlobster.ru
+- lib/rack.rb
 - lib/rack/auth/abstract/handler.rb
 - lib/rack/auth/abstract/request.rb
 - lib/rack/auth/basic.rb
@@ -154,6 +147,7 @@
 - lib/rack/directory.rb
 - lib/rack/etag.rb
 - lib/rack/file.rb
+- lib/rack/handler.rb
 - lib/rack/handler/cgi.rb
 - lib/rack/handler/evented_mongrel.rb
 - lib/rack/handler/fastcgi.rb
@@ -163,7 +157,6 @@
 - lib/rack/handler/swiftiplied_mongrel.rb
 - lib/rack/handler/thin.rb
 - lib/rack/handler/webrick.rb
-- lib/rack/handler.rb
 - lib/rack/head.rb
 - lib/rack/lint.rb
 - lib/rack/lobster.rb
@@ -172,10 +165,10 @@
 - lib/rack/methodoverride.rb
 - lib/rack/mime.rb
 - lib/rack/mock.rb
+- lib/rack/multipart.rb
 - lib/rack/multipart/generator.rb
 - lib/rack/multipart/parser.rb
 - lib/rack/multipart/uploaded_file.rb
-- lib/rack/multipart.rb
 - lib/rack/nulllogger.rb
 - lib/rack/recursive.rb
 - lib/rack/reloader.rb
@@ -194,7 +187,7 @@
 - lib/rack/static.rb
 - lib/rack/urlmap.rb
 - lib/rack/utils.rb
-- lib/rack.rb
+- rack.gemspec
 - test/builder/anything.rb
 - test/builder/comment.ru
 - test/builder/end.ru
@@ -207,6 +200,7 @@
 - test/cgi/assets/javascripts/app.js
 - test/cgi/assets/stylesheets/app.css
 - test/cgi/lighttpd.conf
+- test/cgi/lighttpd.errors
 - test/cgi/rackup_stub.rb
 - test/cgi/sample_rackup.ru
 - test/cgi/test
@@ -234,6 +228,7 @@
 - test/multipart/none
 - test/multipart/semicolon
 - test/multipart/text
+- test/multipart/three_files_three_fields
 - test/multipart/webkit
 - test/rackup/config.ru
 - test/registering_handler/rack/handler/registering_myself.rb
@@ -289,46 +284,30 @@
 - test/testrequest.rb
 - test/unregistered_handler/rack/handler/unregistered.rb
 - test/unregistered_handler/rack/handler/unregistered_long_one.rb
-- COPYING
-- KNOWN-ISSUES
-- rack.gemspec
-- Rakefile
-- README.rdoc
-- SPEC
 homepage: http://rack.github.com/
 licenses: []
-
+metadata: {}
 post_install_message: 
 rdoc_options: []
-
-require_paths: 
+require_paths:
 - lib
-required_ruby_version: !ruby/object:Gem::Requirement 
-  none: false
-  requirements: 
+required_ruby_version: !ruby/object:Gem::Requirement
+  requirements:
   - - ">="
-    - !ruby/object:Gem::Version 
-      hash: 3
-      segments: 
-      - 0
-      version: "0"
-required_rubygems_version: !ruby/object:Gem::Requirement 
-  none: false
-  requirements: 
+    - !ruby/object:Gem::Version
+      version: '0'
+required_rubygems_version: !ruby/object:Gem::Requirement
+  requirements:
   - - ">="
-    - !ruby/object:Gem::Version 
-      hash: 3
-      segments: 
-      - 0
-      version: "0"
+    - !ruby/object:Gem::Version
+      version: '0'
 requirements: []
-
 rubyforge_project: rack
-rubygems_version: 1.8.24
+rubygems_version: 2.4.5
 signing_key: 
-specification_version: 3
+specification_version: 4
 summary: a modular Ruby webserver interface
-test_files: 
+test_files:
 - test/spec_auth.rb
 - test/spec_auth_basic.rb
 - test/spec_auth_digest.rb
@@ -376,4 +355,3 @@
 - test/spec_urlmap.rb
 - test/spec_utils.rb
 - test/spec_webrick.rb
-has_rdoc: 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rack.gemspec new/rack.gemspec
--- old/rack.gemspec    1970-01-01 01:00:00.000000000 +0100
+++ new/rack.gemspec    2015-06-18 23:12:06.000000000 +0200
@@ -1,6 +1,6 @@
 Gem::Specification.new do |s|
   s.name            = "rack"
-  s.version         = "1.4.5"
+  s.version         = "1.4.7"
   s.platform        = Gem::Platform::RUBY
   s.summary         = "a modular Ruby webserver interface"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/cgi/lighttpd.errors new/test/cgi/lighttpd.errors
--- old/test/cgi/lighttpd.errors        1970-01-01 01:00:00.000000000 +0100
+++ new/test/cgi/lighttpd.errors        2015-06-18 23:12:06.000000000 +0200
@@ -0,0 +1 @@
+2015-06-16 14:11:43: (log.c.164) server started 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/multipart/three_files_three_fields 
new/test/multipart/three_files_three_fields
--- old/test/multipart/three_files_three_fields 1970-01-01 01:00:00.000000000 
+0100
+++ new/test/multipart/three_files_three_fields 2015-06-18 23:12:06.000000000 
+0200
@@ -0,0 +1,31 @@
+--AaB03x
+content-disposition: form-data; name="reply"
+
+yes
+--AaB03x
+content-disposition: form-data; name="to"
+
+people
+--AaB03x
+content-disposition: form-data; name="from"
+
+others
+--AaB03x
+content-disposition: form-data; name="fileupload1"; filename="file1.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg
+--AaB03x
+content-disposition: form-data; name="fileupload2"; filename="file2.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg
+--AaB03x
+content-disposition: form-data; name="fileupload3"; filename="file3.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg
+--AaB03x--
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/spec_multipart.rb new/test/spec_multipart.rb
--- old/test/spec_multipart.rb  1970-01-01 01:00:00.000000000 +0100
+++ new/test/spec_multipart.rb  2015-06-18 23:12:06.000000000 +0200
@@ -364,22 +364,56 @@
   end
 
   it "builds complete params with the chunk size of 16384 slicing exactly on 
boundary" do
-    data = File.open(multipart_file("fail_16384_nofile")) { |f| f.read 
}.gsub(/\n/, "\r\n")
-    options = {
-      "CONTENT_TYPE" => "multipart/form-data; 
boundary=----WebKitFormBoundaryWsY0GnpbI5U7ztzo",
-      "CONTENT_LENGTH" => data.length.to_s,
-      :input => StringIO.new(data)
-    }
-    env = Rack::MockRequest.env_for("/", options)
-    params = Rack::Multipart.parse_multipart(env)
-
-    params.should.not.equal nil
-    params.keys.should.include "AAAAAAAAAAAAAAAAAAA"
-    params["AAAAAAAAAAAAAAAAAAA"].keys.should.include 
"PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"
-    
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"].keys.should.include
 "new"
-    
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"].keys.should.include
 "-2"
-    
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"].keys.should.include
 "ba_unit_id"
-    
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"]["ba_unit_id"].should.equal
 "1017"
+    begin
+      previous_limit = Rack::Utils.multipart_part_limit
+      Rack::Utils.multipart_part_limit = 256
+
+      data = File.open(multipart_file("fail_16384_nofile"), 'rb') { |f| f.read 
}.gsub(/\n/, "\r\n")
+      options = {
+        "CONTENT_TYPE" => "multipart/form-data; 
boundary=----WebKitFormBoundaryWsY0GnpbI5U7ztzo",
+        "CONTENT_LENGTH" => data.length.to_s,
+        :input => StringIO.new(data)
+      }
+      env = Rack::MockRequest.env_for("/", options)
+      params = Rack::Multipart.parse_multipart(env)
+
+      params.should.not.equal nil
+      params.keys.should.include "AAAAAAAAAAAAAAAAAAA"
+      params["AAAAAAAAAAAAAAAAAAA"].keys.should.include 
"PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"
+      
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"].keys.should.include
 "new"
+      
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"].keys.should.include
 "-2"
+      
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"].keys.should.include
 "ba_unit_id"
+      
params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"]["ba_unit_id"].should.equal
 "1017"
+    ensure
+      Rack::Utils.multipart_part_limit = previous_limit
+    end
+  end
+
+ should "not reach a multi-part limit" do
+    begin
+      previous_limit = Rack::Utils.multipart_part_limit
+      Rack::Utils.multipart_part_limit = 4
+
+      env = Rack::MockRequest.env_for '/', 
multipart_fixture(:three_files_three_fields)
+      params = Rack::Multipart.parse_multipart(env)
+      params['reply'].should.equal 'yes'
+      params['to'].should.equal 'people'
+      params['from'].should.equal 'others'
+    ensure
+      Rack::Utils.multipart_part_limit = previous_limit
+    end
+  end
+
+  should "reach a multipart limit" do
+    begin
+      previous_limit = Rack::Utils.multipart_part_limit
+      Rack::Utils.multipart_part_limit = 3
+
+      env = Rack::MockRequest.env_for '/', 
multipart_fixture(:three_files_three_fields)
+      lambda { Rack::Multipart.parse_multipart(env) 
}.should.raise(Rack::Multipart::MultipartLimitError)
+    ensure
+      Rack::Utils.multipart_part_limit = previous_limit
+    end
   end
 
   should "return nil if no UploadedFiles were used" do
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/spec_request.rb new/test/spec_request.rb
--- old/test/spec_request.rb    1970-01-01 01:00:00.000000000 +0100
+++ new/test/spec_request.rb    2015-06-18 23:12:06.000000000 +0200
@@ -2,6 +2,7 @@
 require 'cgi'
 require 'rack/request'
 require 'rack/mock'
+require 'securerandom'
 
 describe Rack::Request do
   should "wrap the rack variables" do
@@ -613,6 +614,22 @@
     f[:tempfile].size.should.equal 76
   end
 
+  should "MultipartLimitError when request has too many multipart 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"
+
+      options = {
+        "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+        "CONTENT_LENGTH" => data.length.to_s,
+        :input => StringIO.new(data)
+      }
+
+      request = Rack::Request.new Rack::MockRequest.env_for("/", options)
+      lambda { request.POST 
}.should.raise(Rack::Multipart::MultipartLimitError)
+    end
+  end
+
   should "parse big multipart form data" do
     input = <<EOF
 --AaB03x\r
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/test/spec_utils.rb new/test/spec_utils.rb
--- old/test/spec_utils.rb      1970-01-01 01:00:00.000000000 +0100
+++ new/test/spec_utils.rb      2015-06-18 23:12:06.000000000 +0200
@@ -123,6 +123,18 @@
     Rack::Utils.parse_query(",foo=bar;,", ";,").should.equal "foo" => "bar"
   end
 
+  should "raise an exception if the params are too deep" do
+    len = Rack::Utils.param_depth_limit
+
+    lambda {
+      Rack::Utils.parse_nested_query("foo#{"[a]" * len}=bar")
+    }.should.raise(RangeError)
+
+    lambda {
+      Rack::Utils.parse_nested_query("foo#{"[a]" * (len - 1)}=bar")
+    }.should.not.raise
+  end
+
   should "parse nested query strings correctly" do
     Rack::Utils.parse_nested_query("foo").
       should.equal "foo" => nil


Reply via email to