Skip to content

Commit 1f1e6e9

Browse files
authored
Fix ReDoS by using repeated space characters inside <!DOCTYPE name [<!ATTLIST>]> (#176)
Fix performance by removing unnecessary spaces. This is occurred in Ruby 3.1 or earlier.
1 parent 1cc1d9a commit 1f1e6e9

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

lib/rexml/parsers/baseparser.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ def pull_event
350350
contents = md[0]
351351

352352
pairs = {}
353-
values = md[0].scan( ATTDEF_RE )
353+
values = md[0].strip.scan( ATTDEF_RE )
354354
values.each do |attdef|
355355
unless attdef[3] == "#IMPLIED"
356356
attdef.compact!

test/parse/test_attlist.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
require "test/unit"
2+
require "core_assertions"
3+
4+
require "rexml/document"
5+
6+
module REXMLTests
7+
class TestParseAttlist < Test::Unit::TestCase
8+
include Test::Unit::CoreAssertions
9+
10+
def test_gt_linear_performance
11+
seq = [10000, 50000, 100000, 150000, 200000]
12+
assert_linear_performance(seq, rehearsal: 10) do |n|
13+
REXML::Document.new('<!DOCTYPE schema SYSTEM "foo.dtd" [<!ATTLIST ' + " " * n + ' root v CDATA #FIXED "test">]>')
14+
end
15+
end
16+
end
17+
end

0 commit comments

Comments
 (0)