From e23dfac8d40ee94f0cbe4d7eddacb7c0bd9981fd Mon Sep 17 00:00:00 2001 From: Aliaksey Kandratsenka Date: Sat, 6 Sep 2008 11:24:08 +0300 Subject: [PATCH] made #validates_numericality_of reject huge numbers which parse as infinity --- activerecord/lib/active_record/validations.rb | 5 +++++ activerecord/test/cases/validations_test.rb | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index ed36652..dbd1d58 100644 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -898,9 +898,14 @@ module ActiveRecord end raw_value = raw_value.to_i else + ok = false begin + orig_value = raw_value raw_value = Kernel.Float(raw_value) + ok = orig_value.kind_of?(Float) || raw_value.finite? rescue ArgumentError, TypeError + end + unless ok record.errors.add(attr_name, :not_a_number, :value => raw_value, :default => configuration[:message]) next end diff --git a/activerecord/test/cases/validations_test.rb b/activerecord/test/cases/validations_test.rb index c049659..066e5ab 100644 --- a/activerecord/test/cases/validations_test.rb +++ b/activerecord/test/cases/validations_test.rb @@ -1436,6 +1436,21 @@ class ValidatesNumericalityTest < ActiveRecord::TestCase valid!(FLOATS + INTEGERS + BIGDECIMAL + INFINITY) end + # large numbers parse as infinity and should not validate as numbers + def test_infinity + Topic.validates_numericality_of :approved + + largepos = "1e400" + largeneg = "-1e400" + + with_each_topic_approved_value([largepos, largeneg]) do |topic,value| + silence_warnings do # silence warnings about parsing huge floats + assert !topic.valid?, "#{value.inspect} not rejected as a number" + end + assert topic.errors.on(:approved) + end + end + def test_validates_numericality_of_with_nil_allowed Topic.validates_numericality_of :approved, :allow_nil => true -- 1.5.6.5