This repository has been archived by the owner on Jan 15, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 87
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(PA-6507) Patch REXML for CVE-2024-35176 in ruby 2.7 and 3.2
- Loading branch information
1 parent
a39b23b
commit 395eb24
Showing
4 changed files
with
236 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
|
||
diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb | ||
index 8d62391c..d09237c5 100644 | ||
--- a/lib/rexml/parsers/baseparser.rb | ||
+++ b/lib/rexml/parsers/baseparser.rb | ||
@@ -628,17 +628,17 @@ def parse_attributes(prefixes, curr_ns) | ||
message = "Missing attribute equal: <#{name}>" | ||
raise REXML::ParseException.new(message, @source) | ||
end | ||
- unless match = @source.match(/(['"])(.*?)\1\s*/um, true) | ||
- if match = @source.match(/(['"])/, true) | ||
- message = | ||
- "Missing attribute value end quote: <#{name}>: <#{match[1]}>" | ||
- raise REXML::ParseException.new(message, @source) | ||
- else | ||
- message = "Missing attribute value start quote: <#{name}>" | ||
- raise REXML::ParseException.new(message, @source) | ||
- end | ||
+ unless match = @source.match(/(['"])/, true) | ||
+ message = "Missing attribute value start quote: <#{name}>" | ||
+ raise REXML::ParseException.new(message, @source) | ||
+ end | ||
+ quote = match[1] | ||
+ value = @source.read_until(quote) | ||
+ unless value.chomp!(quote) | ||
+ message = "Missing attribute value end quote: <#{name}>: <#{quote}>" | ||
+ raise REXML::ParseException.new(message, @source) | ||
end | ||
- value = match[2] | ||
+ @source.match(/\s*/um, true) | ||
if prefix == "xmlns" | ||
if local_part == "xml" | ||
if value != "http://www.w3.org/XML/1998/namespace" | ||
diff --git a/lib/rexml/source.rb b/lib/rexml/source.rb | ||
index 7f47c2be..999751b4 100644 | ||
--- a/lib/rexml/source.rb | ||
+++ b/lib/rexml/source.rb | ||
@@ -65,7 +65,11 @@ def encoding=(enc) | ||
encoding_updated | ||
end | ||
|
||
- def read | ||
+ def read(term = nil) | ||
+ end | ||
+ | ||
+ def read_until(term) | ||
+ @scanner.scan_until(Regexp.union(term)) or @scanner.rest | ||
end | ||
|
||
def ensure_buffer | ||
@@ -158,9 +162,9 @@ def initialize(arg, block_size=500, encoding=nil) | ||
end | ||
end | ||
|
||
- def read | ||
+ def read(term = nil) | ||
begin | ||
- @scanner << readline | ||
+ @scanner << readline(term) | ||
true | ||
rescue Exception, NameError | ||
@source = nil | ||
@@ -168,6 +172,21 @@ def read | ||
end | ||
end | ||
|
||
+ def read_until(term) | ||
+ pattern = Regexp.union(term) | ||
+ data = [] | ||
+ begin | ||
+ until str = @scanner.scan_until(pattern) | ||
+ @scanner << readline(term) | ||
+ end | ||
+ rescue EOFError | ||
+ @scanner.rest | ||
+ else | ||
+ read if @scanner.eos? and [email protected]? | ||
+ str | ||
+ end | ||
+ end | ||
+ | ||
def ensure_buffer | ||
read if @scanner.eos? && @source | ||
end | ||
@@ -218,8 +237,8 @@ def current_line | ||
end | ||
|
||
private | ||
- def readline | ||
- str = @source.readline(@line_break) | ||
+ def readline(term = nil) | ||
+ str = @source.readline(term || @line_break) | ||
if @pending_buffer | ||
if str.nil? | ||
str = @pending_buffer | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
|
||
diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb | ||
index 8d62391c..d09237c5 100644 | ||
--- a/lib/rexml/parsers/baseparser.rb | ||
+++ b/lib/rexml/parsers/baseparser.rb | ||
@@ -628,17 +628,17 @@ def parse_attributes(prefixes, curr_ns) | ||
message = "Missing attribute equal: <#{name}>" | ||
raise REXML::ParseException.new(message, @source) | ||
end | ||
- unless match = @source.match(/(['"])(.*?)\1\s*/um, true) | ||
- if match = @source.match(/(['"])/, true) | ||
- message = | ||
- "Missing attribute value end quote: <#{name}>: <#{match[1]}>" | ||
- raise REXML::ParseException.new(message, @source) | ||
- else | ||
- message = "Missing attribute value start quote: <#{name}>" | ||
- raise REXML::ParseException.new(message, @source) | ||
- end | ||
+ unless match = @source.match(/(['"])/, true) | ||
+ message = "Missing attribute value start quote: <#{name}>" | ||
+ raise REXML::ParseException.new(message, @source) | ||
+ end | ||
+ quote = match[1] | ||
+ value = @source.read_until(quote) | ||
+ unless value.chomp!(quote) | ||
+ message = "Missing attribute value end quote: <#{name}>: <#{quote}>" | ||
+ raise REXML::ParseException.new(message, @source) | ||
end | ||
- value = match[2] | ||
+ @source.match(/\s*/um, true) | ||
if prefix == "xmlns" | ||
if local_part == "xml" | ||
if value != "http://www.w3.org/XML/1998/namespace" | ||
diff --git a/lib/rexml/source.rb b/lib/rexml/source.rb | ||
index 7f47c2be..999751b4 100644 | ||
--- a/lib/rexml/source.rb | ||
+++ b/lib/rexml/source.rb | ||
@@ -65,7 +65,11 @@ def encoding=(enc) | ||
encoding_updated | ||
end | ||
|
||
- def read | ||
+ def read(term = nil) | ||
+ end | ||
+ | ||
+ def read_until(term) | ||
+ @scanner.scan_until(Regexp.union(term)) or @scanner.rest | ||
end | ||
|
||
def ensure_buffer | ||
@@ -158,9 +162,9 @@ def initialize(arg, block_size=500, encoding=nil) | ||
end | ||
end | ||
|
||
- def read | ||
+ def read(term = nil) | ||
begin | ||
- @scanner << readline | ||
+ @scanner << readline(term) | ||
true | ||
rescue Exception, NameError | ||
@source = nil | ||
@@ -168,6 +172,21 @@ def read | ||
end | ||
end | ||
|
||
+ def read_until(term) | ||
+ pattern = Regexp.union(term) | ||
+ data = [] | ||
+ begin | ||
+ until str = @scanner.scan_until(pattern) | ||
+ @scanner << readline(term) | ||
+ end | ||
+ rescue EOFError | ||
+ @scanner.rest | ||
+ else | ||
+ read if @scanner.eos? and [email protected]? | ||
+ str | ||
+ end | ||
+ end | ||
+ | ||
def ensure_buffer | ||
read if @scanner.eos? && @source | ||
end | ||
@@ -218,8 +237,8 @@ def current_line | ||
end | ||
|
||
private | ||
- def readline | ||
- str = @source.readline(@line_break) | ||
+ def readline(term = nil) | ||
+ str = @source.readline(term || @line_break) | ||
if @pending_buffer | ||
if str.nil? | ||
str = @pending_buffer | ||
|