]> source.dussan.org Git - gitea.git/commitdiff
Ensure wiki repos are all closed (#16886)
authorzeripath <art27@cantab.net>
Mon, 30 Aug 2021 20:50:35 +0000 (21:50 +0100)
committerGitHub <noreply@github.com>
Mon, 30 Aug 2021 20:50:35 +0000 (22:50 +0200)
There are multiple places where wiki git repositories are not properly closed.

This PR ensures they are closed.

Signed-off-by: Andrew Thornton <art27@cantab.net>
routers/web/repo/wiki.go

index 2057229bf955920b49b53b33ec49d1bb404a5e8b..f0b91aae995f43bacc8eec8ed129ba1214790c61 100644 (file)
@@ -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)