CVSROOT:        /cvs/cluster
Module name:    conga
Branch:         RHEL4
Changes by:     [EMAIL PROTECTED]       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;
+                                       }
                                }
                        }
                }

Reply via email to