From 2ca683083148ef481f69e3fc98fdab7736d659cb Mon Sep 17 00:00:00 2001 From: utilum Date: Fri, 18 Oct 2019 13:58:58 +0200 Subject: [PATCH] TypeError Regexp#match?(nil) in Ruby Head Aa of ruby/ruby@2a22a6b2d8465934e75520a7fdcf522d50890caf calling `Regexp#match?(nil)` raises an exception. [utilum, eregon, eugeneius] --- .../action_controller/metal/request_forgery_protection.rb | 2 +- actionpack/lib/action_dispatch/http/mime_type.rb | 2 +- actionpack/lib/action_dispatch/http/request.rb | 3 ++- actionpack/lib/action_dispatch/journey/formatter.rb | 2 +- actionpack/lib/action_dispatch/routing/mapper.rb | 4 ++-- actionview/lib/action_view/layouts.rb | 7 ++++++- activemodel/test/validators/email_validator.rb | 2 +- .../active_record/connection_adapters/abstract_adapter.rb | 4 +++- .../connection_adapters/mysql/schema_statements.rb | 2 +- .../connection_adapters/postgresql_adapter.rb | 2 +- 10 files changed, 19 insertions(+), 11 deletions(-) diff --git a/actionpack/lib/action_controller/metal/request_forgery_protection.rb b/actionpack/lib/action_controller/metal/request_forgery_protection.rb index 31df6cea0f..04e575986a 100644 --- a/actionpack/lib/action_controller/metal/request_forgery_protection.rb +++ b/actionpack/lib/action_controller/metal/request_forgery_protection.rb @@ -280,7 +280,7 @@ module ActionController #:nodoc: # Check for cross-origin JavaScript responses. def non_xhr_javascript_response? # :doc: - %r(\A(?:text|application)/javascript).match?(media_type) && !request.xhr? + media_type && %r(\A(?:text|application)/javascript).match?(media_type) && !request.xhr? end AUTHENTICITY_TOKEN_LENGTH = 32 diff --git a/actionpack/lib/action_dispatch/http/mime_type.rb b/actionpack/lib/action_dispatch/http/mime_type.rb index 60b78c0582..39438193e6 100644 --- a/actionpack/lib/action_dispatch/http/mime_type.rb +++ b/actionpack/lib/action_dispatch/http/mime_type.rb @@ -231,7 +231,7 @@ module Mime class InvalidMimeType < StandardError; end def initialize(string, symbol = nil, synonyms = []) - unless MIME_REGEXP.match?(string) + if string.nil? || ! MIME_REGEXP.match?(string) raise InvalidMimeType, "#{string.inspect} is not a valid MIME type" end @symbol, @synonyms = symbol, synonyms diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb index 761a6b8206..2b8d6057d7 100644 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -265,7 +265,8 @@ module ActionDispatch # (case-insensitive), which may need to be manually added depending on the # choice of JavaScript libraries and frameworks. def xml_http_request? - /XMLHttpRequest/i.match?(get_header("HTTP_X_REQUESTED_WITH")) + header = get_header("HTTP_X_REQUESTED_WITH") + header && /XMLHttpRequest/i.match?(header) end alias :xhr? :xml_http_request? diff --git a/actionpack/lib/action_dispatch/journey/formatter.rb b/actionpack/lib/action_dispatch/journey/formatter.rb index 36c041f254..0bc93ec80b 100644 --- a/actionpack/lib/action_dispatch/journey/formatter.rb +++ b/actionpack/lib/action_dispatch/journey/formatter.rb @@ -151,7 +151,7 @@ module ActionDispatch missing_keys << key end else - unless /\A#{tests[key]}\Z/.match?(parts[key]) + if parts[key].nil? || !/\A#{tests[key]}\Z/.match?(parts[key]) missing_keys ||= [] missing_keys << key end diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 36dc876fc1..fc1fbfd40e 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -346,7 +346,7 @@ module ActionDispatch end def split_to(to) - if /#/.match?(to) + if to && /#/.match?(to) to.split("#") else [] @@ -355,7 +355,7 @@ module ActionDispatch def add_controller_module(controller, modyoule) if modyoule && !controller.is_a?(Regexp) - if %r{\A/}.match?(controller) + if controller && controller.start_with?("/") controller[1..-1] else [modyoule, controller].compact.join("/") diff --git a/actionview/lib/action_view/layouts.rb b/actionview/lib/action_view/layouts.rb index b21dc1b9b3..09e6cd3886 100644 --- a/actionview/lib/action_view/layouts.rb +++ b/actionview/lib/action_view/layouts.rb @@ -280,7 +280,12 @@ module ActionView def _write_layout_method # :nodoc: silence_redefinition_of_method(:_layout) - prefixes = /\blayouts/.match?(_implied_layout_name) ? [] : ["layouts"] + prefixes = if _implied_layout_name && + /\blayouts/.match?(_implied_layout_name) + [] + else + ["layouts"] + end default_behavior = "lookup_context.find_all('#{_implied_layout_name}', #{prefixes.inspect}, false, [], { formats: formats }).first || super" name_clause = if name default_behavior diff --git a/activemodel/test/validators/email_validator.rb b/activemodel/test/validators/email_validator.rb index 774a10b2ba..5624f4805f 100644 --- a/activemodel/test/validators/email_validator.rb +++ b/activemodel/test/validators/email_validator.rb @@ -2,7 +2,7 @@ class EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) - unless /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i.match?(value) + if value.nil? || ! /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i.match?(value) record.errors.add(attribute, message: options[:message] || "is not an email") end end diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 9c2b17be1b..b78068a8d3 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -47,7 +47,9 @@ module ActiveRecord set_callback :checkin, :after, :enable_lazy_transactions! def self.type_cast_config_to_integer(config) - if config.is_a?(Integer) + if config.nil? + config + elsif config.is_a?(Integer) config elsif SIMPLE_INT.match?(config) config.to_i diff --git a/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb index 9033617103..445a74baf5 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql/schema_statements.rb @@ -162,7 +162,7 @@ module ActiveRecord type_metadata = fetch_type_metadata(field[:Type], field[:Extra]) default, default_function = field[:Default], nil - if type_metadata.type == :datetime && /\ACURRENT_TIMESTAMP(?:\([0-6]?\))?\z/i.match?(default) + if type_metadata.type == :datetime && default && /\ACURRENT_TIMESTAMP(?:\([0-6]?\))?\z/i.match?(default) default, default_function = nil, default elsif type_metadata.extra == "DEFAULT_GENERATED" default = +"(#{default})" unless default.start_with?("(") diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 09cfec9950..ff9c669b96 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -620,7 +620,7 @@ module ActiveRecord end def has_default_function?(default_value, default) - !default_value && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP}.match?(default) + !default_value && default && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP}.match?(default) end def load_additional_types(oids = nil)