diff --git a/pkg/donut/bucket.go b/pkg/donut/bucket.go index ede103303..089503356 100644 --- a/pkg/donut/bucket.go +++ b/pkg/donut/bucket.go @@ -444,27 +444,29 @@ func (b bucket) writeObjectData(k, m uint8, writers []io.WriteCloser, objectData var length int inputData := make([]byte, chunkSize) length, e = objectData.Read(inputData) - encodedBlocks, err := encoder.Encode(inputData) - if err != nil { - return 0, 0, err.Trace() - } - if _, err := hashWriter.Write(inputData[0:length]); err != nil { - return 0, 0, probe.NewError(err) - } - for blockIndex, block := range encodedBlocks { - errCh := make(chan error, 1) - go func(writer io.Writer, reader io.Reader, errCh chan<- error) { - defer close(errCh) - _, err := io.Copy(writer, reader) - errCh <- err - }(writers[blockIndex], bytes.NewReader(block), errCh) - if err := <-errCh; err != nil { - // Returning error is fine here CleanupErrors() would cleanup writers + if length != 0 { + encodedBlocks, err := encoder.Encode(inputData[0:length]) + if err != nil { + return 0, 0, err.Trace() + } + if _, err := hashWriter.Write(inputData[0:length]); err != nil { return 0, 0, probe.NewError(err) } + for blockIndex, block := range encodedBlocks { + errCh := make(chan error, 1) + go func(writer io.Writer, reader io.Reader, errCh chan<- error) { + defer close(errCh) + _, err := io.Copy(writer, reader) + errCh <- err + }(writers[blockIndex], bytes.NewReader(block), errCh) + if err := <-errCh; err != nil { + // Returning error is fine here CleanupErrors() would cleanup writers + return 0, 0, probe.NewError(err) + } + } + totalLength += length + chunkCount = chunkCount + 1 } - totalLength += length - chunkCount = chunkCount + 1 } if e != io.EOF { return 0, 0, probe.NewError(e) diff --git a/server-api-signature.go b/server-api-signature.go index cd4a51f47..fbf294080 100644 --- a/server-api-signature.go +++ b/server-api-signature.go @@ -17,7 +17,6 @@ package main import ( - "bytes" "encoding/base64" "io" "io/ioutil" @@ -131,7 +130,7 @@ func initSignatureV4(req *http.Request) (*signv4.Signature, *probe.Error) { func extractHTTPFormValues(reader *multipart.Reader) (io.Reader, map[string]string, *probe.Error) { /// HTML Form values formValues := make(map[string]string) - filePart := new(bytes.Buffer) + var filePart io.Reader var err error for err == nil { var part *multipart.Part @@ -144,11 +143,7 @@ func extractHTTPFormValues(reader *multipart.Reader) (io.Reader, map[string]stri } formValues[part.FormName()] = string(buffer) } else { - // FIXME: this will hog memory - _, err := io.Copy(filePart, part) - if err != nil { - return nil, nil, probe.NewError(err) - } + filePart = part } } }