From 7284327a0077414a35f46feb25a95fd448547f9d Mon Sep 17 00:00:00 2001 From: guillep2k <18600385+guillep2k@users.noreply.github.com> Date: Fri, 21 Feb 2020 19:53:32 -0300 Subject: [PATCH] Prevent panic on merge to PR (#10403) (#10408) If you attempt to merge to a branch which on a PR there will be a nil pointer error in the pull request checker. This panic is uncaught and will bring down the gitea server. This PR adds protection to prevent this. Co-authored-by: zeripath --- integrations/git_test.go | 11 +++++++++++ services/pull/pull.go | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/integrations/git_test.go b/integrations/git_test.go index 7753b2cb7..8e02bc4db 100644 --- a/integrations/git_test.go +++ b/integrations/git_test.go @@ -351,6 +351,17 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes pr, err = doAPICreatePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, "protected", "unprotected")(t) assert.NoError(t, err) }) + t.Run("GenerateCommit", func(t *testing.T) { + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + assert.NoError(t, err) + }) + t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected-2")) + var pr2 api.PullRequest + t.Run("CreatePullRequest", func(t *testing.T) { + pr2, err = doAPICreatePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, "unprotected", "unprotected-2")(t) + assert.NoError(t, err) + }) + t.Run("MergePR2", doAPIMergePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr2.Index)) t.Run("MergePR", doAPIMergePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)) t.Run("PullProtected", doGitPull(dstPath, "origin", "protected")) t.Run("ProtectProtectedBranchWhitelist", doProtectBranch(ctx, "protected", baseCtx.Username)) diff --git a/services/pull/pull.go b/services/pull/pull.go index 347fe077a..2a09c98bf 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -231,6 +231,10 @@ func PushToBaseRepo(pr *models.PullRequest) (err error) { } }() + if err := pr.LoadHeadRepo(); err != nil { + log.Error("Unable to load head repository for PR[%d] Error: %v", pr.ID, err) + return err + } headRepoPath := pr.HeadRepo.RepoPath() if err := git.Clone(headRepoPath, tmpBasePath, git.CloneRepoOptions{ @@ -247,6 +251,10 @@ func PushToBaseRepo(pr *models.PullRequest) (err error) { return fmt.Errorf("OpenRepository: %v", err) } + if err := pr.LoadBaseRepo(); err != nil { + log.Error("Unable to load base repository for PR[%d] Error: %v", pr.ID, err) + return err + } if err := gitRepo.AddRemote("base", pr.BaseRepo.RepoPath(), false); err != nil { return fmt.Errorf("tmpGitRepo.AddRemote: %v", err) }