From b44c2dd0955dc7730fdaed4e2a75992d5061d432 Mon Sep 17 00:00:00 2001 From: Martyn Jago Date: Fri, 27 May 2022 15:08:11 +0100 Subject: [PATCH] Fix broken YAML parsing on later Rubies with Psych >=4.0 YAML.load is now interpreted as YAML.safe_load, which breaks where the YAML file contains aliases. If we can assume our yaml files are trusted (since this a development tool), we can check for the presence of YAML.unsafe_load and use it instead if it exists. --- auto/generate_module.rb | 4 ++-- auto/generate_test_runner.rb | 4 ++-- auto/test_file_filter.rb | 7 ++++--- auto/yaml_helper.rb | 19 +++++++++++++++++++ examples/example_3/rakefile_helper.rb | 11 ++++++++--- test/rakefile_helper.rb | 4 ++-- 6 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 auto/yaml_helper.rb diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 8e33d95..7151586 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -116,8 +116,8 @@ class UnityModuleGenerator def self.grab_config(config_file) options = default_options unless config_file.nil? || config_file.empty? - require 'yaml' - yaml_guts = YAML.load_file(config_file) + require_relative 'yaml_helper' + yaml_guts = YamlHelper.load_file(config_file) options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) raise "No :unity or :cmock section found in #{config_file}" unless options end diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 9401ad8..b4deb2b 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -51,8 +51,8 @@ class UnityTestRunnerGenerator def self.grab_config(config_file) options = default_options unless config_file.nil? || config_file.empty? - require 'yaml' - yaml_guts = YAML.load_file(config_file) + require_relative 'yaml_helper' + yaml_guts = YamlHelper.load_file(config_file) options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) raise "No :unity or :cmock section found in #{config_file}" unless options end diff --git a/auto/test_file_filter.rb b/auto/test_file_filter.rb index 5c3a79f..3cc32de 100644 --- a/auto/test_file_filter.rb +++ b/auto/test_file_filter.rb @@ -4,7 +4,7 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -require'yaml' +require_relative 'yaml_helper' module RakefileHelpers class TestFileFilter @@ -12,9 +12,10 @@ module RakefileHelpers @all_files = all_files return unless @all_files - return unless File.exist?('test_file_filter.yml') - filters = YAML.load_file('test_file_filter.yml') + file = 'test_file_filter.yml' + return unless File.exist?(file) + filters = YamlHelper.load_file(file) @all_files = filters[:all_files] @only_files = filters[:only_files] @exclude_files = filters[:exclude_files] diff --git a/auto/yaml_helper.rb b/auto/yaml_helper.rb new file mode 100644 index 0000000..e5a0865 --- /dev/null +++ b/auto/yaml_helper.rb @@ -0,0 +1,19 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +require 'yaml' + +module YamlHelper + def self.load(body) + YAML.respond_to?(:unsafe_load) ? + YAML.unsafe_load(body) : YAML.load(body) + end + + def self.load_file(file) + body = File.read(file) + self.load(body) + end +end diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index 64d20c9..4906075 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -1,14 +1,19 @@ -require 'yaml' +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + require 'fileutils' require_relative '../../auto/unity_test_summary' require_relative '../../auto/generate_test_runner' require_relative '../../auto/colour_reporter' - +require_relative '../../auto/yaml_helper' C_EXTENSION = '.c'.freeze def load_configuration(config_file) $cfg_file = config_file - $cfg = YAML.load(File.read($cfg_file)) + $cfg = YamlHelper.load_file($cfg_file) end def configure_clean diff --git a/test/rakefile_helper.rb b/test/rakefile_helper.rb index 4487a28..1a9fc33 100644 --- a/test/rakefile_helper.rb +++ b/test/rakefile_helper.rb @@ -4,11 +4,11 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -require 'yaml' require 'fileutils' require_relative '../auto/unity_test_summary' require_relative '../auto/generate_test_runner' require_relative '../auto/colour_reporter' +require_relative '../auto/yaml_helper' module RakefileHelpers C_EXTENSION = '.c'.freeze @@ -16,7 +16,7 @@ module RakefileHelpers return if $configured $cfg_file = "targets/#{config_file}" unless config_file =~ /[\\|\/]/ - $cfg = YAML.load(File.read($cfg_file)) + $cfg = YamlHelper.load_file($cfg_file) $colour_output = false unless $cfg['colour'] $configured = true if config_file != DEFAULT_CONFIG_FILE end