From b48b26b86975d2166a4da7fc41086facefb3c4f2 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 22 Jun 2012 15:02:32 -0500 Subject: Fix problems with Kerberos sockets --- lib/libtdekrb/src/tdekrbclientsocket.cpp | 27 ++++++++++++++++----------- lib/libtdekrb/src/tdekrbclientsocket.h | 6 +++--- lib/libtdekrb/src/tdekrbserversocket.cpp | 27 ++++++++++++++++----------- lib/libtdekrb/src/tdekrbserversocket.h | 6 +++--- lib/libtqtrla/src/Makefile.am | 12 ++++++------ 5 files changed, 44 insertions(+), 34 deletions(-) (limited to 'lib') diff --git a/lib/libtdekrb/src/tdekrbclientsocket.cpp b/lib/libtdekrb/src/tdekrbclientsocket.cpp index c9db10a..053dd23 100644 --- a/lib/libtdekrb/src/tdekrbclientsocket.cpp +++ b/lib/libtdekrb/src/tdekrbclientsocket.cpp @@ -115,8 +115,8 @@ void TDEKerberosClientSocket::setServerFQDN(TQString name) { m_serverFQDN = name; } -Q_LONG TDEKerberosClientSocket::readBlock(char *data, Q_ULONG maxlen) { - Q_LONG ret; +TQ_LONG TDEKerberosClientSocket::readBlock(char *data, TQ_ULONG maxlen) { + TQ_LONG ret; if (m_kerberosRequested) { ret = receiveEncryptedData(data, maxlen); @@ -128,8 +128,8 @@ Q_LONG TDEKerberosClientSocket::readBlock(char *data, Q_ULONG maxlen) { return ret; } -Q_LONG TDEKerberosClientSocket::writeBlock(const char *data, Q_ULONG len) { - Q_LONG ret; +TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) { + TQ_LONG ret; if (m_kerberosRequested) { ret = transmitEncryptedData(socket(), data, len); @@ -141,11 +141,11 @@ Q_LONG TDEKerberosClientSocket::writeBlock(const char *data, Q_ULONG len) { return ret; } -Q_LONG TDEKerberosClientSocket::readLine(char *data, Q_ULONG maxlen) { - Q_LONG ret; +TQ_LONG TDEKerberosClientSocket::readLine(char *data, TQ_ULONG maxlen) { + TQ_LONG ret; if (m_kerberosRequested) { - ret = getSASLDataFromNetwork(data, maxlen); + ret = receiveEncryptedData(data, maxlen); } else { ret = TQSocket::readLine(data, maxlen); @@ -236,7 +236,6 @@ unsigned int TDEKerberosClientSocket::getSASLDataFromNetwork(char *buf, int trun } if (len >= (ba.size()-1)) { ba.resize(ba.size()+2048); - break; } } @@ -272,16 +271,22 @@ int TDEKerberosClientSocket::receiveEncryptedData(char *buf, int trunclen) { int result; int len; - len = getSASLDataFromNetwork(buf, trunclen); + char *encbuf = (char*)malloc(m_negotiatedMaxBufferSize); + len = getSASLDataFromNetwork(encbuf, m_negotiatedMaxBufferSize); if (len >= 0) { - result=sasl_decode(saslData->m_krbConnection, buf, len, &recv_data, &recv_len); + result=sasl_decode(saslData->m_krbConnection, encbuf, len, &recv_data, &recv_len); if (result != SASL_OK) { + free(encbuf); printf("[ERROR] Decrypting data returned %s (%d)\n\r", sasl_errdetail(saslData->m_krbConnection), result); return -1; } - strncpy(buf, recv_data, trunclen); + if (recv_len > trunclen) { + recv_len = trunclen; + } + memcpy(buf, recv_data, recv_len); } + free(encbuf); return 0; } diff --git a/lib/libtdekrb/src/tdekrbclientsocket.h b/lib/libtdekrb/src/tdekrbclientsocket.h index b010bc5..1cea942 100644 --- a/lib/libtdekrb/src/tdekrbclientsocket.h +++ b/lib/libtdekrb/src/tdekrbclientsocket.h @@ -37,9 +37,9 @@ class TDEKerberosClientSocket : public TQSocket bool open(int mode); void close(); - Q_LONG readBlock(char *data, Q_ULONG maxlen); - Q_LONG writeBlock(const char *data, Q_ULONG len); - Q_LONG readLine(char *data, Q_ULONG maxlen); + TQ_LONG readBlock(char *data, TQ_ULONG maxlen); + TQ_LONG writeBlock(const char *data, TQ_ULONG len); + TQ_LONG readLine(char *data, TQ_ULONG maxlen); TQString readLine(); void writeLine(TQString); diff --git a/lib/libtdekrb/src/tdekrbserversocket.cpp b/lib/libtdekrb/src/tdekrbserversocket.cpp index 0704aeb..1d7cfbf 100644 --- a/lib/libtdekrb/src/tdekrbserversocket.cpp +++ b/lib/libtdekrb/src/tdekrbserversocket.cpp @@ -115,8 +115,8 @@ void TDEKerberosServerSocket::setServerFQDN(TQString name) { m_serverFQDN = name; } -Q_LONG TDEKerberosServerSocket::readBlock(char *data, Q_ULONG maxlen) { - Q_LONG ret; +TQ_LONG TDEKerberosServerSocket::readBlock(char *data, TQ_ULONG maxlen) { + TQ_LONG ret; if (m_kerberosRequested) { ret = receiveEncryptedData(data, maxlen); @@ -128,8 +128,8 @@ Q_LONG TDEKerberosServerSocket::readBlock(char *data, Q_ULONG maxlen) { return ret; } -Q_LONG TDEKerberosServerSocket::writeBlock(const char *data, Q_ULONG len) { - Q_LONG ret; +TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) { + TQ_LONG ret; if (m_kerberosRequested) { ret = transmitEncryptedData(socket(), data, len); @@ -141,11 +141,11 @@ Q_LONG TDEKerberosServerSocket::writeBlock(const char *data, Q_ULONG len) { return ret; } -Q_LONG TDEKerberosServerSocket::readLine(char *data, Q_ULONG maxlen) { - Q_LONG ret; +TQ_LONG TDEKerberosServerSocket::readLine(char *data, TQ_ULONG maxlen) { + TQ_LONG ret; if (m_kerberosRequested) { - ret = getSASLDataFromNetwork(data, maxlen); + ret = receiveEncryptedData(data, maxlen); } else { ret = TQSocket::readLine(data, maxlen); @@ -236,7 +236,6 @@ unsigned int TDEKerberosServerSocket::getSASLDataFromNetwork(char *buf, int trun } if (len >= (ba.size()-1)) { ba.resize(ba.size()+2048); - break; } } @@ -272,16 +271,22 @@ int TDEKerberosServerSocket::receiveEncryptedData(char *buf, int trunclen) { int result; int len; - len = getSASLDataFromNetwork(buf, trunclen); + char *encbuf = (char*)malloc(m_negotiatedMaxBufferSize); + len = getSASLDataFromNetwork(encbuf, m_negotiatedMaxBufferSize); if (len >= 0) { - result=sasl_decode(saslData->m_krbConnection, buf, len, &recv_data, &recv_len); + result=sasl_decode(saslData->m_krbConnection, encbuf, len, &recv_data, &recv_len); if (result != SASL_OK) { + free(encbuf); printf("[ERROR] Decrypting data returned %s (%d)\n\r", sasl_errdetail(saslData->m_krbConnection), result); return -1; } - strncpy(buf, recv_data, trunclen); + if (recv_len > trunclen) { + recv_len = trunclen; + } + memcpy(buf, recv_data, recv_len); } + free(encbuf); return 0; } diff --git a/lib/libtdekrb/src/tdekrbserversocket.h b/lib/libtdekrb/src/tdekrbserversocket.h index 16d6483..04f70b9 100644 --- a/lib/libtdekrb/src/tdekrbserversocket.h +++ b/lib/libtdekrb/src/tdekrbserversocket.h @@ -37,9 +37,9 @@ class TDEKerberosServerSocket : public TQSocket bool open(int mode); void close(); - Q_LONG readBlock(char *data, Q_ULONG maxlen); - Q_LONG writeBlock(const char *data, Q_ULONG len); - Q_LONG readLine(char *data, Q_ULONG maxlen); + TQ_LONG readBlock(char *data, TQ_ULONG maxlen); + TQ_LONG writeBlock(const char *data, TQ_ULONG len); + TQ_LONG readLine(char *data, TQ_ULONG maxlen); TQString readLine(); void writeLine(TQString); diff --git a/lib/libtqtrla/src/Makefile.am b/lib/libtqtrla/src/Makefile.am index b0b10cf..5c8888c 100644 --- a/lib/libtqtrla/src/Makefile.am +++ b/lib/libtqtrla/src/Makefile.am @@ -1,11 +1,11 @@ -INCLUDES = $(all_includes) -I/usr/include/sasl +INCLUDES = $(all_includes) METASOURCES = AUTO # Create a shared library file -lib_LTLIBRARIES = libtdekrbsocket.la +lib_LTLIBRARIES = libtqtrla.la -include_HEADERS = tdekrbclientsocket.h tdekrbserversocket.h +include_HEADERS = tqtrla.h -libtdekrbsocket_la_SOURCES = tdekrbclientsocket.cpp tdekrbserversocket.cpp -libtdekrbsocket_la_LIBADD = -lkio $(LIB_TDEUI) -lsasl2 -libtdekrbsocket_la_LDFLAGS = -avoid-version -module -no-undefined $(all_libraries) \ No newline at end of file +libtqtrla_la_SOURCES = tqtrla.cpp +libtqtrla_la_LIBADD = -lkio $(LIB_TDEUI) +libtqtrla_la_LDFLAGS = -avoid-version -module -no-undefined $(all_libraries) \ No newline at end of file -- cgit v1.2.3