From 18398152fa4e5237a7b682d955457b12a7d59b31 Mon Sep 17 00:00:00 2001
From: Sean McGivern <sean@gitlab.com>
Date: Fri, 29 Jul 2016 15:17:06 +0100
Subject: [PATCH] Raise errors for large and binary files

---
 lib/gitlab/conflict/parser.rb           |  6 +++++-
 spec/lib/gitlab/conflict/parser_spec.rb | 26 ++++++++++++++++---------
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/lib/gitlab/conflict/parser.rb b/lib/gitlab/conflict/parser.rb
index 8ab7b6499aa..9f27cba353a 100644
--- a/lib/gitlab/conflict/parser.rb
+++ b/lib/gitlab/conflict/parser.rb
@@ -10,8 +10,12 @@ module Gitlab
       class MissingEndDelimiter < ParserError
       end
 
+      class UnmergeableFile < ParserError
+      end
+
       def parse(text, our_path:, their_path:, parent: nil)
-        return [] if text.blank?
+        raise UnmergeableFile if text.blank? # Typically a binary file
+        raise UnmergeableFile if text.length > 102400
 
         line_obj_index = 0
         line_old = 1
diff --git a/spec/lib/gitlab/conflict/parser_spec.rb b/spec/lib/gitlab/conflict/parser_spec.rb
index 1eda14f3e26..65a828accde 100644
--- a/spec/lib/gitlab/conflict/parser_spec.rb
+++ b/spec/lib/gitlab/conflict/parser_spec.rb
@@ -4,6 +4,10 @@ describe Gitlab::Conflict::Parser, lib: true do
   let(:parser) { Gitlab::Conflict::Parser.new }
 
   describe '#parse' do
+    def parse_text(text)
+      parser.parse(text, our_path: 'README.md', their_path: 'README.md')
+    end
+
     context 'when the file has valid conflicts' do
       let(:text) do
         <<CONFLICT
@@ -116,12 +120,6 @@ CONFLICT
     end
 
     context 'when the file contents include conflict delimiters' do
-      let(:path) { 'README.md' }
-
-      def parse_text(text)
-        parser.parse(text, our_path: path, their_path: path)
-      end
-
       it 'raises UnexpectedDelimiter when there is a non-start delimiter first' do
         expect { parse_text('=======') }.
           to raise_error(Gitlab::Conflict::Parser::UnexpectedDelimiter)
@@ -172,9 +170,19 @@ CONFLICT
       end
     end
 
-    context 'when lines is blank' do
-      it { expect(parser.parse('', our_path: 'README.md', their_path: 'README.md')).to eq([]) }
-      it { expect(parser.parse(nil, our_path: 'README.md', their_path: 'README.md')).to eq([]) }
+    context 'other file types' do
+      it 'raises UnmergeableFile when lines is blank, indicating a binary file' do
+        expect { parse_text('') }.
+          to raise_error(Gitlab::Conflict::Parser::UnmergeableFile)
+
+        expect { parse_text(nil) }.
+          to raise_error(Gitlab::Conflict::Parser::UnmergeableFile)
+      end
+
+      it 'raises UnmergeableFile when the file is over 100 KB' do
+        expect { parse_text('a' * 102401) }.
+          to raise_error(Gitlab::Conflict::Parser::UnmergeableFile)
+      end
     end
   end
 end
-- 
2.30.9