Forráskód Böngészése

Use temporary file to avoid out-of-memory when receiving big chunks. (#3748)

* Use temporary file to avoid out-of-memory when receiving big chunk.

Not perfect but I think it's a reasonable solution.
For small request bodies, I suppose performance wouldn't be an issue.
For large ones, this seems to be a necessary evil.

* Must close the open file to avoid fd leaks
typeless 8 éve
szülő
commit
cdedc2d188
1 módosított fájl, 12 hozzáadás és 3 törlés
  1. 12 3
      routers/repo/http.go

+ 12 - 3
routers/repo/http.go

@@ -364,14 +364,23 @@ func serviceRPC(h serviceHandler, service string) {
 	}
 
 	if h.cfg.OnSucceed != nil {
-		input, err = ioutil.ReadAll(reqBody)
+		tmpfile, err := ioutil.TempFile("", "gogs")
 		if err != nil {
-			log.GitLogger.Error(2, "fail to read request body: %v", err)
+			log.GitLogger.Error(2, "fail to create temporary file: %v", err)
 			h.w.WriteHeader(http.StatusInternalServerError)
 			return
 		}
+		defer os.Remove(tmpfile.Name())
+		defer tmpfile.Close()
 
-		br = bytes.NewReader(input)
+		_, err = io.Copy(tmpfile, reqBody)
+		if err != nil {
+			log.GitLogger.Error(2, "fail to save request body: %v", err)
+			h.w.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+
+		br = tmpfile
 	} else {
 		br = reqBody
 	}