From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 12 Sep 2007 19:37:55 -0000 Subject: [Cluster-devel] conga/luci/conga_ssl SSLClient.cpp SSLClient.h ... Message-ID: <20070912193755.1453.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Branch: RHEL4 Changes by: rmccabe at sourceware.org 2007-09-12 19:37:54 Modified files: luci/conga_ssl : SSLClient.cpp SSLClient.h conga_ssl_lib.cpp Log message: Fix a bug that could cause incomplete reads if the total length that ought to be read is > 4096 and the last two non-whitespace characters read are "/>" Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/SSLClient.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.2.2&r2=1.2.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/SSLClient.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2&r2=1.2.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/conga_ssl_lib.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.2.2&r2=1.2.2.3 --- conga/luci/conga_ssl/SSLClient.cpp 2007/08/09 21:28:50 1.2.2.2 +++ conga/luci/conga_ssl/SSLClient.cpp 2007/09/12 19:37:54 1.2.2.3 @@ -279,19 +279,20 @@ } String -SSLClient::recv(unsigned int timeout) +SSLClient::recv(unsigned int timeout, size_t& buflen) { if (!_connected) throw String("cannot receive, yet: SSL connection not connected"); char buff[4096]; + buflen = sizeof(buff); unsigned int beg = time_mil(); while (time_mil() < beg + timeout) { int ret = SSL_read(_ssl, buff, sizeof(buff)); if (ret > 0) { String data(buff, ret); - shred(buff, sizeof(buff)); + memset(buff, 0, sizeof(buff)); return data; } else { bool want_read, want_write; --- conga/luci/conga_ssl/SSLClient.h 2006/12/21 21:32:00 1.2 +++ conga/luci/conga_ssl/SSLClient.h 2007/09/12 19:37:54 1.2.2.1 @@ -48,7 +48,7 @@ bool connect(unsigned int timeout); String send(const String& msg, unsigned int timeout); - String recv(unsigned int timeout); + String recv(unsigned int timeout, size_t& buflen); bool peer_has_cert(); --- conga/luci/conga_ssl/conga_ssl_lib.cpp 2007/08/09 21:28:50 1.2.2.2 +++ conga/luci/conga_ssl/conga_ssl_lib.cpp 2007/09/12 19:37:54 1.2.2.3 @@ -239,25 +239,29 @@ int beg = int(time_sec()); String xml_in; while (true) { + size_t buflen; String ret; if (int(time_sec()) > beg + timeout) throw String("timeout"); else { - ret = iter->second->recv(400); + ret = iter->second->recv(400, buflen); if (ret == "") continue; xml_in += ret; } - int start = xml_in.length() - 1; - while (start > 0 && xml_in[start] == '\n' || xml_in[start] == '\r') - start--; - start += 2; - if ((ret.substr(0, 6) == ""), sizeof("/>") - 1) == "/>") || - xml_in.substr(start - sizeof(""), sizeof("") - 1) == "") - { - resp = xml_in; - break; + /* + ** If less characters than the size of the read buffer + ** were read, we may be done + */ + if (ret.size() < buflen) { + try { + resp = xml_in; + parseXML(xml_in); + break; + } catch (...) { + continue; + } } } }