From 9119d2457365afade30c1f4999e9998c2295665e Mon Sep 17 00:00:00 2001 From: zeripath Date: Mon, 30 Aug 2021 21:50:35 +0100 Subject: [PATCH] Ensure wiki repos are all closed (#16886) There are multiple places where wiki git repositories are not properly closed. This PR ensures they are closed. Signed-off-by: Andrew Thornton --- routers/web/repo/wiki.go | 66 +++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index 2057229bf..f0b91aae9 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -135,6 +135,9 @@ func wikiContentsByName(ctx *context.Context, commit *git.Commit, wikiName strin func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { wikiRepo, commit, err := findWikiRepoCommit(ctx) if err != nil { + if wikiRepo != nil { + wikiRepo.Close() + } if !git.IsErrNotExist(err) { ctx.ServerError("GetBranchCommit", err) } @@ -222,6 +225,9 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { var buf strings.Builder if err := markdown.Render(rctx, bytes.NewReader(data), &buf); err != nil { + if wikiRepo != nil { + wikiRepo.Close() + } ctx.ServerError("Render", err) return nil, nil } @@ -229,6 +235,9 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { buf.Reset() if err := markdown.Render(rctx, bytes.NewReader(sidebarContent), &buf); err != nil { + if wikiRepo != nil { + wikiRepo.Close() + } ctx.ServerError("Render", err) return nil, nil } @@ -237,6 +246,9 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { buf.Reset() if err := markdown.Render(rctx, bytes.NewReader(footerContent), &buf); err != nil { + if wikiRepo != nil { + wikiRepo.Close() + } ctx.ServerError("Render", err) return nil, nil } @@ -377,17 +389,14 @@ func Wiki(ctx *context.Context) { } wikiRepo, entry := renderViewPage(ctx) - if ctx.Written() { - if wikiRepo != nil { - wikiRepo.Close() - } - return - } defer func() { if wikiRepo != nil { wikiRepo.Close() } }() + if ctx.Written() { + return + } if entry == nil { ctx.Data["Title"] = ctx.Tr("repo.wiki") ctx.HTML(http.StatusOK, tplWikiStart) @@ -422,17 +431,15 @@ func WikiRevision(ctx *context.Context) { } wikiRepo, entry := renderRevisionPage(ctx) - if ctx.Written() { - if wikiRepo != nil { - wikiRepo.Close() - } - return - } defer func() { if wikiRepo != nil { wikiRepo.Close() } }() + + if ctx.Written() { + return + } if entry == nil { ctx.Data["Title"] = ctx.Tr("repo.wiki") ctx.HTML(http.StatusOK, tplWikiStart) @@ -469,13 +476,14 @@ func WikiPages(ctx *context.Context) { } return } - - entries, err := commit.ListEntries() - if err != nil { + defer func() { if wikiRepo != nil { wikiRepo.Close() } + }() + entries, err := commit.ListEntries() + if err != nil { ctx.ServerError("ListEntries", err) return } @@ -486,10 +494,6 @@ func WikiPages(ctx *context.Context) { } c, err := wikiRepo.GetCommitByPath(entry.Name()) if err != nil { - if wikiRepo != nil { - wikiRepo.Close() - } - ctx.ServerError("GetCommit", err) return } @@ -498,10 +502,6 @@ func WikiPages(ctx *context.Context) { if models.IsErrWikiInvalidFileName(err) { continue } - if wikiRepo != nil { - wikiRepo.Close() - } - ctx.ServerError("WikiFilenameToName", err) return } @@ -513,21 +513,25 @@ func WikiPages(ctx *context.Context) { } ctx.Data["Pages"] = pages - defer func() { - if wikiRepo != nil { - wikiRepo.Close() - } - }() ctx.HTML(http.StatusOK, tplWikiPages) } // WikiRaw outputs raw blob requested by user (image for example) func WikiRaw(ctx *context.Context) { wikiRepo, commit, err := findWikiRepoCommit(ctx) - if err != nil { + defer func() { if wikiRepo != nil { + wikiRepo.Close() + } + }() + + if err != nil { + if git.IsErrNotExist(err) { + ctx.NotFound("findEntryForFile", nil) return } + ctx.ServerError("findEntryForfile", err) + return } providedPath := ctx.Params("*") @@ -543,9 +547,7 @@ func WikiRaw(ctx *context.Context) { if entry == nil { // Try to find a wiki page with that name - if strings.HasSuffix(providedPath, ".md") { - providedPath = providedPath[:len(providedPath)-3] - } + providedPath = strings.TrimSuffix(providedPath, ".md") wikiPath := wiki_service.NameToFilename(providedPath) entry, err = findEntryForFile(commit, wikiPath)