Error 500 in file explorer because of newline in filename
Summary
If a file name contains a newline, the GitLab file explorer throws an error 500 if the corresponding directory is opened. This can be reproduced on gitlab.com:
touch "tesfile
withnewline"
git add .
git commit -m "testcommit"
git push
The error message is:
ActionView::Template::Error (No route matches {:action=>"show", :controller=>"projects/blob", :id=>"master/tesfile\nwithnewline", :namespace_id=>#<Namespace id: 3, name: "danielsteinborn", path: "danielsteinborn", [...]
2: %td.tree-item-file-name
3: = tree_icon(type, blob_item.mode, blob_item.name)
4: - file_name = blob_item.name
5: = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@id || @commit.id, blob_item.name)), title: file_name do
6: %span.str-truncated= file_name
7: %td.tree_time_ago.cgray
8: = render 'projects/tree/spinner'
app/views/projects/tree/_blob_item.html.haml:5:in `_app_views_projects_tree__blob_item_html_haml___447348481820865914_70098507247960'
app/views/projects/tree/_tree_row.html.haml:4:in `_app_views_projects_tree__tree_row_html_haml__1891683895317197213_70098508468320'
app/helpers/tree_helper.rb:11:in `render_tree'
app/views/projects/tree/_tree_content.html.haml:27:in `_app_views_projects_tree__tree_content_html_haml___3135900919490192880_70098509543660'
app/views/projects/tree/show.html.haml:20:in `_app_views_projects_tree_show_html_haml__4466331922593125455_70098516128380'
app/controllers/projects/tree_controller.rb:27:in `show'
lib/gitlab/request_profiler/middleware.rb:15:in `call'
lib/gitlab/middleware/go.rb:16:in `call'
Please let me know if further information is needed.
Steps to reproduce
- Create and clone a new project
- Create a new file with a newline in the filename
- Push the changes to above project's repo
- Navigate to the Project's repository page
Expected behavior
- File with newline in filename should be indexed in the Repository view like all other files
Actual behavior
- 500 error results as the path to the file cannot be built
Relevant logs and/or screenshots
- Project currently exhibiting the problem: https://gitlab.com/issue-reproduce/newline-filenames-500
- Exception:
No route matches {:action=>"show", :controller=>"projects/blob", :id=>"master/file_with_new\nline.rb", :namespace_id=>#<Group id: 785414, name: "issue-reproduce", path: "issue-reproduce", owner_id: nil, created_at: "2016-08-10 13:06:06", updated_at: "2016-08-10 13:06:06", type: "Group", description: "", avatar: nil, membership_lock: false, share_with_group_lock: false, visibility_level: 20, request_access_enabled: true, ldap_sync_status: "ready", ldap_sync_error: nil, ldap_sync_last_update_at: nil, ldap_sync_last_successful_update_at: nil, ldap_sync_last_sync_at: nil, deleted_at: nil>, :project_id=>#<Project id: 1623572, name: "newline-filenames-500", path: "newline-filenames-500", description: "", created_at: "2016-09-05 09:31:22", updated_at: "2016-09-05 09:34:44", creator_id: 419655, issues_enabled: true, merge_requests_enabled: true, wiki_enabled: true, namespace_id: 785414, snippets_enabled: false, last_activity_at: "2016-09-05 09:34:10", import_url: nil, visibility_level: 20, archived: false, import_status: "none", repository_size: 0.07, merge_requests_template: nil, star_count: 0, merge_requests_rebase_enabled: false, import_type: nil, import_source: nil, avatar: nil, approvals_before_merge: 0, reset_approvals_on_push: true, commit_count: 1, merge_requests_ff_only_enabled: false, issues_template: nil, mirror: false, mirror_last_update_at: nil, mirror_last_successful_update_at: nil, mirror_user_id: 419655, import_error: nil, ci_id: nil, builds_enabled: true, shared_runners_enabled: true, runners_token: "VhXf8_2e165-LTdYSrzk", build_coverage_regex: nil, build_allow_git_fetch: true, build_timeout: 3600, mirror_trigger_builds: false, public_builds: true, pending_delete: false, pushes_since_gc: 1, last_repository_check_failed: nil, last_repository_check_at: nil, container_registry_enabled: true, only_allow_merge_if_build_succeeds: false, has_external_issue_tracker: false, repository_storage: "alternate", request_access_enabled: true, has_external_wiki: false, repository_read_only: nil>} missing required keys: [:id]
ActionController::UrlGenerationError
No route matches {:action=>"show", :controller=>"projects/blob", :id=>"master/file_with_new\nline.rb", :namespace_id=>#<Group id: 785414, name: "issue-reproduce", path: "issue-reproduce", owner_id: nil, created_at: "2016-08-10 13:06:06", updated_at: "2016-08-10 13:06:06", type: "Group", description: "", avatar: nil, membership_lock: false, share_with_group_lock: false, visibility_level: 20, request_access_enabled: true, ldap_sync_status: "ready", ldap_sync_error: nil, ldap_sync_last_update_at: nil, ldap_sync_last_successful_update_at: nil, ldap_sync_last_sync_at: nil, deleted_at: nil>, :project_id=>#<Project id: 1623572, name: "newline-filenames-500", path: "newline-filenames-500", description: "", created_at: "2016-09-05 09:31:22", updated_at: "2016-09-05 09:34:44", creator_id: 419655, issues_enabled: true, merge_requests_enabled: true, wiki_enabled: true, namespace_id: 785414, snippets_enabled: false, last_activity_at: "2016-09-05 09:34:10", import_url: nil, visibility_level: 20, archived: false, import_status: "none", repository_size: 0.07, merge_requests_template: nil, star_count: 0, merge_requests_rebase_enabled: false, import_type: nil, import_source: nil, avatar: nil, approvals_before_merge: 0, reset_approvals_on_push: true, commit_count: 1, merge_requests_ff_only_enabled: false, issues_template: nil, mirror: false, mirror_last_update_at: nil, mirror_last_successful_update_at: nil, mirror_user_id: 419655, import_error: nil, ci_id: nil, builds_enabled: true, shared_runners_enabled: true, runners_token: "VhXf8_2e165-LTdYSrzk", build_coverage_regex: nil, build_allow_git_fetch: true, build_timeout: 3600, mirror_trigger_builds: false, public_builds: true, pending_delete: false, pushes_since_gc: 1, last_repository_check_failed: nil, last_repository_check_at: nil, container_registry_enabled: true, only_allow_merge_if_build_succeeds: false, has_external_issue_tracker: false, repository_storage: "alternate", request_access_enabled: true, has_external_wiki: false, repository_read_only: nil>} missing required keys: [:id]
app/views/projects/tree/_blob_item.html.haml in _app_views_projects_tree__blob_item_html_haml___1401491057786075004_54618300 at line 5application
= link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@id || @commit.id, blob_item.name)), title: file_name do
action_view/template.rb in block in render at line 145
view.send(method_name, locals, buffer, &block)
app/views/projects/tree/_tree_row.html.haml in _app_views_projects_tree__tree_row_html_haml___4109350012090398479_56424720 at line 4application
= render partial: 'projects/tree/blob_item', object: tree_row, as: 'blob_item', locals: { type: 'file' }
action_view/template.rb in block in render at line 145
view.send(method_name, locals, buffer, &block)
app/helpers/tree_helper.rb in render_tree at line 11application
tree << render(partial: "projects/tree/tree_row", collection: items) if items.present?
app/views/projects/tree/_tree_content.html.haml in _app_views_projects_tree__tree_content_html_haml__1799017782151855362_58666840 at line 28application
= render_tree(tree)
action_view/template.rb in block in render at line 145
view.send(method_name, locals, buffer, &block)
app/views/projects/_files.html.haml in _app_views_projects__files_html_haml___2426984300169896575_180754020 at line 5application
= render 'projects/tree/tree_content', tree: @tree
action_view/template.rb in block in render at line 145
view.send(method_name, locals, buffer, &block)
app/views/projects/show.html.haml in _app_views_projects_show_html_haml__4431105152834046048_64257920 at line 91application
= render default_project_view
action_view/template.rb in block in render at line 145
view.send(method_name, locals, buffer, &block)
app/controllers/projects_controller.rb in block (2 levels) in show at line 112application
render :show
action_controller/metal/mime_responds.rb in respond_to at line 217
response ? response.call : render({})
app/controllers/projects_controller.rb in show at line 104application
respond_to do |format|
action_controller/metal/implicit_render.rb in send_action at line 4
ret = super
lib/gitlab/request_profiler/middleware.rb in call at line 15application
@app.call(env)
lib/gitlab/middleware/rails_queue_duration.rb in call at line 20application
@app.call(env)
lib/gitlab/metrics/rack_middleware.rb in block in call at line 18application
retval = trans.run { @app.call(env) }
lib/gitlab/metrics/transaction.rb in run at line 49application
yield
lib/gitlab/metrics/rack_middleware.rb in call at line 18application
retval = trans.run { @app.call(env) }
lib/gitlab/middleware/go.rb in call at line 16application
@app.call(env)
rack/cors.rb in call at line 80
status, headers, body = @app.call env
lib/gitlab/middleware/readonly_geo.rb in call at line 29application
@app.call(env)
action_dispatch/middleware/flash.rb in call at line 260
@app.call(env)
Output of checks
Results of GitLab application Check
N/A GitLab.com
Results of GitLab environment info
Currently reproducible in 8.11.4
Possible fixes
(If you can, link to the line of code that might be responsible for the problem)
Edited by Chad Woolley