aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@oath.com>2018-09-12 13:30:58 +0200
committerGitHub <noreply@github.com>2018-09-12 13:30:58 +0200
commitcd0598ab100b738cb7e7cb875ef7f00614a1cb0b (patch)
treeb362a3dedc084aa48d7733a851b43b4ea862a886 /vespalib
parent68b59b1f79fa8fa1f0d219f8773f3111ff926255 (diff)
parentcc85d0014b7860d03a088327eb3c408bc2884074 (diff)
Merge pull request #6903 from vespa-engine/havardpe/better-handling-of-framed-sockets-in-fnet
better handling of framed sockets in fnet
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp b/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp
index 435f16cc340..f8fa4ab2b53 100644
--- a/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp
+++ b/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp
@@ -34,7 +34,7 @@ CryptoCodecAdapter::hs_try_fill()
ssize_t
CryptoCodecAdapter::fill_input()
{
- if (_input.get().size < _codec->min_encode_buffer_size()) {
+ if (_input.obtain().size < _codec->min_encode_buffer_size()) {
auto dst = _input.reserve(_codec->min_encode_buffer_size());
ssize_t res = _socket.read(dst.data, dst.size);
if (res > 0) {
@@ -89,9 +89,9 @@ CryptoCodecAdapter::read(char *buf, size_t len)
if (fill_res <= 0) {
return fill_res;
}
- ssize_t res = drain(buf, len);
- if (res != 0) {
- return res;
+ auto drain_res = drain(buf, len);
+ if (drain_res != 0) {
+ return drain_res;
}
errno = EWOULDBLOCK;
return -1;
@@ -113,8 +113,14 @@ CryptoCodecAdapter::drain(char *buf, size_t len)
ssize_t
CryptoCodecAdapter::write(const char *buf, size_t len)
{
- if (flush_all() < 0) {
- return -1;
+ if (_output.obtain().size >= _codec->min_encode_buffer_size()) {
+ if (flush() < 0) {
+ return -1;
+ }
+ if (_output.obtain().size > 0) {
+ errno = EWOULDBLOCK;
+ return -1;
+ }
}
auto dst = _output.reserve(_codec->min_encode_buffer_size());
auto res = _codec->encode(buf, len, dst.data, dst.size);