repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

commit
780f9e1
parent
fbdea17
author
Eric Bower
date
2025-12-15 23:01:27 -0500 EST
fix(pgs): memory leaks

All changes replace defer with immediate Close() calls to ensure resources are released promptly rather than accumulating until function return.
1 files changed,  +5, -9
M pkg/apps/pgs/web_asset_handler.go
+5, -9
 1@@ -51,10 +51,8 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 2 		logger.Info("_redirects not found in lru cache", "key", redirectsCacheKey)
 3 		redirectFp, redirectInfo, err := h.Cfg.Storage.GetObject(h.Bucket, filepath.Join(h.ProjectDir, "_redirects"))
 4 		if err == nil {
 5-			defer func() {
 6-				_ = redirectFp.Close()
 7-			}()
 8 			if redirectInfo != nil && redirectInfo.Size > h.Cfg.MaxSpecialFileSize {
 9+				_ = redirectFp.Close()
10 				errMsg := fmt.Sprintf("_redirects file is too large (%d > %d)", redirectInfo.Size, h.Cfg.MaxSpecialFileSize)
11 				logger.Error(errMsg)
12 				http.Error(w, errMsg, http.StatusInternalServerError)
13@@ -63,6 +61,7 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
14 			buf := new(strings.Builder)
15 			lr := io.LimitReader(redirectFp, h.Cfg.MaxSpecialFileSize)
16 			_, err := io.Copy(buf, lr)
17+			_ = redirectFp.Close()
18 			if err != nil {
19 				logger.Error("io copy", "err", err.Error())
20 				http.Error(w, "cannot read _redirects file", http.StatusInternalServerError)
21@@ -109,9 +108,7 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
22 				if err != nil {
23 					continue
24 				}
25-				defer func() {
26-					_ = obj.Close()
27-				}()
28+				_ = obj.Close()
29 			}
30 			logger.Info(
31 				"redirecting request",
32@@ -219,10 +216,8 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
33 		logger.Info("_headers not found in lru cache", "key", headersCacheKey)
34 		headersFp, headersInfo, err := h.Cfg.Storage.GetObject(h.Bucket, filepath.Join(h.ProjectDir, "_headers"))
35 		if err == nil {
36-			defer func() {
37-				_ = headersFp.Close()
38-			}()
39 			if headersInfo != nil && headersInfo.Size > h.Cfg.MaxSpecialFileSize {
40+				_ = headersFp.Close()
41 				errMsg := fmt.Sprintf("_headers file is too large (%d > %d)", headersInfo.Size, h.Cfg.MaxSpecialFileSize)
42 				logger.Error(errMsg)
43 				http.Error(w, errMsg, http.StatusInternalServerError)
44@@ -231,6 +226,7 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
45 			buf := new(strings.Builder)
46 			lr := io.LimitReader(headersFp, h.Cfg.MaxSpecialFileSize)
47 			_, err := io.Copy(buf, lr)
48+			_ = headersFp.Close()
49 			if err != nil {
50 				logger.Error("io copy", "err", err.Error())
51 				http.Error(w, "cannot read _headers file", http.StatusInternalServerError)