From 20eaca6d05ddeb56f5a76638e84211117c3f0131 Mon Sep 17 00:00:00 2001
From: pricly-yellow <79628427+pricly-yellow@users.noreply.github.com>
Date: Tue, 5 Oct 2021 21:41:48 +0700
Subject: [PATCH] Fix stange behavior of DownloadPullDiffOrPatch in incorect
 index (#17223)

Fix GetPullRequestByIndex by validate index > 1

Signed-off-by: Danila Kryukov <pricly_yellow@dismail.de>

Co-authored-by: a1012112796 <1012112796@qq.com>
---
 models/pull.go           |  3 +++
 models/pull_test.go      |  4 ++++
 routers/web/repo/pull.go | 21 ++++-----------------
 3 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/models/pull.go b/models/pull.go
index 004af62f0..38f2c1b8c 100644
--- a/models/pull.go
+++ b/models/pull.go
@@ -522,6 +522,9 @@ func GetLatestPullRequestByHeadInfo(repoID int64, branch string) (*PullRequest,
 
 // GetPullRequestByIndex returns a pull request by the given index
 func GetPullRequestByIndex(repoID, index int64) (*PullRequest, error) {
+	if index < 1 {
+		return nil, ErrPullRequestNotExist{}
+	}
 	pr := &PullRequest{
 		BaseRepoID: repoID,
 		Index:      index,
diff --git a/models/pull_test.go b/models/pull_test.go
index 2b7ef2f66..173977aaf 100644
--- a/models/pull_test.go
+++ b/models/pull_test.go
@@ -134,6 +134,10 @@ func TestGetPullRequestByIndex(t *testing.T) {
 	_, err = GetPullRequestByIndex(9223372036854775807, 9223372036854775807)
 	assert.Error(t, err)
 	assert.True(t, IsErrPullRequestNotExist(err))
+
+	_, err = GetPullRequestByIndex(1, 0)
+	assert.Error(t, err)
+	assert.True(t, IsErrPullRequestNotExist(err))
 }
 
 func TestGetPullRequestByID(t *testing.T) {
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index 9c9cf0f21..dde556135 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -1322,29 +1322,16 @@ func DownloadPullPatch(ctx *context.Context) {
 
 // DownloadPullDiffOrPatch render a pull's raw diff or patch
 func DownloadPullDiffOrPatch(ctx *context.Context, patch bool) {
-	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
+	pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 	if err != nil {
-		if models.IsErrIssueNotExist(err) {
-			ctx.NotFound("GetIssueByIndex", err)
+		if models.IsErrPullRequestNotExist(err) {
+			ctx.NotFound("GetPullRequestByIndex", err)
 		} else {
-			ctx.ServerError("GetIssueByIndex", err)
+			ctx.ServerError("GetPullRequestByIndex", err)
 		}
 		return
 	}
 
-	// Return not found if it's not a pull request
-	if !issue.IsPull {
-		ctx.NotFound("DownloadPullDiff",
-			fmt.Errorf("Issue is not a pull request"))
-		return
-	}
-
-	if err = issue.LoadPullRequest(); err != nil {
-		ctx.ServerError("LoadPullRequest", err)
-		return
-	}
-
-	pr := issue.PullRequest
 	binary := ctx.FormBool("binary")
 
 	if err := pull_service.DownloadDiffOrPatch(pr, ctx, patch, binary); err != nil {