diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp index 3d1b496d2dbd672296b369aac4f3a393fa9c7439..2894ced603978f528dde39d0d102654d036f968e 100644 --- a/src/security/tls_session.cpp +++ b/src/security/tls_session.cpp @@ -422,7 +422,11 @@ TlsSession::send_(const uint8_t* tx_data, std::size_t tx_size) size_t total_written = 0; while (total_written < tx_size) { auto chunck_sz = std::min(max_tx_sz, tx_size - total_written); - auto nwritten = gnutls_record_send(session_, tx_data + total_written, chunck_sz); + ssize_t nwritten; + auto data_seq = tx_data + total_written; + do { + nwritten = gnutls_record_send(session_, data_seq, chunck_sz); + } while (nwritten == GNUTLS_E_INTERRUPTED or nwritten == GNUTLS_E_AGAIN); if (nwritten <= 0) { /* Normally we would have to retry record_send but our internal * state has not changed, so we have to ask for more data first. @@ -448,8 +452,9 @@ TlsSession::sendRaw(const void* buf, size_t size) // log only on success ++stTxRawPacketCnt_; stTxRawBytesCnt_ += size; + return ret; } - return ret; + return -1; } // Called by GNUTLS to send encrypted packet to low-level transport. @@ -462,7 +467,7 @@ TlsSession::sendRawVec(const giovec_t* iov, int iovcnt) const giovec_t& dat = iov[i]; ssize_t ret = sendRaw(dat.iov_base, dat.iov_len); if (ret < 0) - return ret; + return -1; sent += ret; } return sent;