[Cluster-devel] conga/luci/conga_ssl SSLClient.cpp SSLClient.h ...
rmccabe at sourceware.org
rmccabe at sourceware.org
Wed Sep 12 19:37:55 UTC 2007
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) == "<?xml " && xml_in.substr(start - sizeof("/>"), sizeof("/>") - 1) == "/>") ||
- xml_in.substr(start - sizeof("</ricci>"), sizeof("</ricci>") - 1) == "</ricci>")
- {
- 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;
+ }
}
}
}
More information about the Cluster-devel
mailing list