Vote #79587
完了\f or \v character in Textile markup may cause RegexpError exception
0%
説明
When I make a new issue which includes some control codes, Redmine goes internal error but the issue is created.
Then I go back to the previous view and refer the issue, Redmine goes internal error again.
I tested some cases and found that in the NG case, the text starts with 0x20 0x0B.
If it starts with only 0x0B, the problem doesn't occur.
NG case
ADDRESS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF ----------+------------------------------------------------------------------- 00000000: 20 0B 61 62 63 64 65 31 32 33 34 35 20 -- -- -- .abcde12345
OK case
ADDRESS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF ----------+------------------------------------------------------------------- 00000000: 0B 61 62 63 64 65 31 32 33 34 35 20 -- -- -- -- .abcde12345
Even if the text contains the control codes, redmine should not goes internal error, I think.
In order to reproduce the defect, please use the attached file.
Open it in the text editor and paste it in the description of the new issue in Redmine.
journals
Could you provide your environment information that you can see on /admin/info page? It is even better if you provide errors in production.log.
--------------------------------------------------------------------------------
Confirmed the problem. You can create an issue but you will see Internal Server Error when accessing issues#show page.
<pre>
Processing by IssuesController#show as HTML
Parameters: {"id"=>"20368"}
Current user: admin (id=1)
Rendered issues/_action_menu.html.erb (4.8ms)
Rendered issues/show.html.erb within layouts/base (2326.0ms)
Completed 500 Internal Server Error in 2394ms (ActiveRecord: 52.4ms)
ActionView::Template::Error (too big number for repeat range: /^ {100001}\S/):
85:
86: <p><strong><%=l(:field_description)%></strong></p>
87: <div class="wiki">
88: <%= textilizable @issue, :description, :attachments => @issue.attachments %>
89: </div>
90: </div>
91: <% end %>
lib/redmine/wiki_formatting/textile/redcloth3.rb:1037:in `flush_left'
lib/redmine/wiki_formatting/textile/redcloth3.rb:1031:in `clean_white_space'
lib/redmine/wiki_formatting/textile/redcloth3.rb:293:in `to_html'
lib/redmine/wiki_formatting/textile/formatter.rb:43:in `to_html'
lib/redmine/wiki_formatting.rb:89:in `to_html'
app/helpers/application_helper.rb:656:in `textilizable'
app/views/issues/show.html.erb:88:in `_app_views_issues_show_html_erb__2452628678795344758_70339042017100'
app/controllers/issues_controller.rb:106:in `block (2 levels) in show'
app/controllers/issues_controller.rb:99:in `show'
lib/redmine/sudo_mode.rb:63:in `sudo_mode'
</pre>
--------------------------------------------------------------------------------
The issue is reproducible when the text formatting setting is Textile. No problem if the setting is Markdown.
--------------------------------------------------------------------------------
Here is a workaround.
<pre><code class="diff">
Index: lib/redmine/wiki_formatting/textile/redcloth3.rb
===================================================================
--- lib/redmine/wiki_formatting/textile/redcloth3.rb (revision 17592)
+++ lib/redmine/wiki_formatting/textile/redcloth3.rb (working copy)
@@ -1034,7 +1034,7 @@
def flush_left( text )
indt = 0
if text =~ /^ /
- while text !~ /^ {#{indt}}\S/
+ while text !~ /^ {#{indt}}[^ ]/
indt += 1
end unless text.empty?
if indt.nonzero?
</code></pre>
If the string variable @text@ start with @" \x0b"@, the @while@ loop never ends until some error occurs. It is the cause of the error. The regexp @/^ {1}\S/@ does not match the string @" \x0b"@ because "\x0b" is considered as white-space. In other words, @/\S/@ matches @"\x0b"@ because @"\x0b"@ is a kind of white-space.
Maybe the regular expression @/^ {#{indt}}\S/@ is expected to match preceeding space characters and a character other than space char, so it may be expected to match @" \x0b"@ too. But @\S@ does not match @"\x0b"@. It matches not only space character but @[^ \t\r\n\f\v]@. @"\v"@ is another expression of @"\x0b"@.
--------------------------------------------------------------------------------
Does anyone understand why the implementation of @flush_left@ method is so complicated? I think we can make it simpler like the following:
<pre><code class="diff">
Index: lib/redmine/wiki_formatting/textile/redcloth3.rb
===================================================================
--- lib/redmine/wiki_formatting/textile/redcloth3.rb (revision 17592)
+++ lib/redmine/wiki_formatting/textile/redcloth3.rb (working copy)
@@ -1032,15 +1032,7 @@
end
def flush_left( text )
- indt = 0
- if text =~ /^ /
- while text !~ /^ {#{indt}}\S/
- indt += 1
- end unless text.empty?
- if indt.nonzero?
- text.gsub!( /^ {#{indt}}/, '' )
- end
- end
+ text.sub!(/^ +/, '')
end
def footnote_ref( text )
</code></pre>
--------------------------------------------------------------------------------
Maeda-san
Thank you for the consideration.
That's exactly the same as my problem. The log looks same as mine.
I will try the suggested workaround. Thank you.
I put my environment info for future reference.
<pre>
Environment:
Redmine version 3.4.4.stable.17236
Ruby version 2.4.3-p205 (2017-12-14) [x86_64-linux]
Rails version 4.2.8
Environment production
Database adapter Mysql2
SCM:
Subversion 1.7.14
Git 1.8.3.1
Filesystem
Redmine plugins:
clipboard_image_paste 1.12
recurring_tasks 2.0.0-pre
redmine_banner 0.1.2
redmine_comment_only 0.0.1
redmine_enter_cancel 0.0.2
redmine_export_with_journals 0.0.8
redmine_issue_templates 0.1.8
redmine_knowledgebase 3.3.1
redmine_pivot_table 0.0.5
redmine_wiki_lists 0.0.9
redmine_wiki_unc 0.0.3
sidebar_hide 0.0.8
view_customize 1.1.4
</pre>
--------------------------------------------------------------------------------
Opps, the cases should be reversed in the description.
* NG case
<pre>
ADDRESS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
----------+-------------------------------------------------------------------
00000000: 0B 61 62 63 64 65 31 32 33 34 35 20 -- -- -- -- .abcde12345
</pre>
* OK case
<pre>
ADDRESS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
----------+-------------------------------------------------------------------
00000000: 20 0B 61 62 63 64 65 31 32 33 34 35 20 -- -- -- .abcde12345
</pre>
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Here is a patch. Added a test to the code in #29756#note-4.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Hide MATSUTANI wrote:
> Opps, the cases should be reversed in the description.
No, cases in the description field are correct. 0x20 and 0x0b at the beginning of a line cause the exception.
--------------------------------------------------------------------------------
Go MAEDA wrote:
> Hide MATSUTANI wrote:
> > Opps, the cases should be reversed in the description.
>
> No, cases in the description field are correct. 0x20 and 0x0b at the beginning of a line cause the exception.
Maeda-san
Sorry, I was confused.
Thank you for preparing patch.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Committed.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
related_issues
relates,Closed,32971,New line between list items break a list