From 669c76c0fdd006c81109ce22565a5921983d1c16 Mon Sep 17 00:00:00 2001
From: Giteabot <teabot@gitea.io>
Date: Mon, 3 Apr 2023 19:26:14 -0400
Subject: [PATCH] Fix `cases.Title` crash for concurrency (#23885) (#23903)

Backport #23885 by @wxiaoguang

Regression of #19676 and #21814

Fix #23872

`cases.Title` is not thread-safe, it has internal state, so it can't be
used as a global shared variable.

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
---
 modules/util/util.go | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/modules/util/util.go b/modules/util/util.go
index 9d3a8dcfac..b2800d6a0c 100644
--- a/modules/util/util.go
+++ b/modules/util/util.go
@@ -185,19 +185,16 @@ func ToUpperASCII(s string) string {
 	return string(b)
 }
 
-var (
-	titleCaser        = cases.Title(language.English)
-	titleCaserNoLower = cases.Title(language.English, cases.NoLower)
-)
-
 // ToTitleCase returns s with all english words capitalized
 func ToTitleCase(s string) string {
-	return titleCaser.String(s)
+	// `cases.Title` is not thread-safe, do not use global shared variable for it
+	return cases.Title(language.English).String(s)
 }
 
-// ToTitleCaseNoLower returns s with all english words capitalized without lowercasing
+// ToTitleCaseNoLower returns s with all english words capitalized without lower-casing
 func ToTitleCaseNoLower(s string) string {
-	return titleCaserNoLower.String(s)
+	// `cases.Title` is not thread-safe, do not use global shared variable for it
+	return cases.Title(language.English, cases.NoLower).String(s)
 }
 
 var (