From 9119d2457365afade30c1f4999e9998c2295665e Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
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 <art27@cantab.net>
---
 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 2057229bf9..f0b91aae99 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)