diff --git a/lib/rubygems/gem_runner.rb b/lib/rubygems/gem_runner.rb index 8335a0ad03..4cb924677f 100644 --- a/lib/rubygems/gem_runner.rb +++ b/lib/rubygems/gem_runner.rb @@ -29,6 +29,7 @@ class Gem::GemRunner # Run the gem command with the following arguments. def run(args) + validate_encoding args build_args = extract_build_args args do_configuration args @@ -72,6 +73,14 @@ class Gem::GemRunner private + def validate_encoding(args) + invalid_arg = args.find {|arg| !arg.valid_encoding? } + + if invalid_arg + raise Gem::OptionParser::InvalidArgument.new("'#{invalid_arg.scrub}' has invalid encoding") + end + end + def do_configuration(args) Gem.configuration = @config_file_class.new(args) Gem.use_paths Gem.configuration[:gemhome], Gem.configuration[:gempath] diff --git a/test/rubygems/test_gem_gem_runner.rb b/test/rubygems/test_gem_gem_runner.rb index c05e74c991..4fb205040c 100644 --- a/test/rubygems/test_gem_gem_runner.rb +++ b/test/rubygems/test_gem_gem_runner.rb @@ -54,6 +54,12 @@ class TestGemGemRunner < Gem::TestCase assert_equal %w[--commands], Gem::Command.extra_args end + def test_validate_encoding + assert_raise Gem::OptionParser::InvalidArgument do + @runner.run(["install\xFF", "foo"]) + end + end + def test_extract_build_args args = %w[] assert_equal [], @runner.extract_build_args(args)