From 53a0bbeb5b604503b61f6d4aa38414babe4de66c Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 29 Aug 2018 19:18:00 -0700 Subject: [PATCH] Encrypted reader wrapped in NewGetObjectReader should be closed (#6383) --- cmd/object-handlers.go | 6 ++++++ cmd/xl-v1-object.go | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index 38629c4bf..d61abf5e1 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -233,6 +233,9 @@ func (api objectAPIHandlers) SelectObjectContentHandler(w http.ResponseWriter, r encReader = io.LimitReader(ioutil.NewSkipReader(encReader, startOffset%(64*1024)), length) cleanUp := func() { reader.Close() } reader = NewGetObjectReader(encReader, nil, cleanUp) + if reader != nil { + defer reader.Close() + } if s3Encrypted { w.Header().Set(crypto.SSEHeader, crypto.SSEAlgorithmAES256) } else { @@ -416,6 +419,9 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req encReader = io.LimitReader(ioutil.NewSkipReader(encReader, startOffset%(64*1024)), length) cleanUp := func() { reader.Close() } reader = NewGetObjectReader(encReader, nil, cleanUp) + if reader != nil { + defer reader.Close() + } if s3Encrypted { w.Header().Set(crypto.SSEHeader, crypto.SSEAlgorithmAES256) } else { diff --git a/cmd/xl-v1-object.go b/cmd/xl-v1-object.go index ae99f911f..36ff58f11 100644 --- a/cmd/xl-v1-object.go +++ b/cmd/xl-v1-object.go @@ -170,29 +170,26 @@ func (xl xlObjects) GetObjectNInfo(ctx context.Context, bucket, object string, r if err = lock.GetRLock(globalObjectTimeout); err != nil { return objInfo, nil, err } - objReader := &GetObjectReader{ - lock: lock, - } if err = checkGetObjArgs(ctx, bucket, object); err != nil { - return objInfo, objReader, err + return objInfo, nil, err } if hasSuffix(object, slashSeparator) { if !xl.isObjectDir(bucket, object) { - return objInfo, objReader, toObjectErr(errFileNotFound, bucket, object) + return objInfo, nil, toObjectErr(errFileNotFound, bucket, object) } var e error if objInfo, e = xl.getObjectInfoDir(ctx, bucket, object); e != nil { - return objInfo, objReader, toObjectErr(e, bucket, object) + return objInfo, nil, toObjectErr(e, bucket, object) } - objReader.pr = bytes.NewBuffer(nil) + objReader := NewGetObjectReader(bytes.NewReader(nil), lock, nil) return objInfo, objReader, nil } objInfo, err = xl.getObjectInfo(ctx, bucket, object) if err != nil { - return objInfo, objReader, toObjectErr(err, bucket, object) + return objInfo, nil, toObjectErr(err, bucket, object) } startOffset, readLength := int64(0), objInfo.Size @@ -201,10 +198,14 @@ func (xl xlObjects) GetObjectNInfo(ctx context.Context, bucket, object string, r } pr, pw := io.Pipe() - objReader.pr = pr + objReader := NewGetObjectReader(pr, lock, nil) go func() { err := xl.getObject(ctx, bucket, object, startOffset, readLength, pw, "") - pw.CloseWithError(err) + if err != nil { + pw.CloseWithError(err) + return + } + pw.Close() }() return objInfo, objReader, nil