mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix nil pointer dereference error when open link with invalid pull index (#26353)
fix #26331 Before:  After: 
This commit is contained in:
		@@ -299,7 +299,7 @@ func ForkPost(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Redirect(ctxUser.HomeLink() + "/" + url.PathEscape(repo.Name))
 | 
						ctx.Redirect(ctxUser.HomeLink() + "/" + url.PathEscape(repo.Name))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func checkPullInfo(ctx *context.Context) *issues_model.Issue {
 | 
					func getPullInfo(ctx *context.Context) (issue *issues_model.Issue, ok bool) {
 | 
				
			||||||
	issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 | 
						issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if issues_model.IsErrIssueNotExist(err) {
 | 
							if issues_model.IsErrIssueNotExist(err) {
 | 
				
			||||||
@@ -307,43 +307,43 @@ func checkPullInfo(ctx *context.Context) *issues_model.Issue {
 | 
				
			|||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			ctx.ServerError("GetIssueByIndex", err)
 | 
								ctx.ServerError("GetIssueByIndex", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return nil
 | 
							return nil, false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err = issue.LoadPoster(ctx); err != nil {
 | 
						if err = issue.LoadPoster(ctx); err != nil {
 | 
				
			||||||
		ctx.ServerError("LoadPoster", err)
 | 
							ctx.ServerError("LoadPoster", err)
 | 
				
			||||||
		return nil
 | 
							return nil, false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := issue.LoadRepo(ctx); err != nil {
 | 
						if err := issue.LoadRepo(ctx); err != nil {
 | 
				
			||||||
		ctx.ServerError("LoadRepo", err)
 | 
							ctx.ServerError("LoadRepo", err)
 | 
				
			||||||
		return nil
 | 
							return nil, false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ctx.Data["Title"] = fmt.Sprintf("#%d - %s", issue.Index, issue.Title)
 | 
						ctx.Data["Title"] = fmt.Sprintf("#%d - %s", issue.Index, issue.Title)
 | 
				
			||||||
	ctx.Data["Issue"] = issue
 | 
						ctx.Data["Issue"] = issue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !issue.IsPull {
 | 
						if !issue.IsPull {
 | 
				
			||||||
		ctx.NotFound("ViewPullCommits", nil)
 | 
							ctx.NotFound("ViewPullCommits", nil)
 | 
				
			||||||
		return nil
 | 
							return nil, false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = issue.LoadPullRequest(ctx); err != nil {
 | 
						if err = issue.LoadPullRequest(ctx); err != nil {
 | 
				
			||||||
		ctx.ServerError("LoadPullRequest", err)
 | 
							ctx.ServerError("LoadPullRequest", err)
 | 
				
			||||||
		return nil
 | 
							return nil, false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = issue.PullRequest.LoadHeadRepo(ctx); err != nil {
 | 
						if err = issue.PullRequest.LoadHeadRepo(ctx); err != nil {
 | 
				
			||||||
		ctx.ServerError("LoadHeadRepo", err)
 | 
							ctx.ServerError("LoadHeadRepo", err)
 | 
				
			||||||
		return nil
 | 
							return nil, false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.IsSigned {
 | 
						if ctx.IsSigned {
 | 
				
			||||||
		// Update issue-user.
 | 
							// Update issue-user.
 | 
				
			||||||
		if err = activities_model.SetIssueReadBy(ctx, issue.ID, ctx.Doer.ID); err != nil {
 | 
							if err = activities_model.SetIssueReadBy(ctx, issue.ID, ctx.Doer.ID); err != nil {
 | 
				
			||||||
			ctx.ServerError("ReadBy", err)
 | 
								ctx.ServerError("ReadBy", err)
 | 
				
			||||||
			return nil
 | 
								return nil, false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return issue
 | 
						return issue, true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setMergeTarget(ctx *context.Context, pull *issues_model.PullRequest) {
 | 
					func setMergeTarget(ctx *context.Context, pull *issues_model.PullRequest) {
 | 
				
			||||||
@@ -361,14 +361,15 @@ func setMergeTarget(ctx *context.Context, pull *issues_model.PullRequest) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// GetPullDiffStats get Pull Requests diff stats
 | 
					// GetPullDiffStats get Pull Requests diff stats
 | 
				
			||||||
func GetPullDiffStats(ctx *context.Context) {
 | 
					func GetPullDiffStats(ctx *context.Context) {
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	pull := issue.PullRequest
 | 
						pull := issue.PullRequest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mergeBaseCommitID := GetMergedBaseCommitID(ctx, issue)
 | 
						mergeBaseCommitID := GetMergedBaseCommitID(ctx, issue)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.Written() {
 | 
						if mergeBaseCommitID == "" {
 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	} else if mergeBaseCommitID == "" {
 | 
					 | 
				
			||||||
		ctx.NotFound("PullFiles", nil)
 | 
							ctx.NotFound("PullFiles", nil)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -702,8 +703,8 @@ type pullCommitList struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// GetPullCommits get all commits for given pull request
 | 
					// GetPullCommits get all commits for given pull request
 | 
				
			||||||
func GetPullCommits(ctx *context.Context) {
 | 
					func GetPullCommits(ctx *context.Context) {
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	resp := &pullCommitList{}
 | 
						resp := &pullCommitList{}
 | 
				
			||||||
@@ -735,8 +736,8 @@ func ViewPullCommits(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Data["PageIsPullList"] = true
 | 
						ctx.Data["PageIsPullList"] = true
 | 
				
			||||||
	ctx.Data["PageIsPullCommits"] = true
 | 
						ctx.Data["PageIsPullCommits"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pull := issue.PullRequest
 | 
						pull := issue.PullRequest
 | 
				
			||||||
@@ -779,8 +780,8 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
 | 
				
			|||||||
	ctx.Data["PageIsPullList"] = true
 | 
						ctx.Data["PageIsPullList"] = true
 | 
				
			||||||
	ctx.Data["PageIsPullFiles"] = true
 | 
						ctx.Data["PageIsPullFiles"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pull := issue.PullRequest
 | 
						pull := issue.PullRequest
 | 
				
			||||||
@@ -1016,8 +1017,8 @@ func ViewPullFilesForAllCommitsOfPr(ctx *context.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// UpdatePullRequest merge PR's baseBranch into headBranch
 | 
					// UpdatePullRequest merge PR's baseBranch into headBranch
 | 
				
			||||||
func UpdatePullRequest(ctx *context.Context) {
 | 
					func UpdatePullRequest(ctx *context.Context) {
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if issue.IsClosed {
 | 
						if issue.IsClosed {
 | 
				
			||||||
@@ -1101,8 +1102,8 @@ func UpdatePullRequest(ctx *context.Context) {
 | 
				
			|||||||
// MergePullRequest response for merging pull request
 | 
					// MergePullRequest response for merging pull request
 | 
				
			||||||
func MergePullRequest(ctx *context.Context) {
 | 
					func MergePullRequest(ctx *context.Context) {
 | 
				
			||||||
	form := web.GetForm(ctx).(*forms.MergePullRequestForm)
 | 
						form := web.GetForm(ctx).(*forms.MergePullRequestForm)
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1308,8 +1309,8 @@ func MergePullRequest(ctx *context.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CancelAutoMergePullRequest cancels a scheduled pr
 | 
					// CancelAutoMergePullRequest cancels a scheduled pr
 | 
				
			||||||
func CancelAutoMergePullRequest(ctx *context.Context) {
 | 
					func CancelAutoMergePullRequest(ctx *context.Context) {
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1447,8 +1448,8 @@ func CompareAndPullRequestPost(ctx *context.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CleanUpPullRequest responses for delete merged branch when PR has been merged
 | 
					// CleanUpPullRequest responses for delete merged branch when PR has been merged
 | 
				
			||||||
func CleanUpPullRequest(ctx *context.Context) {
 | 
					func CleanUpPullRequest(ctx *context.Context) {
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -259,8 +259,8 @@ type viewedFilesUpdate struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func UpdateViewedFiles(ctx *context.Context) {
 | 
					func UpdateViewedFiles(ctx *context.Context) {
 | 
				
			||||||
	// Find corresponding PR
 | 
						// Find corresponding PR
 | 
				
			||||||
	issue := checkPullInfo(ctx)
 | 
						issue, ok := getPullInfo(ctx)
 | 
				
			||||||
	if ctx.Written() {
 | 
						if !ok {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pull := issue.PullRequest
 | 
						pull := issue.PullRequest
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user