Skip to content

Commit 7cc3191

Browse files
nobumatzbot
authored andcommitted
[ruby/erb] Fix integer overflow
Fix ruby/erb#87 ruby/erb@75764f022b
1 parent 6be2a51 commit 7cc3191

File tree

2 files changed

+5
-2
lines changed

2 files changed

+5
-2
lines changed

ext/erb/escape/escape.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ optimized_escape_html(VALUE str)
4949
const unsigned char c = *cstr++;
5050
uint8_t len = html_escape_table[c].len;
5151
if (len) {
52-
uint16_t segment_len = cstr - segment_start - 1;
52+
size_t segment_len = cstr - segment_start - 1;
5353
if (!buf) {
5454
buf = ALLOCV_N(char, vbuf, escaped_length(str));
5555
dest = buf;
@@ -64,7 +64,7 @@ optimized_escape_html(VALUE str)
6464
}
6565
}
6666
if (buf) {
67-
uint16_t segment_len = cstr - segment_start;
67+
size_t segment_len = cstr - segment_start;
6868
if (segment_len) {
6969
memcpy(dest, segment_start, segment_len);
7070
dest += segment_len;

test/erb/test_erb.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ def test_html_escape
7777

7878
assert_equal("", ERB::Util.html_escape(nil))
7979
assert_equal("123", ERB::Util.html_escape(123))
80+
81+
assert_equal(65536+5, ERB::Util.html_escape("x"*65536 + "&").size)
82+
assert_equal(65536+5, ERB::Util.html_escape("&" + "x"*65536).size)
8083
end
8184

8285
def test_html_escape_to_s

0 commit comments

Comments
 (0)