浏览代码

Don't trust GNUTLS_E_AGAIN

Unfortunately this error can be given by GnuTLS even though the
underlying stream still has data available. So stop trusting this value
and keep track of the underlying stream explicitly.
tags/v1.12.90
Pierre Ossman 2 年前
父节点
当前提交
cee5a417c8
共有 2 个文件被更改,包括 17 次插入3 次删除
  1. 16
    3
      common/rdr/TLSInStream.cxx
  2. 1
    0
      common/rdr/TLSInStream.h

+ 16
- 3
common/rdr/TLSInStream.cxx 查看文件

@@ -39,11 +39,13 @@ ssize_t TLSInStream::pull(gnutls_transport_ptr_t str, void* data, size_t size)
TLSInStream* self= (TLSInStream*) str;
InStream *in = self->in;

self->streamEmpty = false;
delete self->saved_exception;
self->saved_exception = NULL;

try {
if (!in->hasData(1)) {
self->streamEmpty = true;
gnutls_transport_set_errno(self->session, EAGAIN);
return -1;
}
@@ -100,9 +102,20 @@ size_t TLSInStream::readTLS(U8* buf, size_t len)
{
int n;

n = gnutls_record_recv(session, (void *) buf, len);
if (n == GNUTLS_E_INTERRUPTED || n == GNUTLS_E_AGAIN)
return 0;
while (true) {
streamEmpty = false;
n = gnutls_record_recv(session, (void *) buf, len);
if (n == GNUTLS_E_INTERRUPTED || n == GNUTLS_E_AGAIN) {
// GnuTLS returns GNUTLS_E_AGAIN for a bunch of other scenarios
// other than the pull function returning EAGAIN, so we have to
// double check that the underlying stream really is empty
if (!streamEmpty)
continue;
else
return 0;
}
break;
};

if (n == GNUTLS_E_PULL_ERROR)
throw *saved_exception;

+ 1
- 0
common/rdr/TLSInStream.h 查看文件

@@ -40,6 +40,7 @@ namespace rdr {
gnutls_session_t session;
InStream* in;

bool streamEmpty;
Exception* saved_exception;
};
};

正在加载...
取消
保存