浏览代码

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 年之前
父节点
当前提交
cdedc2d188
共有 1 个文件被更改,包括 12 次插入3 次删除
  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
 	}