Skip to content

Commit 8f154c6

Browse files
committed
object_db: prevent FD leaks when writing blobs
When writing a blob, there are two places where we use temporary files. First, we use them when we write the blob itself. Second, we use them when we encode the buffer. In both of these cases, however, we failed to close the file after we were done with it, leading to file descriptor leaks until Go garbage-collected the items. Add a helper function to close and remove these files and use it in each of these places. Place the os.Remove statement after the Close statement, since Windows will be happier if we don't try to remove a file we have open.
1 parent 1d0a28b commit 8f154c6

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

object_db.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func (o *ObjectDatabase) WriteBlob(b *Blob) ([]byte, error) {
158158
if err != nil {
159159
return nil, err
160160
}
161-
defer os.Remove(buf.Name())
161+
defer o.cleanup(buf)
162162

163163
sha, _, err := o.encodeBuffer(b, buf)
164164
if err != nil {
@@ -236,7 +236,7 @@ func (d *ObjectDatabase) encodeBuffer(object Object, buf io.ReadWriter) (sha []b
236236
if err != nil {
237237
return nil, 0, err
238238
}
239-
defer os.Remove(tmp.Name())
239+
defer d.cleanup(tmp)
240240

241241
to := NewObjectWriter(tmp)
242242
if _, err = to.WriteHeader(object.Type(), int64(cn)); err != nil {
@@ -323,3 +323,8 @@ func (o *ObjectDatabase) decode(r *ObjectReader, into Object) error {
323323
}
324324
return r.Close()
325325
}
326+
327+
func (o *ObjectDatabase) cleanup(f *os.File) {
328+
f.Close()
329+
os.Remove(f.Name())
330+
}

0 commit comments

Comments
 (0)