Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rubygem-rack-2.2 for 
openSUSE:Factory checked in at 2025-10-09 15:06:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-rack-2.2 (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-rack-2.2.new.11973 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-rack-2.2"

Thu Oct  9 15:06:59 2025 rev:17 rq:1309946 version:2.2.19

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-rack-2.2/rubygem-rack-2.2.changes        
2025-09-29 16:34:46.204819961 +0200
+++ 
/work/SRC/openSUSE:Factory/.rubygem-rack-2.2.new.11973/rubygem-rack-2.2.changes 
    2025-10-09 15:09:25.370014165 +0200
@@ -1,0 +2,9 @@
+Thu Oct  9 09:56:43 UTC 2025 - Daniel Donisa <[email protected]>
+
+- update to version 2.2.19
+
+   * [CVE-2025-61772] Multipart parser buffers unbounded per-part headers, 
enabling DoS (memory exhaustion)
+   * [CVE-2025-61771] Multipart parser buffers large non‑file fields entirely 
in memory, enabling DoS (memory exhaustion)
+   * [CVE-2025-61770] Unbounded multipart preamble buffering enables DoS 
(memory exhaustion)
+
+-------------------------------------------------------------------

Old:
----
  rack-2.2.18.gem

New:
----
  rack-2.2.19.gem

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

Other differences:
------------------
++++++ rubygem-rack-2.2.spec ++++++
--- /var/tmp/diff_new_pack.bUAj4x/_old  2025-10-09 15:09:26.018041517 +0200
+++ /var/tmp/diff_new_pack.bUAj4x/_new  2025-10-09 15:09:26.026041855 +0200
@@ -24,7 +24,7 @@
 #
 
 Name:           rubygem-rack-2.2
-Version:        2.2.18
+Version:        2.2.19
 Release:        0
 %define mod_name rack
 %define mod_full_name %{mod_name}-%{version}
@@ -57,7 +57,7 @@
 %install
 %gem_install \
   --symlink-binaries \
-  --doc-files="CHANGELOG.md MIT-LICENSE README.rdoc" \
+  --doc-files="CHANGELOG.md CONTRIBUTING.md MIT-LICENSE README.rdoc" \
   -f
 # MANUAL
 %fdupes %{buildroot}%{_libdir}/ruby/gems/*/gems/%{mod_name}-%{version}/

++++++ rack-2.2.18.gem -> rack-2.2.19.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md
--- old/CHANGELOG.md    1980-01-02 01:00:00.000000000 +0100
+++ new/CHANGELOG.md    1980-01-02 01:00:00.000000000 +0100
@@ -2,8 +2,18 @@
 
 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.19] - 2025-10-07
+
+### Security
+
+- [CVE-2025-61772](https://github.com/advisories/GHSA-wpv5-97wm-hp9c) 
Multipart parser buffers unbounded per-part headers, enabling DoS (memory 
exhaustion)
+- [CVE-2025-61771](https://github.com/advisories/GHSA-w9pc-fmgc-vxvw) 
Multipart parser buffers large non‑file fields entirely in memory, enabling DoS 
(memory exhaustion)
+- [CVE-2025-61770](https://github.com/advisories/GHSA-p543-xpfm-54cp) 
Unbounded multipart preamble buffering enables DoS (memory exhaustion)
+
 ## [2.2.18] - 2025-09-25
 
+### Security
+
 - 
[CVE-2025-59830](https://github.com/rack/rack/security/advisories/GHSA-625h-95r8-8xpm)
 Unbounded parameter parsing in `Rack::QueryParser` can lead to memory 
exhaustion via semicolon-separated parameters.
 
 ## [2.2.17] - 2025-06-03
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README.rdoc new/README.rdoc
--- old/README.rdoc     1980-01-02 01:00:00.000000000 +0100
+++ new/README.rdoc     1980-01-02 01:00:00.000000000 +0100
@@ -206,6 +206,14 @@
 used multiple times in the query, each counts as a separate parameter for
 this check.
 
+=== `RACK_MULTIPART_BUFFERED_UPLOAD_BYTESIZE_LIMIT`
+
+This environment variable sets the maximum amount of memory Rack will use
+to buffer multipart parameters when parsing a request body. This considers
+the size of the multipart mime headers and the body part for multipart
+parameters that are buffered in memory and do not use tempfiles. This
+defaults to 16MB if not provided.
+
 === key_space_limit
 
 The default number of bytes to allow all parameters keys in a given parameter 
hash to take up.
Binary 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    1980-01-02 01:00:00.000000000 +0100
+++ new/lib/rack/multipart/parser.rb    1980-01-02 01:00:00.000000000 +0100
@@ -20,6 +20,27 @@
 
       BOUNDARY_REGEX = /\A([^\n]*(?:\n|\Z))/
 
+      BOUNDARY_START_LIMIT = 16 * 1024
+      private_constant :BOUNDARY_START_LIMIT
+
+      MIME_HEADER_BYTESIZE_LIMIT = 64 * 1024
+      private_constant :MIME_HEADER_BYTESIZE_LIMIT
+
+      env_int = lambda do |key, val|
+        if str_val = ENV[key]
+          begin
+            val = Integer(str_val, 10)
+          rescue ArgumentError
+            raise ArgumentError, "non-integer value provided for environment 
variable #{key}"
+          end
+        end
+
+        val
+      end
+
+      BUFFERED_UPLOAD_BYTESIZE_LIMIT = 
env_int.call("RACK_MULTIPART_BUFFERED_UPLOAD_BYTESIZE_LIMIT", 16 * 1024 * 1024)
+      private_constant :BUFFERED_UPLOAD_BYTESIZE_LIMIT
+
       class BoundedIO # :nodoc:
         def initialize(io, content_length)
           @io             = io
@@ -187,6 +208,8 @@
         @end_boundary = @boundary + '--'
         @state = :FAST_FORWARD
         @mime_index = 0
+        @body_retained = nil
+        @retained_size = 0
         @collector = Collector.new tempfile
 
         @sbuf = StringScanner.new("".dup)
@@ -241,7 +264,13 @@
           @state = :MIME_HEAD
         else
           raise EOFError, "bad content body" if @sbuf.rest_size >= @bufsize
-          :want_read
+
+          # We raise if we don't find the multipart boundary, to avoid 
unbounded memory
+          # buffering. Note that the actual limit is the higher of 16KB and 
the buffer size (1MB by default)
+          raise EOFError, "multipart boundary not found within limit" if 
@sbuf.string.bytesize > BOUNDARY_START_LIMIT
+
+          # no boundary found, keep reading data
+          return :want_read
         end
       end
 
@@ -271,16 +300,30 @@
             name = filename || "#{content_type || TEXT_PLAIN}[]".dup
           end
 
+          # Mime part head data is retained for both TempfilePart and 
BufferPart
+          # for the entireity of the parse, even though it isn't used for 
BufferPart.
+          update_retained_size(head.bytesize)
+
+          # If a filename is given, a TempfilePart will be used, so the body 
will
+          # not be buffered in memory. However, if a filename is not given, a 
BufferPart
+          # will be used, and the body will be buffered in memory.
+          @body_retained = !filename
+
           @collector.on_mime_head @mime_index, head, filename, content_type, 
name
           @state = :MIME_BODY
         else
-          :want_read
+          # We raise if the mime part header is too large, to avoid unbounded 
memory
+          # buffering. Note that the actual limit is the higher of 64KB and 
the buffer size (1MB by default)
+          raise EOFError, "multipart mime part header too large" if 
@sbuf.string.bytesize > MIME_HEADER_BYTESIZE_LIMIT
+
+          return :want_read
         end
       end
 
       def handle_mime_body
         if (body_with_boundary = @sbuf.check_until(@body_regex)) # check but 
do not advance the pointer yet
           body = body_with_boundary.sub(/#{@body_regex}\z/m, '') # remove the 
boundary from the string
+          update_retained_size(body.bytesize) if @body_retained
           @collector.on_mime_body @mime_index, body
           @sbuf.pos += body.length + 2 # skip \r\n after the content
           @state = :CONSUME_TOKEN
@@ -289,7 +332,9 @@
           # Save what we have so far
           if @rx_max_size < @sbuf.rest_size
             delta = @sbuf.rest_size - @rx_max_size
-            @collector.on_mime_body @mime_index, @sbuf.peek(delta)
+            body = @sbuf.peek(delta)
+            update_retained_size(body.bytesize) if @body_retained
+            @collector.on_mime_body @mime_index, body
             @sbuf.pos += delta
             @sbuf.string = @sbuf.rest
           end
@@ -299,6 +344,17 @@
 
       def full_boundary; @full_boundary; end
 
+      def update_retained_size(size)
+        @retained_size += size
+        if @retained_size > BUFFERED_UPLOAD_BYTESIZE_LIMIT
+          raise EOFError, "multipart data over retained size limit"
+        end
+      end
+
+      # Scan until the we find the start or end of the boundary.
+      # If we find it, return the appropriate symbol for the start or
+      # end of the boundary.  If we don't find the start or end of the
+      # boundary, clear the buffer and return nil.
       def consume_boundary
         while read_buffer = @sbuf.scan_until(BOUNDARY_REGEX)
           case read_buffer.strip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/rack/version.rb new/lib/rack/version.rb
--- old/lib/rack/version.rb     1980-01-02 01:00:00.000000000 +0100
+++ new/lib/rack/version.rb     1980-01-02 01:00:00.000000000 +0100
@@ -20,7 +20,7 @@
     VERSION.join(".")
   end
 
-  RELEASE = "2.2.18"
+  RELEASE = "2.2.19"
 
   # Return the Rack release as a dotted string.
   def self.release
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        1980-01-02 01:00:00.000000000 +0100
+++ new/metadata        1980-01-02 01:00:00.000000000 +0100
@@ -1,7 +1,7 @@
 --- !ruby/object:Gem::Specification
 name: rack
 version: !ruby/object:Gem::Version
-  version: 2.2.18
+  version: 2.2.19
 platform: ruby
 authors:
 - Leah Neukirchen

++++++ rubygem-rack-rpmlintrc ++++++
--- /var/tmp/diff_new_pack.bUAj4x/_old  2025-10-09 15:09:26.306053673 +0200
+++ /var/tmp/diff_new_pack.bUAj4x/_new  2025-10-09 15:09:26.314054011 +0200
@@ -1,3 +1,2 @@
-addFilter('wrong-script-interpreter.*rackup')
-addFilter('script-without-shebang')
+addFilter("update-alternatives-postun-call-missing")
 

Reply via email to