File CVE-2019-16779.patch of Package rubygem-excon.13680

From ccb57d7a422f020dc74f1de4e8fb505ab46d8a29 Mon Sep 17 00:00:00 2001
From: geemus <geemus@gmail.com>
Date: Thu, 12 Dec 2019 16:45:12 -0600
Subject: [PATCH] fix for leftover data with interrupted persistent connections

Thanks to @pje for disclosure, initial patch, and input
---
 lib/excon/connection.rb   |  8 ++++++++
 tests/connection_tests.rb | 23 +++++++++++++++++++++++
 tests/rackups/basic.rb    |  8 ++++++++
 3 files changed, 39 insertions(+)

diff --git a/lib/excon/connection.rb b/lib/excon/connection.rb
index 86368ef8..275bb775 100644
--- a/lib/excon/connection.rb
+++ b/lib/excon/connection.rb
@@ -262,6 +262,11 @@ def request(params={}, &block)
 
       datum[:connection] = self
 
+      # cleanup data left behind on persistent connection after interrupt
+      if datum[:persistent] && !@persistent_socket_reusable
+        reset
+      end
+
       datum[:stack] = datum[:middlewares].map do |middleware|
         lambda {|stack| middleware.new(stack)}
       end.reverse.inject(self) do |middlewares, middleware|
@@ -270,7 +275,9 @@ def request(params={}, &block)
       datum = datum[:stack].request_call(datum)
 
       unless datum[:pipeline]
+        @persistent_socket_reusable = false
         datum = response(datum)
+        @persistent_socket_reusable = true
 
         if datum[:persistent]
           if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Connection') == 0 }
@@ -344,6 +351,7 @@ def reset
       if old_socket = sockets.delete(@socket_key)
         old_socket.close rescue nil
       end
+      @persistent_socket_reusable = true
     end
 
     # Generate HTTP request verb methods
diff --git a/tests/rackups/basic.rb b/tests/rackups/basic.rb
index 0bddd9ac..af199547 100644
--- a/tests/rackups/basic.rb
+++ b/tests/rackups/basic.rb
@@ -32,6 +32,14 @@ class Basic < Sinatra::Base
     echo
   end
 
+  get('/foo') do
+    'foo'
+  end
+
+  get('/bar') do
+    'bar'
+  end
+
   private
 
   def echo
openSUSE Build Service is sponsored by