summary refs log tree commit
diff options
context:
space:
mode:
authorJordan Raine <jnraine@gmail.com>2017-05-12 14:00:36 -0700
committerJordan Raine <jnraine@gmail.com>2017-05-12 14:00:36 -0700
commit3131f5796b7b0fee9aab7c51bec205cf2fac7cc3 (patch)
tree56d4fd2aa6ff296da3b61adc0c0f516ac08198cb
parenta0557f70d44f07ec2c651945d66102cf973c916f (diff)
downloadrack-3131f5796b7b0fee9aab7c51bec205cf2fac7cc3.tar.gz
Safely handle modules in hierarchy
Adds a check before calling `superclass` on an ancestor of a subclass of `Rack::ID` to avoid calling `superclass` on `Module`, which does not implement it.

Here is an code example that causes exercises this special case:

```ruby
ID = Class.new
IDChild = Class.new(ID)
MyMod = Module.new
Foo = Class.new(IDChild)
Foo.include(MyMod)

Foo.ancestors.find { |kl| kl.superclass == ID }
# NoMethodError: undefined method `superclass' for MyMod:Module

Foo.ancestors.find { |kl| kl.respond_to?(:superclass) && kl.superclass == ID }
# => IDChild
```
-rw-r--r--lib/rack/session/abstract/id.rb2
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/rack/session/abstract/id.rb b/lib/rack/session/abstract/id.rb
index d12b3b53..1bb8d5d0 100644
--- a/lib/rack/session/abstract/id.rb
+++ b/lib/rack/session/abstract/id.rb
@@ -408,7 +408,7 @@ module Rack
 
       class ID < Persisted
         def self.inherited(klass)
-          k = klass.ancestors.find { |kl| kl.superclass == ID }
+          k = klass.ancestors.find { |kl| kl.respond_to?(:superclass) && kl.superclass == ID }
           unless k.instance_variable_defined?(:"@_rack_warned")
             warn "#{klass} is inheriting from #{ID}.  Inheriting from #{ID} is deprecated, please inherit from #{Persisted} instead" if $VERBOSE
             k.instance_variable_set(:"@_rack_warned", true)