This instance will be upgraded to Heptapod 0.31.0 (final) on 2022-05-24 at 14:00 UTC+2 (a few minutes of down time)

Commit 7c9eba89 authored by Stan Hu's avatar Stan Hu
Browse files

Fix RangeError exceptions when referring to issues or merge requests outside of max database values

When using #XYZ in Markdown text, if XYZ exceeds the maximum value of a signed 32-bit integer, we
get an exception when the Markdown render attempts to run `where(iids: XYZ)`. Introduce a method
that will throw out out-of-bounds values.

Closes #18777
parent f10f9fa086f6
......@@ -49,6 +49,10 @@ def reference_pattern
raise NotImplementedError, "#{self} does not implement #{__method__}"
end
def reference_valid?(reference)
true
end
def link_reference_pattern(route, pattern)
%r{
(?<url>
......
......@@ -83,6 +83,10 @@ def self.link_reference_pattern
@link_reference_pattern ||= super("issues", /(?<issue>\d+)/)
end
def self.reference_valid?(reference)
reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE
end
def self.sort(method, excluded_labels: [])
case method.to_s
when 'due_date_asc' then order_due_date_asc
......
......@@ -133,6 +133,10 @@ def self.link_reference_pattern
@link_reference_pattern ||= super("merge_requests", /(?<merge_request>\d+)/)
end
def self.reference_valid?(reference)
reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE
end
# Returns all the merge requests from an ActiveRecord:Relation.
#
# This method uses a UNION as it usually operates on the result of
......
......@@ -218,8 +218,9 @@ def references_per_project
nodes.each do |node|
node.to_html.scan(regex) do
project = $~[:project] || current_project_path
symbol = $~[object_sym]
refs[project] << $~[object_sym]
refs[project] << symbol if object_class.reference_valid?(symbol)
end
end
......
module Gitlab
module Database
# The max value of INTEGER type is the same between MySQL and PostgreSQL:
# https://www.postgresql.org/docs/9.2/static/datatype-numeric.html
# http://dev.mysql.com/doc/refman/5.7/en/integer-types.html
MAX_INT_VALUE = 2147483647
def self.adapter_name
connection.adapter_name
end
......
......@@ -8,7 +8,7 @@
doc = Nokogiri::HTML.fragment("#1 #{project.to_reference}#2")
filter = described_class.new(doc, project: project)
expect(filter).to receive(:object_class).twice.and_return(Issue)
expect(filter).to receive(:object_class).exactly(4).times.and_return(Issue)
expect(filter).to receive(:object_sym).twice.and_return(:issue)
refs = filter.references_per_project
......
......@@ -134,6 +134,12 @@ def helper
expect(reference_filter(act).to_html).to eq exp
end
it 'ignores out-of-bounds issue IDs on the referenced project' do
exp = act = "Fixed ##{Gitlab::Database::MAX_INT_VALUE + 1}"
expect(reference_filter(act).to_html).to eq exp
end
end
context 'cross-project URL reference' do
......
......@@ -38,6 +38,12 @@
expect(reference_filter(act).to_html).to eq exp
end
it 'ignores out-of-bounds merge request IDs on the referenced project' do
exp = act = "Merge !#{Gitlab::Database::MAX_INT_VALUE + 1}"
expect(reference_filter(act).to_html).to eq exp
end
it 'includes a title attribute' do
doc = reference_filter("Merge #{reference}")
expect(doc.css('a').first.attr('title')).to eq "Merge Request: #{merge.title}"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment