diff --git a/common/tls/apple_client_platform.go b/common/tls/apple_client_platform.go index 9e2b7b53..1eb0ccf6 100644 --- a/common/tls/apple_client_platform.go +++ b/common/tls/apple_client_platform.go @@ -520,10 +520,6 @@ func (w *appleTLSReadWaiter) WaitReadBuffer() (*buf.Buffer, error) { if c.readEOF { return nil, io.EOF } - maximumLen := readWaitFreeLen(w.options) - if maximumLen <= 0 { - return nil, io.ErrShortBuffer - } timeoutMs, err := c.prepareReadTimeout() if err != nil { return nil, err @@ -533,11 +529,18 @@ func (w *appleTLSReadWaiter) WaitReadBuffer() (*buf.Buffer, error) { return nil, err } defer c.releaseClient() + buffer := w.options.NewBuffer() + if buffer.IsFull() { + buffer.Release() + return nil, io.ErrShortBuffer + } + maximumLen := buffer.FreeLen() handle := cgo.NewHandle(w) defer handle.Delete() var errorPtr *C.char if !bool(C.box_apple_tls_client_read_async(client, C.size_t(maximumLen), C.uintptr_t(handle), &errorPtr)) { + buffer.Release() return nil, c.errorFromPointer(errorPtr) } @@ -553,22 +556,18 @@ func (w *appleTLSReadWaiter) WaitReadBuffer() (*buf.Buffer, error) { if result != nil { C.box_apple_tls_read_result_free(result) } + buffer.Release() c.markReadTimedOut() return nil, os.ErrDeadlineExceeded } } else { result = <-w.results } - return c.readWaitResultToBuffer(result, w.options) + return c.readWaitResultToBuffer(result, buffer, w.options) } -func (c *appleTLSConn) readWaitResultToBuffer(result *C.box_apple_tls_read_result_t, options N.ReadWaitOptions) (*buf.Buffer, error) { +func (c *appleTLSConn) readWaitResultToBuffer(result *C.box_apple_tls_read_result_t, buffer *buf.Buffer, options N.ReadWaitOptions) (*buf.Buffer, error) { defer C.box_apple_tls_read_result_free(result) - buffer := options.NewBuffer() - if buffer.IsFull() { - buffer.Release() - return nil, io.ErrShortBuffer - } startLen := buffer.Len() var eof C.bool var errorPtr *C.char @@ -593,16 +592,6 @@ func (c *appleTLSConn) readWaitResultToBuffer(result *C.box_apple_tls_read_resul return buffer, nil } -func readWaitFreeLen(options N.ReadWaitOptions) int { - if options.IncreaseBuffer { - return 65535 - options.FrontHeadroom - options.RearHeadroom - } - if options.MTU > 0 { - return options.MTU - } - return buf.BufferSize - options.FrontHeadroom - options.RearHeadroom -} - //export box_apple_tls_read_callback func box_apple_tls_read_callback(callbackHandle C.uintptr_t, result *C.box_apple_tls_read_result_t) { handle := cgo.Handle(callbackHandle)