From 124c87bfad3c10265307d3155d7441648224d031 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 15 Jul 2012 19:16:29 -0500 Subject: [PATCH] Add write buffer to krb client and server sockets --- lib/libtdekrb/src/tdekrbclientsocket.cpp | 44 ++++++++++++++++++--- lib/libtdekrb/src/tdekrbclientsocket.h | 5 ++- lib/libtdekrb/src/tdekrbserversocket.cpp | 48 +++++++++++++++++++---- lib/libtdekrb/src/tdekrbserversocket.h | 5 ++- servers/auth_server_lin/src/auth_conn.cpp | 2 + servers/fpga_server_lin/src/fpga_conn.cpp | 1 + 6 files changed, 89 insertions(+), 16 deletions(-) diff --git a/lib/libtdekrb/src/tdekrbclientsocket.cpp b/lib/libtdekrb/src/tdekrbclientsocket.cpp index 33466cf..2ada832 100644 --- a/lib/libtdekrb/src/tdekrbclientsocket.cpp +++ b/lib/libtdekrb/src/tdekrbclientsocket.cpp @@ -99,11 +99,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority, return SASL_OK; } -TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) { +TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_writeBufferLength(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) { saslData = new SASLDataPrivate; saslData->m_krbConnection = NULL; m_readBuffer = new TQBuffer(); m_readBuffer->open(IO_ReadWrite|IO_Truncate); + m_writeBuffer = new TQBuffer(); + m_writeBuffer->open(IO_ReadWrite|IO_Truncate); } TDEKerberosClientSocket::~TDEKerberosClientSocket() { @@ -116,7 +118,9 @@ TDEKerberosClientSocket::~TDEKerberosClientSocket() { kerberosInitLoopTimer = NULL; } setUsingKerberos(false); + m_writeBuffer->close(); m_readBuffer->close(); + delete m_writeBuffer; delete m_readBuffer; delete saslData; } @@ -139,10 +143,11 @@ void TDEKerberosClientSocket::close() { setStatusMessage(i18n("Disconnected")); } -void TDEKerberosClientSocket::flush() { +void TDEKerberosClientSocket::flush(int hidebasehack) { + Q_UNUSED(hidebasehack); + if (kerberosStatus() == KerberosInUse) { - // FIXME - // If a write buffer is implemented, it will need to be flushed before the following call is made + writeBufferedData(); TQSocket::flush(); } else { @@ -389,7 +394,13 @@ TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) { TQ_LONG ret; if (kerberosStatus() == KerberosInUse) { - ret = transmitEncryptedData(data, len); + int wrlen; + m_writeBuffer->at(m_writeBufferLength); + wrlen = m_writeBuffer->writeBlock(data, len); + if (wrlen > 0) { + m_writeBufferLength = m_writeBufferLength + wrlen; + } + ret = wrlen; } else { ret = TQSocket::writeBlock(data, len); @@ -398,6 +409,20 @@ TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) { return ret; } +void TDEKerberosClientSocket::writeBufferedData() { + if (kerberosStatus() == KerberosInUse) { + if (m_writeBufferLength > 0) { + if (transmitEncryptedData(m_writeBuffer->buffer().data(), m_writeBufferLength) < 0) { + printf("[WARNING] Attempt to transmit buffered data resulted in a short write\n\r"); fflush(stdout); + } + // Clear the buffer from memory + m_writeBuffer->close(); + m_writeBuffer->open(IO_ReadWrite|IO_Truncate); + m_writeBufferLength = 0; + } + } +} + TQ_LONG TDEKerberosClientSocket::readLine(char *data, TQ_ULONG maxlen) { TQ_LONG ret; @@ -709,9 +734,12 @@ void TDEKerberosClientSocket::clearIncomingData() { } int TDEKerberosClientSocket::writeEndOfFrame() { + int ret; char data[1]; data[0] = 255; - return writeBlock(data, 1); + ret = writeBlock(data, 1); + writeBufferedData(); + return ret; } bool TDEKerberosClientSocket::canReadFrame() { @@ -955,7 +983,11 @@ int TDEKerberosClientSocket::initializeKerberosInterface() { // Clear the buffer from memory m_readBuffer->close(); m_readBuffer->open(IO_ReadWrite|IO_Truncate); + m_readBufferLength = 0; m_readBufferReadPointer = 0; + m_writeBuffer->close(); + m_writeBuffer->open(IO_ReadWrite|IO_Truncate); + m_writeBufferLength = 0; // Initialize default data structures memset(&secprops, 0L, sizeof(secprops)); diff --git a/lib/libtdekrb/src/tdekrbclientsocket.h b/lib/libtdekrb/src/tdekrbclientsocket.h index 0722d88..85b6688 100644 --- a/lib/libtdekrb/src/tdekrbclientsocket.h +++ b/lib/libtdekrb/src/tdekrbclientsocket.h @@ -46,7 +46,7 @@ class TDEKerberosClientSocket : public TQSocket bool open(int mode); void close(); - void flush(); + void flush(int hidebasehack=0); Offset size() const; Offset at() const; bool at(Offset off, int hidebasehack=0); @@ -76,6 +76,7 @@ class TDEKerberosClientSocket : public TQSocket int writeEndOfFrame(); bool canReadFrame(); void clearFrameTail(); + void writeBufferedData(); public slots: int processPendingData(); @@ -104,6 +105,8 @@ class TDEKerberosClientSocket : public TQSocket TQBuffer* m_readBuffer; long m_readBufferLength; long m_readBufferReadPointer; + TQBuffer* m_writeBuffer; + long m_writeBufferLength; bool m_krbInitRunning; int m_krbInitState; TQString m_prevStatusMessage; diff --git a/lib/libtdekrb/src/tdekrbserversocket.cpp b/lib/libtdekrb/src/tdekrbserversocket.cpp index 63a8597..c309da5 100644 --- a/lib/libtdekrb/src/tdekrbserversocket.cpp +++ b/lib/libtdekrb/src/tdekrbserversocket.cpp @@ -100,11 +100,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority, return SASL_OK; } -TDEKerberosServerSocket::TDEKerberosServerSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) { +TDEKerberosServerSocket::TDEKerberosServerSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_writeBufferLength(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) { saslData = new SASLDataPrivate; saslData->m_krbConnection = NULL; m_readBuffer = new TQBuffer(); m_readBuffer->open(IO_ReadWrite|IO_Truncate); + m_writeBuffer = new TQBuffer(); + m_writeBuffer->open(IO_ReadWrite|IO_Truncate); } TDEKerberosServerSocket::~TDEKerberosServerSocket() { @@ -117,7 +119,9 @@ TDEKerberosServerSocket::~TDEKerberosServerSocket() { kerberosInitLoopTimer = NULL; } setUsingKerberos(false); + m_writeBuffer->close(); m_readBuffer->close(); + delete m_writeBuffer; delete m_readBuffer; delete saslData; } @@ -140,10 +144,11 @@ void TDEKerberosServerSocket::close() { setStatusMessage(i18n("Socket closed")); } -void TDEKerberosServerSocket::flush() { - if (m_kerberosRequested) { - // FIXME - // If a write buffer is implemented, it will need to be flushed before the following call is made +void TDEKerberosServerSocket::flush(int hidebasehack) { + Q_UNUSED(hidebasehack); + + if (kerberosStatus() == KerberosInUse) { + writeBufferedData(); TQSocket::flush(); } else { @@ -397,8 +402,14 @@ TQ_LONG TDEKerberosServerSocket::readBlock(char *data, TQ_ULONG maxlen) { TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) { TQ_LONG ret; - if (m_kerberosRequested) { - ret = transmitEncryptedData(data, len); + if (kerberosStatus() == KerberosInUse) { + int wrlen; + m_writeBuffer->at(m_writeBufferLength); + wrlen = m_writeBuffer->writeBlock(data, len); + if (wrlen > 0) { + m_writeBufferLength = m_writeBufferLength + wrlen; + } + ret = wrlen; } else { ret = TQSocket::writeBlock(data, len); @@ -407,6 +418,20 @@ TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) { return ret; } +void TDEKerberosServerSocket::writeBufferedData() { + if (kerberosStatus() == KerberosInUse) { + if (m_writeBufferLength > 0) { + if (transmitEncryptedData(m_writeBuffer->buffer().data(), m_writeBufferLength) < 0) { + printf("[WARNING] Attempt to transmit buffered data resulted in a short write\n\r"); fflush(stdout); + } + // Clear the buffer from memory + m_writeBuffer->close(); + m_writeBuffer->open(IO_ReadWrite|IO_Truncate); + m_writeBufferLength = 0; + } + } +} + TQ_LONG TDEKerberosServerSocket::readLine(char *data, TQ_ULONG maxlen) { TQ_LONG ret; @@ -718,9 +743,12 @@ void TDEKerberosServerSocket::clearIncomingData() { } int TDEKerberosServerSocket::writeEndOfFrame() { + int ret; char data[1]; data[0] = 255; - return writeBlock(data, 1); + ret = writeBlock(data, 1); + writeBufferedData(); + return ret; } bool TDEKerberosServerSocket::canReadFrame() { @@ -976,7 +1004,11 @@ int TDEKerberosServerSocket::initializeKerberosInterface() { // Clear the buffer from memory m_readBuffer->close(); m_readBuffer->open(IO_ReadWrite|IO_Truncate); + m_readBufferLength = 0; m_readBufferReadPointer = 0; + m_writeBuffer->close(); + m_writeBuffer->open(IO_ReadWrite|IO_Truncate); + m_writeBufferLength = 0; // Initialize default data structures memset(&secprops, 0L, sizeof(secprops)); diff --git a/lib/libtdekrb/src/tdekrbserversocket.h b/lib/libtdekrb/src/tdekrbserversocket.h index 92fe473..f501f09 100644 --- a/lib/libtdekrb/src/tdekrbserversocket.h +++ b/lib/libtdekrb/src/tdekrbserversocket.h @@ -46,7 +46,7 @@ class TDEKerberosServerSocket : public TQSocket bool open(int mode); void close(); - void flush(); + void flush(int hidebasehack=0); Offset size() const; Offset at() const; bool at(Offset off, int hidebasehack=0); @@ -76,6 +76,7 @@ class TDEKerberosServerSocket : public TQSocket int writeEndOfFrame(); bool canReadFrame(); void clearFrameTail(); + void writeBufferedData(); public slots: int processPendingData(); @@ -108,6 +109,8 @@ class TDEKerberosServerSocket : public TQSocket TQBuffer* m_readBuffer; long m_readBufferLength; long m_readBufferReadPointer; + TQBuffer* m_writeBuffer; + long m_writeBufferLength; bool m_krbInitRunning; int m_krbInitState; TQString m_prevStatusMessage; diff --git a/servers/auth_server_lin/src/auth_conn.cpp b/servers/auth_server_lin/src/auth_conn.cpp index f2549d3..c9a377f 100644 --- a/servers/auth_server_lin/src/auth_conn.cpp +++ b/servers/auth_server_lin/src/auth_conn.cpp @@ -280,11 +280,13 @@ int AuthSocket::servLoop() { if (canReadData()) { reclen = readBlock(m_loopBuffer.data(), m_loopBuffer.size()); m_servClientSocket->writeBlock(m_loopBuffer.data(), reclen); + m_servClientSocket->flush(); transferred_data = true; } if (m_servClientSocket->canReadData()) { reclen = m_servClientSocket->readBlock(m_loopBuffer.data(), m_loopBuffer.size()); writeBlock(m_loopBuffer.data(), reclen); + flush(); transferred_data = true; } } diff --git a/servers/fpga_server_lin/src/fpga_conn.cpp b/servers/fpga_server_lin/src/fpga_conn.cpp index fd1bdfa..2fc2537 100644 --- a/servers/fpga_server_lin/src/fpga_conn.cpp +++ b/servers/fpga_server_lin/src/fpga_conn.cpp @@ -205,6 +205,7 @@ void FPGASocket::commandLoop() { cc = read(m_fd_tty, buffer, 10000); if (cc > 0) { writeBlock(buffer, cc); + flush(); transferred_data = true; printf("[DEBUG] Got %d bytes from the serial port\n\r", cc); fflush(stdout); }