summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libtdekrb/src/tdekrbclientsocket.cpp60
-rw-r--r--lib/libtdekrb/src/tdekrbserversocket.cpp60
2 files changed, 84 insertions, 36 deletions
diff --git a/lib/libtdekrb/src/tdekrbclientsocket.cpp b/lib/libtdekrb/src/tdekrbclientsocket.cpp
index 546c7f2..647da73 100644
--- a/lib/libtdekrb/src/tdekrbclientsocket.cpp
+++ b/lib/libtdekrb/src/tdekrbclientsocket.cpp
@@ -221,10 +221,12 @@ TQ_LONG TDEKerberosClientSocket::readBlock(char *data, TQ_ULONG maxlen) {
int wrlen;
char* buf = (char*)malloc(m_negotiatedMaxBufferSize);
reclen = receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
- m_buffer->at(m_bufferLength);
- wrlen = m_buffer->writeBlock(buf, reclen);
- if (wrlen > 0) {
- m_bufferLength = m_bufferLength + wrlen;
+ if (reclen > 0) {
+ m_buffer->at(m_bufferLength);
+ wrlen = m_buffer->writeBlock(buf, reclen);
+ if (wrlen > 0) {
+ m_bufferLength = m_bufferLength + wrlen;
+ }
}
free(buf);
@@ -273,10 +275,12 @@ TQ_LONG TDEKerberosClientSocket::readLine(char *data, TQ_ULONG maxlen) {
int wrlen;
char* buf = (char*)malloc(m_negotiatedMaxBufferSize);
reclen = receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
- m_buffer->at(m_bufferLength);
- wrlen = m_buffer->writeBlock(buf, reclen);
- if (wrlen > 0) {
- m_bufferLength = m_bufferLength + wrlen;
+ if (reclen > 0) {
+ m_buffer->at(m_bufferLength);
+ wrlen = m_buffer->writeBlock(buf, reclen);
+ if (wrlen > 0) {
+ m_bufferLength = m_bufferLength + wrlen;
+ }
}
free(buf);
@@ -313,10 +317,12 @@ TQString TDEKerberosClientSocket::readLine() {
int readlen;
char* buf = (char*)malloc(m_negotiatedMaxBufferSize);
reclen = receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
- m_buffer->at(m_bufferLength);
- wrlen = m_buffer->writeBlock(buf, reclen);
- if (wrlen > 0) {
- m_bufferLength = m_bufferLength + wrlen;
+ if (reclen > 0) {
+ m_buffer->at(m_bufferLength);
+ wrlen = m_buffer->writeBlock(buf, reclen);
+ if (wrlen > 0) {
+ m_bufferLength = m_bufferLength + wrlen;
+ }
}
free(buf);
@@ -447,13 +453,31 @@ int TDEKerberosClientSocket::transmitEncryptedData(int fd, const char* readbuf,
int result = 0;
unsigned int len;
const char *data;
-
- result=sasl_encode(saslData->m_krbConnection, readbuf, cc, &data, &len);
- if (result != SASL_OK) {
- printf("[ERROR] Encrypting data returned %s (%d)\n\r", safe_sasl_errdetail(saslData->m_krbConnection), result);
- return -1;
+ long data_remaining;
+ long remnant_position;
+
+ data_remaining = cc;
+ remnant_position = 0;
+ while (data_remaining > 0) {
+ int data_to_write_len;
+ if (data_remaining > (m_negotiatedMaxBufferSize/2)) {
+ data_to_write_len = m_negotiatedMaxBufferSize/2;
+ }
+ else {
+ data_to_write_len = data_remaining;
+ }
+ result=sasl_encode(saslData->m_krbConnection, readbuf+remnant_position, data_to_write_len, &data, &len);
+ if (result != SASL_OK) {
+ printf("[ERROR] Encrypting data returned %s (%d)\n\r", safe_sasl_errdetail(saslData->m_krbConnection), result);
+ return -1;
+ }
+ sendSASLDataToNetwork(data, len, fd);
+ data_remaining = data_remaining - data_to_write_len;
+ remnant_position = remnant_position + data_to_write_len;
+ if (data_remaining > 0) {
+ tqApp->processEvents();
+ }
}
- sendSASLDataToNetwork(data, len, fd);
return 0;
}
diff --git a/lib/libtdekrb/src/tdekrbserversocket.cpp b/lib/libtdekrb/src/tdekrbserversocket.cpp
index b415b2e..2b4d7d2 100644
--- a/lib/libtdekrb/src/tdekrbserversocket.cpp
+++ b/lib/libtdekrb/src/tdekrbserversocket.cpp
@@ -221,10 +221,12 @@ TQ_LONG TDEKerberosServerSocket::readBlock(char *data, TQ_ULONG maxlen) {
int wrlen;
char* buf = (char*)malloc(m_negotiatedMaxBufferSize);
reclen = receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
- m_buffer->at(m_bufferLength);
- wrlen = m_buffer->writeBlock(buf, reclen);
- if (wrlen > 0) {
- m_bufferLength = m_bufferLength + wrlen;
+ if (reclen > 0) {
+ m_buffer->at(m_bufferLength);
+ wrlen = m_buffer->writeBlock(buf, reclen);
+ if (wrlen > 0) {
+ m_bufferLength = m_bufferLength + wrlen;
+ }
}
free(buf);
@@ -273,10 +275,12 @@ TQ_LONG TDEKerberosServerSocket::readLine(char *data, TQ_ULONG maxlen) {
int wrlen;
char* buf = (char*)malloc(m_negotiatedMaxBufferSize);
reclen = receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
- m_buffer->at(m_bufferLength);
- wrlen = m_buffer->writeBlock(buf, reclen);
- if (wrlen > 0) {
- m_bufferLength = m_bufferLength + wrlen;
+ if (reclen > 0) {
+ m_buffer->at(m_bufferLength);
+ wrlen = m_buffer->writeBlock(buf, reclen);
+ if (wrlen > 0) {
+ m_bufferLength = m_bufferLength + wrlen;
+ }
}
free(buf);
@@ -313,10 +317,12 @@ TQString TDEKerberosServerSocket::readLine() {
int readlen;
char* buf = (char*)malloc(m_negotiatedMaxBufferSize);
reclen = receiveEncryptedData(buf, m_negotiatedMaxBufferSize);
- m_buffer->at(m_bufferLength);
- wrlen = m_buffer->writeBlock(buf, reclen);
- if (wrlen > 0) {
- m_bufferLength = m_bufferLength + wrlen;
+ if (reclen > 0) {
+ m_buffer->at(m_bufferLength);
+ wrlen = m_buffer->writeBlock(buf, reclen);
+ if (wrlen > 0) {
+ m_bufferLength = m_bufferLength + wrlen;
+ }
}
free(buf);
@@ -447,13 +453,31 @@ int TDEKerberosServerSocket::transmitEncryptedData(int fd, const char* readbuf,
int result = 0;
unsigned int len;
const char *data;
-
- result=sasl_encode(saslData->m_krbConnection, readbuf, cc, &data, &len);
- if (result != SASL_OK) {
- printf("[ERROR] Encrypting data returned %s (%d)\n\r", safe_sasl_errdetail(saslData->m_krbConnection), result);
- return -1;
+ long data_remaining;
+ long remnant_position;
+
+ data_remaining = cc;
+ remnant_position = 0;
+ while (data_remaining > 0) {
+ int data_to_write_len;
+ if (data_remaining > (m_negotiatedMaxBufferSize/2)) {
+ data_to_write_len = m_negotiatedMaxBufferSize/2;
+ }
+ else {
+ data_to_write_len = data_remaining;
+ }
+ result=sasl_encode(saslData->m_krbConnection, readbuf+remnant_position, data_to_write_len, &data, &len);
+ if (result != SASL_OK) {
+ printf("[ERROR] Encrypting data returned %s (%d)\n\r", safe_sasl_errdetail(saslData->m_krbConnection), result);
+ return -1;
+ }
+ sendSASLDataToNetwork(data, len, fd);
+ data_remaining = data_remaining - data_to_write_len;
+ remnant_position = remnant_position + data_to_write_len;
+ if (data_remaining > 0) {
+ tqApp->processEvents();
+ }
}
- sendSASLDataToNetwork(data, len, fd);
return 0;
}