From d6707da4597fc798f4e400fa770001a7c7b7b538 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Tue, 4 Dec 2018 21:13:17 +0100 Subject: [PATCH] build system: protect digest calls from re-entry The code for Ruby's Digest module seems to be racy wrt. multi-threading. See e.g. https://github.com/aws/aws-sdk-ruby/issues/525 for details. --- Rakefile | 1 + rake.d/digest.rb | 7 +++++++ rake.d/format_string_verifier.rb | 4 +--- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 rake.d/digest.rb diff --git a/Rakefile b/Rakefile index cdaccb728..4c003f4e2 100644 --- a/Rakefile +++ b/Rakefile @@ -47,6 +47,7 @@ $build_system_modules = {} $have_gtest = (c(:GTEST_TYPE) == "system") || (c(:GTEST_TYPE) == "internal") $gtest_apps = [] +require_relative "rake.d/digest" require_relative "rake.d/helpers" require_relative "rake.d/target" require_relative "rake.d/application" diff --git a/rake.d/digest.rb b/rake.d/digest.rb new file mode 100644 index 000000000..ed3cf945d --- /dev/null +++ b/rake.d/digest.rb @@ -0,0 +1,7 @@ +require "digest" + +$digest_mutex = Mutex.new + +def sha1_hexdigest data + $digest_mutex.synchronize { Digest::SHA1.hexdigest(data) } +end diff --git a/rake.d/format_string_verifier.rb b/rake.d/format_string_verifier.rb index 17cb1005d..86c477050 100755 --- a/rake.d/format_string_verifier.rb +++ b/rake.d/format_string_verifier.rb @@ -1,7 +1,5 @@ #!/usr/bin/env ruby -require "digest" - class FormatStringVerifier def verify file_name language = file_name.gsub(%r{.*/|\.po$}, '') @@ -35,7 +33,7 @@ class FormatStringVerifier reject(&:nil?). each do |msgid| format_types.each do |type| - sha1 = Digest::SHA1.hexdigest "#{type}:#{msgid}:#{msgstr}" + sha1 = sha1_hexdigest "#{type}:#{msgid}:#{msgstr}" next if to_ignore.key?(language) && to_ignore[language].include?(sha1)