From 3ef71a43d9bb4b674f388774a3a822def249f8d0 Mon Sep 17 00:00:00 2001 From: Mukaiu Date: Mon, 19 Jan 2026 10:01:03 +0800 Subject: [PATCH] api: fix nil pointer dereference when listing user repos (#8069) Co-authored-by: Joe Chen --- CHANGELOG.md | 1 + internal/route/api/v1/repo/repo.go | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6201a36f7..cbe804742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to Gogs are documented in this file. - Submodules using `ssh://` protocol and a port number are not rendered correctly. [#4941](https://github.com/gogs/gogs/issues/4941) - Missing link to user profile on the first commit in commits history page. [#7404](https://github.com/gogs/gogs/issues/7404) +- Route `GET /api/v1/user/repos` responses 500 when accessible repositories contain forks. [#8069](https://github.com/gogs/gogs/pull/8069) ## 0.13.3 diff --git a/internal/route/api/v1/repo/repo.go b/internal/route/api/v1/repo/repo.go index 51f767803..e69673bec 100644 --- a/internal/route/api/v1/repo/repo.go +++ b/internal/route/api/v1/repo/repo.go @@ -112,19 +112,28 @@ func listUserRepositories(c *context.APIContext, username string) { return } - accessibleRepos, err := database.Handle.Repositories().GetByCollaboratorIDWithAccessMode(c.Req.Context(), user.ID) + accessibleReposWithAccessMode, err := database.Handle.Repositories().GetByCollaboratorIDWithAccessMode(c.Req.Context(), user.ID) if err != nil { c.Error(err, "get repositories accesses by collaborator") return } + accessibleRepos := make([]*database.Repository, 0, len(accessibleReposWithAccessMode)) + for repo := range accessibleReposWithAccessMode { + accessibleRepos = append(accessibleRepos, repo) + } + if err = database.RepositoryList(accessibleRepos).LoadAttributes(); err != nil { + c.Error(err, "load attributes for accessible repositories") + return + } + numOwnRepos := len(ownRepos) - repos := make([]*api.Repository, 0, numOwnRepos+len(accessibleRepos)) + repos := make([]*api.Repository, 0, numOwnRepos+len(accessibleReposWithAccessMode)) for _, r := range ownRepos { repos = append(repos, r.APIFormatLegacy(&api.Permission{Admin: true, Push: true, Pull: true})) } - for repo, access := range accessibleRepos { + for repo, access := range accessibleReposWithAccessMode { repos = append(repos, repo.APIFormatLegacy(&api.Permission{ Admin: access >= database.AccessModeAdmin,