Project

General

Profile

Actions

Bug #13932

closed

[PATCH] Extension libraries take precedence in checks of later Kernel.#require calls for features without file extensions

Added by akihikodaki (Akihiko Odaki) about 7 years ago. Updated over 4 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0dev (2017-09-23 trunk 60002) [x86_64-linux]
[ruby-core:<unknown>]
Tags:

Description

Extension libraries take precedence in checks of later Kernel.#require calls for features without file extensions. That behavior is inconsistent with the first call, and can cause problems.

For instance, feature openssl has openssl.rb and openssl.so, but it assumes openssl.rb will always be loaded when it gets required. That assumption works for the first call of Kernel.#require, but for the later calls, require assumes openssl.so is being required and checks if the file is valid for the requirement.

Usually that is not so problematic since it just check if openssl.so, which is already required by openssl.rb, is required or not. However, if there is a new alternative openssl.rb in $:, the file will be loaded and conflict with the feature already loaded.
The below is a code example.

p $:.include? '/usr/lib/ruby/2.4.0' # true
p $:.include? '/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib' # false

p $".include? '/usr/lib/ruby/2.4.0/openssl/openssl.rb' # false
p $".include? '/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib/openssl.rb' # false

require 'openssl'

p $".include? '/usr/lib/ruby/2.4.0/openssl/openssl.rb' # true
p $".include? '/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib/openssl.rb' # false

$:.unshift '/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib'
require 'openssl'

p $".include? '/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib/openssl.rb' # true (unexpected)

Files

load.patch (2.42 KB) load.patch A fix akihikodaki (Akihiko Odaki), 09/23/2017 04:48 PM
Actions

Also available in: Atom PDF

Like0
Like0