]> source.dussan.org Git - gitea.git/commitdiff
Prevent panic on merge to PR (#10403)
authorzeripath <art27@cantab.net>
Fri, 21 Feb 2020 18:18:13 +0000 (18:18 +0000)
committerGitHub <noreply@github.com>
Fri, 21 Feb 2020 18:18:13 +0000 (18:18 +0000)
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.

integrations/git_test.go
services/pull/pull.go

index 7753b2cb726c6f65e10150a91aa08cf99d4091c9..8e02bc4db9045658bc2ad4c8a4dcd6accec06752 100644 (file)
@@ -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))
index 6e51ad0a2411225792360f0f70496ce9c877610c..6af751856d4f0927948852bee506c453ec75c4b9 100644 (file)
@@ -324,6 +324,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{
@@ -340,6 +344,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)
        }