mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Make ParsePatch more robust (#17573)
This commit is contained in:
		| @@ -839,7 +839,12 @@ parsingLoop: | ||||
| 			case strings.HasPrefix(line, "--- "): | ||||
| 				// Handle ambiguous filenames | ||||
| 				if curFile.IsAmbiguous { | ||||
| 					if len(line) > 6 && line[4] == 'a' { | ||||
| 					// The shortest string that can end up here is: | ||||
| 					// "--- a\t\n" without the qoutes. | ||||
| 					// This line has a len() of 7 but doesn't contain a oldName. | ||||
| 					// So the amount that the line need is at least 8 or more. | ||||
| 					// The code will otherwise panic for a out-of-bounds. | ||||
| 					if len(line) > 7 && line[4] == 'a' { | ||||
| 						curFile.OldName = line[6 : len(line)-1] | ||||
| 						if line[len(line)-2] == '\t' { | ||||
| 							curFile.OldName = curFile.OldName[:len(curFile.OldName)-1] | ||||
| @@ -1194,6 +1199,11 @@ func readFileName(rd *strings.Reader) (string, bool) { | ||||
| 	_ = rd.UnreadByte() | ||||
| 	if char == '"' { | ||||
| 		fmt.Fscanf(rd, "%q ", &name) | ||||
| 		if len(name) == 0 { | ||||
| 			log.Error("Reader has no file name: %v", rd) | ||||
| 			return "", true | ||||
| 		} | ||||
|  | ||||
| 		if name[0] == '\\' { | ||||
| 			name = name[1:] | ||||
| 		} | ||||
|   | ||||
| @@ -541,3 +541,22 @@ func TestDiffToHTML_14231(t *testing.T) { | ||||
|  | ||||
| 	assertEqual(t, expected, output) | ||||
| } | ||||
|  | ||||
| func TestNoCrashes(t *testing.T) { | ||||
| 	type testcase struct { | ||||
| 		gitdiff string | ||||
| 	} | ||||
|  | ||||
| 	tests := []testcase{ | ||||
| 		{ | ||||
| 			gitdiff: "diff --git \n--- a\t\n", | ||||
| 		}, | ||||
| 		{ | ||||
| 			gitdiff: "diff --git \"0\n", | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, testcase := range tests { | ||||
| 		// It shouldn't crash, so don't care about the output. | ||||
| 		ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(testcase.gitdiff)) | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user