diff --git a/lib/fluent/plugin/parser_syslog.rb b/lib/fluent/plugin/parser_syslog.rb index acf2cbfa71..2b6fcca479 100644 --- a/lib/fluent/plugin/parser_syslog.rb +++ b/lib/fluent/plugin/parser_syslog.rb @@ -44,7 +44,7 @@ class SyslogParser < Parser RFC3164_CAPTURES = RFC3164_WITHOUT_TIME_AND_PRI_REGEXP.names.freeze RFC3164_PRI_REGEXP = /^<(?[0-9]{1,3})>/ - RFC5424_WITHOUT_TIME_AND_PRI_REGEXP = /(?[!-~]{1,255}) (?[!-~]{1,48}) (?[!-~]{1,128}) (?[!-~]{1,32}) (?(?:\-|(?:\[.*?(?.+))?\z/m + RFC5424_WITHOUT_TIME_AND_PRI_REGEXP = /(?[!-~]{1,255}) (?[!-~]{1,48}) (?[!-~]{1,128}) (?[!-~]{1,32}) (?(?:\-|(?:\[.*?(?.+))?\z/m RFC5424_CAPTURES = RFC5424_WITHOUT_TIME_AND_PRI_REGEXP.names.freeze RFC5424_PRI_REGEXP = /^<(?\d{1,3})>\d\d{0,2}\s/ diff --git a/test/plugin/test_parser_syslog.rb b/test/plugin/test_parser_syslog.rb index 64161f48f7..dcdbca8388 100644 --- a/test/plugin/test_parser_syslog.rb +++ b/test/plugin/test_parser_syslog.rb @@ -1,6 +1,7 @@ require_relative '../helper' require 'fluent/test/driver/parser' require 'fluent/plugin/parser' +require 'timeout' class SyslogParserTest < ::Test::Unit::TestCase def setup @@ -199,6 +200,16 @@ def test_parse_various_characters_for_tag_with_priority(param) end class TestRFC5424Regexp < self + def test_rejects_invalid_structured_data_without_excessive_backtracking + text = 'host ident pid msgid ' + ('[example]' * 30) + 'invalid' + + match = Timeout.timeout(1) do + Fluent::Plugin::SyslogParser::RFC5424_WITHOUT_TIME_AND_PRI_REGEXP.match(text) + end + + assert_nil(match) + end + data('regexp' => 'regexp', 'string' => 'string') def test_parse_with_rfc5424_message(param) @parser.configure(