Skip to content

Commit e7518a7

Browse files
deivid-rodriguezmatzbot
authored andcommitted
Validate user input encoding
If the user has the encoding of her system messed up, she may end up sending us incorrectly encoding input, causing "invalid byte sequence in UTF-8" errors at random places. These errors can be forced on a system without encoding issues with something like: ``` $ gem install$(echo -e "\xFF") foo /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/config_file.rb:534:in `block in set_config_file_name': invalid byte sequence in UTF-8 (ArgumentError) from /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/config_file.rb:530:in `each' from /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/config_file.rb:530:in `set_config_file_name' from /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/config_file.rb:177:in `initialize' from /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/gem_runner.rb:71:in `new' from /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/gem_runner.rb:71:in `do_configuration' from /Users/deivid/.asdf/installs/ruby/3.2.1/lib/ruby/site_ruby/3.2.0/rubygems/gem_runner.rb:33:in `run' from /Users/deivid/.asdf/installs/ruby/3.2.1/bin/gem:10:in `<main>' ``` This commit makes RubyGems print a better error in this case: ``` $ ruby -Ilib bin/gem install$(echo -e "\xFF") foo /Users/deivid/Code/rubygems/rubygems/lib/rubygems/gem_runner.rb:75:in `validate_encoding': invalid argument: 'install�' has invalid encoding (Gem::OptionParser::InvalidArgument) from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/gem_runner.rb:31:in `run' from bin/gem:10:in `<main>' ```
1 parent 9ce1b5e commit e7518a7

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

lib/rubygems/gem_runner.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def initialize
2929
# Run the gem command with the following arguments.
3030

3131
def run(args)
32+
validate_encoding args
3233
build_args = extract_build_args args
3334

3435
do_configuration args
@@ -72,6 +73,14 @@ def extract_build_args(args) # :nodoc:
7273

7374
private
7475

76+
def validate_encoding(args)
77+
invalid_arg = args.find {|arg| !arg.valid_encoding? }
78+
79+
if invalid_arg
80+
raise Gem::OptionParser::InvalidArgument.new("'#{invalid_arg.scrub}' has invalid encoding")
81+
end
82+
end
83+
7584
def do_configuration(args)
7685
Gem.configuration = @config_file_class.new(args)
7786
Gem.use_paths Gem.configuration[:gemhome], Gem.configuration[:gempath]

test/rubygems/test_gem_gem_runner.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ def test_do_configuration
5454
assert_equal %w[--commands], Gem::Command.extra_args
5555
end
5656

57+
def test_validate_encoding
58+
assert_raise Gem::OptionParser::InvalidArgument do
59+
@runner.run(["install\xFF", "foo"])
60+
end
61+
end
62+
5763
def test_extract_build_args
5864
args = %w[]
5965
assert_equal [], @runner.extract_build_args(args)

0 commit comments

Comments
 (0)