Compare commits

...

13 Commits

Author SHA1 Message Date
Charlie Somerville
7403667b89 Merge pull request #67 from github/2-3-github+cve-2014-0130
CVE-2014-0130 protection
2014-05-10 00:52:08 +10:00
Charlie Somerville
1a45ec57bf CVE-2014-0130 protection 2014-05-09 23:55:20 +10:00
Patrick Toomey
1e6e438f6e Update RAILS_VERSION 2014-04-24 10:45:25 -05:00
Patrick Toomey
2b01f832a3 Merge pull request #63 from github/memoize-nil-check
make sure nil isn't memoized and frozen
2014-04-24 10:44:47 -05:00
Patrick Toomey
1e5fda763e backport memoiziation from 3.0 2014-04-24 10:24:04 -05:00
Dirkjan Bussink
7c3d4ec43c Bump version 2014-03-31 13:43:08 +02:00
Dirkjan Bussink
7343ed7b05 Merge pull request #53 from github/dbussink/no-toplevel-exception-rescue
We shouldn't try to rescue every type of exception here
2014-03-31 11:42:02 +00:00
Dirkjan Bussink
2a70c9691d We shouldn't try to rescue every type of exception here 2014-03-31 13:35:28 +02:00
Dirkjan Bussink
a141d9de0d bump 2.3.14.github41 2014-03-27 13:55:26 +01:00
Dirkjan Bussink
74492f43a8 Merge pull request #51 from github/dbussink/fix-logging-frozen-string-query
Dup string before changing encoding because it might be frozen
2014-03-27 12:53:25 +00:00
Dirkjan Bussink
c2894170bf Dup string before changing encoding because it might be frozen
Calling String#force_encoding! on a frozen string throws an exception.
By dupping the string we prevent this from happening.
2014-03-27 13:47:08 +01:00
Charlie Somerville
057aed6e18 Merge pull request #48 from github/2-3-kill-backtick-monkey-patch
[2.3] Kill Object#` monkey patch
2014-02-23 23:20:47 +11:00
Charlie Somerville
02fc012b42 kill Object#` monkey patch 2014-02-23 23:17:44 +11:00
8 changed files with 30 additions and 32 deletions

View File

@@ -1 +1 @@
2.3.14.github40 2.3.14.github43

View File

@@ -1320,7 +1320,14 @@ module ActionController #:nodoc:
render render
end end
CVE_2014_0310 = Class.new(StandardError)
def perform_action def perform_action
# CVE-2014-0130 protection
if action_name.include? "/"
raise CVE_2014_0310
end
if action_methods.include?(action_name) if action_methods.include?(action_name)
send(action_name) send(action_name)
default_render unless performed? default_render unless performed?

View File

@@ -195,7 +195,9 @@ module ActiveRecord
def log_info(sql, name, ms) def log_info(sql, name, ms)
if @logger && @logger.debug? if @logger && @logger.debug?
name = '%s (%.1fms)' % [name || 'SQL', ms] name = '%s (%.1fms)' % [name || 'SQL', ms]
sql.force_encoding 'binary' if sql.respond_to?(:force_encoding) if sql.respond_to?(:force_encoding)
sql = sql.dup.force_encoding 'binary'
end
@logger.debug(format_log_entry(name, sql.squeeze(' '))) @logger.debug(format_log_entry(name, sql.squeeze(' ')))
end end
end end
@@ -212,13 +214,7 @@ module ActiveRecord
log_info(sql, name, 0) log_info(sql, name, 0)
nil nil
end end
rescue SystemExit, SignalException, NoMemoryError => e rescue => e
# Don't re-wrap these exceptions. They are probably not being caused by invalid
# sql, but rather some external stimulus beyond the responsibilty of this code.
# Additionaly, wrapping these exceptions with StatementInvalid would lead to
# meaningful loss of data, such as losing SystemExit#status.
raise e
rescue Exception => e
# Log message and raise exception. # Log message and raise exception.
# Set last_verification to 0, so that connection gets verified # Set last_verification to 0, so that connection gets verified
# upon reentering the request loop # upon reentering the request loop

View File

@@ -1,5 +1,4 @@
require 'active_support/core_ext/kernel/daemonizing' require 'active_support/core_ext/kernel/daemonizing'
require 'active_support/core_ext/kernel/reporting' require 'active_support/core_ext/kernel/reporting'
require 'active_support/core_ext/kernel/agnostics'
require 'active_support/core_ext/kernel/requires' require 'active_support/core_ext/kernel/requires'
require 'active_support/core_ext/kernel/debugger' require 'active_support/core_ext/kernel/debugger'

View File

@@ -1,11 +0,0 @@
class Object
# Makes backticks behave (somewhat more) similarly on all platforms.
# On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
# spawned shell prints a message to stderr and sets $?. We emulate
# Unix on the former but not the latter.
def `(command) #:nodoc:
super
rescue Errno::ENOENT => e
STDERR.puts "#$0: #{e}"
end
end

View File

@@ -1,3 +1,6 @@
require 'active_support/core_ext/kernel/singleton_class'
require 'active_support/core_ext/module/aliasing'
module ActiveSupport module ActiveSupport
module Memoizable module Memoizable
def self.memoized_ivar_for(symbol) def self.memoized_ivar_for(symbol)
@@ -41,10 +44,10 @@ module ActiveSupport
end end
end end
def flush_cache(*syms, &block) def flush_cache(*syms)
syms.each do |sym| syms.each do |sym|
(methods + private_methods + protected_methods).each do |m| (methods + private_methods + protected_methods).each do |m|
if m.to_s =~ /^_unmemoized_(#{sym})/ if m.to_s =~ /^_unmemoized_(#{sym.to_s.gsub(/\?\Z/, '\?')})/
ivar = ActiveSupport::Memoizable.memoized_ivar_for($1) ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
instance_variable_get(ivar).clear if instance_variable_defined?(ivar) instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
end end
@@ -69,7 +72,7 @@ module ActiveSupport
if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0 if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0
def #{symbol}(reload = false) # def mime_type(reload = false) def #{symbol}(reload = false) # def mime_type(reload = false)
if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty? if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
#{memoized_ivar} = [#{original_method}.freeze] # @_memoized_mime_type = [_unmemoized_mime_type.freeze] #{memoized_ivar} = [#{original_method}] # @_memoized_mime_type = [_unmemoized_mime_type]
end # end end # end
#{memoized_ivar}[0] # @_memoized_mime_type[0] #{memoized_ivar}[0] # @_memoized_mime_type[0]
end # end end # end
@@ -82,7 +85,7 @@ module ActiveSupport
if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args) if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
#{memoized_ivar}[args] # @_memoized_mime_type[args] #{memoized_ivar}[args] # @_memoized_mime_type[args]
elsif #{memoized_ivar} # elsif @_memoized_mime_type elsif #{memoized_ivar} # elsif @_memoized_mime_type
#{memoized_ivar}[args] = #{original_method}(*args).freeze # @_memoized_mime_type[args] = _unmemoized_mime_type(*args).freeze #{memoized_ivar}[args] = #{original_method}(*args) # @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
end # end end # end
else # else else # else
#{original_method}(*args) # _unmemoized_mime_type(*args) #{original_method}(*args) # _unmemoized_mime_type(*args)

View File

@@ -1,3 +1,4 @@
require 'abstract_unit'
require 'active_support' require 'active_support'
require 'test/unit' require 'test/unit'

View File

@@ -4,12 +4,13 @@ class MemoizableTest < Test::Unit::TestCase
class Person class Person
extend ActiveSupport::Memoizable extend ActiveSupport::Memoizable
attr_reader :name_calls, :age_calls, :is_developer_calls attr_reader :name_calls, :age_calls, :is_developer_calls, :name_query_calls
def initialize def initialize
@name_calls = 0 @name_calls = 0
@age_calls = 0 @age_calls = 0
@is_developer_calls = 0 @is_developer_calls = 0
@name_query_calls = 0
end end
def name def name
@@ -18,6 +19,7 @@ class MemoizableTest < Test::Unit::TestCase
end end
def name? def name?
@name_query_calls += 1
true true
end end
memoize :name? memoize :name?
@@ -123,6 +125,13 @@ class MemoizableTest < Test::Unit::TestCase
end end
end end
def test_memoization_flush_with_punctuation
assert_equal true, @person.name?
@person.flush_cache(:name?)
3.times { assert_equal true, @person.name? }
assert_equal 2, @person.name_query_calls
end
def test_memoization_with_nil_value def test_memoization_with_nil_value
assert_equal nil, @person.age assert_equal nil, @person.age
assert_equal 1, @person.age_calls assert_equal 1, @person.age_calls
@@ -131,13 +140,7 @@ class MemoizableTest < Test::Unit::TestCase
assert_equal 1, @person.age_calls assert_equal 1, @person.age_calls
end end
def test_memorized_results_are_immutable
assert_equal "Josh", @person.name
assert_raise(ActiveSupport::FrozenObjectError) { @person.name.gsub!("Josh", "Gosh") }
end
def test_reloadable def test_reloadable
counter = @calculator.counter
assert_equal 1, @calculator.counter assert_equal 1, @calculator.counter
assert_equal 2, @calculator.counter(:reload) assert_equal 2, @calculator.counter(:reload)
assert_equal 2, @calculator.counter assert_equal 2, @calculator.counter