From 63aa1920883841fb0d6eb0c5513de63406d91879 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Mon, 5 Jul 2021 17:47:20 +0100 Subject: [PATCH] Incorporate suggestions from feedback 1. Never install `binutils`. Instead, report an audit failure. 2. Tighten instruction check with a stricter matching strategy. --- Library/Homebrew/formula_cellar_checks.rb | 28 ++++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Library/Homebrew/formula_cellar_checks.rb b/Library/Homebrew/formula_cellar_checks.rb index 8d7a4b4c1e..a10dfb6f60 100644 --- a/Library/Homebrew/formula_cellar_checks.rb +++ b/Library/Homebrew/formula_cellar_checks.rb @@ -298,19 +298,17 @@ module FormulaCellarChecks objdump ||= Formula["binutils"].opt_bin/"objdump" if Formula["binutils"].any_version_installed? objdump ||= which("objdump") objdump ||= which("objdump", ENV["HOMEBREW_PATH"]) - objdump ||= begin - # If the system provides no `objdump`, install binutils instead of llvm since - # binutils is smaller and has fewer dependencies. - ohai "Installing `binutils` for `cpuid` instruction check..." - safe_system HOMEBREW_BREW_FILE, "install", "binutils" - Formula["binutils"].opt_bin/"objdump" + + unless objdump + return <<~EOS + No `objdump` found, so cannot check for a `cpuid` instruction. Install `objdump` with + brew install binutils + EOS end keg = Keg.new(formula.prefix) - has_cpuid_instruction = false - keg.binary_executable_or_library_files.each do |file| - has_cpuid_instruction = cpuid_instruction?(file, objdump) - break if has_cpuid_instruction + has_cpuid_instruction = keg.binary_executable_or_library_files.any? do |file| + cpuid_instruction?(file, objdump) end return if has_cpuid_instruction @@ -347,10 +345,18 @@ module FormulaCellarChecks end def cpuid_instruction?(file, objdump = "objdump") + @instruction_column_index ||= {} + @instruction_column_index[objdump] ||= if Utils.popen_read(objdump, "--version").include? "LLVM" + 1 # `llvm-objdump` or macOS `objdump` + else + 2 # GNU binutils `objdump` + end + has_cpuid_instruction = false Utils.popen_read(objdump, "--disassemble", file) do |io| until io.eof? - has_cpuid_instruction = io.readline.include? "cpuid" + instruction = io.readline.split("\t")[@instruction_column_index[objdump]]&.chomp + has_cpuid_instruction = instruction.match?(/^cpuid(\s+|$)/) if instruction break if has_cpuid_instruction end end