From 720c192831a890d0a36b4c6720b60411fa4a0159 Mon Sep 17 00:00:00 2001 From: zeripath Date: Wed, 12 May 2021 21:42:07 +0100 Subject: plumbing: format/packfile, prevent large objects from being read into memory completely (#303) This PR adds code to prevent large objects from being read into memory from packfiles or the filesystem. Objects greater than 1Mb are now no longer directly stored in the cache or read completely into memory. Signed-off-by: Andrew Thornton --- utils/ioutil/common.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'utils') diff --git a/utils/ioutil/common.go b/utils/ioutil/common.go index b52e85a..a0e79a2 100644 --- a/utils/ioutil/common.go +++ b/utils/ioutil/common.go @@ -55,6 +55,28 @@ func NewReadCloser(r io.Reader, c io.Closer) io.ReadCloser { return &readCloser{Reader: r, closer: c} } +type readCloserCloser struct { + io.ReadCloser + closer func() error +} + +func (r *readCloserCloser) Close() (err error) { + defer func() { + if err == nil { + err = r.closer() + return + } + _ = r.closer() + }() + return r.ReadCloser.Close() +} + +// NewReadCloserWithCloser creates an `io.ReadCloser` with the given `io.ReaderCloser` and +// `io.Closer` that ensures that the closer is closed on close +func NewReadCloserWithCloser(r io.ReadCloser, c func() error) io.ReadCloser { + return &readCloserCloser{ReadCloser: r, closer: c} +} + type writeCloser struct { io.Writer closer io.Closer -- cgit