mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: automatically timeout long running image magick commands (#12670)
Previously certain images may lead to convert / identify to run for unreasonable amounts of time This adds a maximum amount of time these commands can run prior to forcing them to stop
This commit is contained in:
@@ -306,9 +306,10 @@ class OptimizedImage < ActiveRecord::Base
|
||||
end
|
||||
|
||||
MAX_PNGQUANT_SIZE = 500_000
|
||||
MAX_CONVERT_SECONDS = 20
|
||||
|
||||
def self.convert_with(instructions, to, opts = {})
|
||||
Discourse::Utils.execute_command("nice", "-n", "10", *instructions)
|
||||
Discourse::Utils.execute_command("nice", "-n", "10", *instructions, timeout: MAX_CONVERT_SECONDS)
|
||||
|
||||
allow_pngquant = to.downcase.ends_with?(".png") && File.size(to) < MAX_PNGQUANT_SIZE
|
||||
FileHelper.optimize_image!(to, allow_pngquant: allow_pngquant)
|
||||
|
||||
@@ -13,6 +13,7 @@ class Upload < ActiveRecord::Base
|
||||
SHA1_LENGTH = 40
|
||||
SEEDED_ID_THRESHOLD = 0
|
||||
URL_REGEX ||= /(\/original\/\dX[\/\.\w]*\/(\h+)[\.\w]*)/
|
||||
MAX_IDENTIFY_SECONDS = 5
|
||||
|
||||
belongs_to :user
|
||||
belongs_to :access_control_post, class_name: 'Post'
|
||||
@@ -225,7 +226,7 @@ class Upload < ActiveRecord::Base
|
||||
|
||||
begin
|
||||
if extension == 'svg'
|
||||
w, h = Discourse::Utils.execute_command("identify", "-format", "%w %h", path).split(' ') rescue [0, 0]
|
||||
w, h = Discourse::Utils.execute_command("identify", "-format", "%w %h", path, timeout: MAX_IDENTIFY_SECONDS).split(' ') rescue [0, 0]
|
||||
else
|
||||
w, h = FastImage.new(path, raise_on_failure: true).size
|
||||
end
|
||||
@@ -274,7 +275,7 @@ class Upload < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def target_image_quality(local_path, test_quality)
|
||||
@file_quality ||= Discourse::Utils.execute_command("identify", "-format", "%Q", local_path).to_i rescue 0
|
||||
@file_quality ||= Discourse::Utils.execute_command("identify", "-format", "%Q", local_path, timeout: MAX_IDENTIFY_SECONDS).to_i rescue 0
|
||||
|
||||
if @file_quality == 0 || @file_quality > test_quality
|
||||
test_quality
|
||||
|
||||
Reference in New Issue
Block a user