File CVE-2024-45614.patch of Package rubygem-puma.35973

From cac3fd18cf29ed43719ff5d52d9cfec215f0a043 Mon Sep 17 00:00:00 2001
From: Evan Phoenix <evan@phx.io>
Date: Wed, 18 Sep 2024 21:56:07 -0700
Subject: [PATCH] Merge commit from fork

* Prevent underscores from clobbering hyphen headers

* Special case encoding headers to prevent app confusion

* Handle _ as , in jruby as well

Co-authored-by: Patrik Ragnarsson <patrik@starkast.net>

diff --git a/ext/puma_http11/org/jruby/puma/Http11.java b/ext/puma_http11/org/jruby/puma/Http11.java
index 2a260a66..8fca5ebe 100644
--- a/ext/puma_http11/org/jruby/puma/Http11.java
+++ b/ext/puma_http11/org/jruby/puma/Http11.java
@@ -99,6 +99,8 @@ public class Http11 extends RubyObject {
             int bite = b.get(i) & 0xFF;
             if(bite == '-') {
                 b.set(i, (byte)'_');
+            } else if(bite == '_') {
+                b.set(i, (byte)',');
             } else {
                 b.set(i, (byte)Character.toUpperCase(bite));
             }
diff --git a/lib/puma/const.rb b/lib/puma/const.rb
index 2e9fcbd1..abb1ae00 100644
--- a/lib/puma/const.rb
+++ b/lib/puma/const.rb
@@ -241,5 +241,9 @@ module Puma
     # Mininum interval to checks worker health
     WORKER_CHECK_INTERVAL = 5
 
+    UNMASKABLE_HEADERS = {
+      "HTTP_TRANSFER,ENCODING" => true,
+      "HTTP_CONTENT,LENGTH" => true,
+    }
   end
 end
diff --git a/lib/puma/server.rb b/lib/puma/server.rb
index 84515d7b..131a0d24 100644
--- a/lib/puma/server.rb
+++ b/lib/puma/server.rb
@@ -697,23 +697,30 @@ module Puma
       to_add = nil
 
       env.each do |k,v|
-        if k.start_with?("HTTP_") and k.include?(",") and k != "HTTP_TRANSFER,ENCODING"
+        if k.start_with?("HTTP_") && k.include?(",") && !UNMASKABLE_HEADERS.key?(k)
           if to_delete
             to_delete << k
           else
             to_delete = [k]
           end
 
+          new_k = k.tr(",", "_")
+          if env.key?(new_k)
+            next
+          end
+
           unless to_add
             to_add = {}
           end
 
-          to_add[k.tr(",", "_")] = v
+          to_add[new_k] = v
         end
       end
 
       if to_delete
         to_delete.each { |k| env.delete(k) }
+      end
+      if to_add
         env.merge! to_add
       end
 
openSUSE Build Service is sponsored by