File 3_5_BRANCH_647617.diff of Package kdepim3

------------------------------------------------------------------------
r647617 | kloecker | 2007-03-28 23:58:46 +0200 (Wed, 28 Mar 2007) | 1 line
Changed paths:
   M /branches/KDE/3.5/kdepim/kioslaves/imap4/mimeheader.cc

Fix infinite loop for parameter values of a certain length.
------------------------------------------------------------------------
Index: mimeheader.cc
===================================================================
--- kioslaves/imap4/mimeheader.cc	(revision 647616)
+++ kioslaves/imap4/mimeheader.cc	(revision 647617)
@@ -339,35 +339,47 @@ mimeHeader::setParameter (const QCString
     {
       val = rfcDecoder::encodeRFC2231String (aValue);
     }
+    //kdDebug(7116) << "mimeHeader::setParameter() - val = '" << val << "'" << endl;
     //see if it needs to be truncated
     vlen = val.length();
     llen = aLabel.length();
-    if (vlen + llen + 4 > 80 && llen < 80 - 8 )
+    if (vlen + llen + 4 > 80 && llen < 80 - 8 - 2 )
     {
-      int limit = 80 - 8 - (int)llen;
+      const int limit = 80 - 8 - 2 - (int)llen;
+      // the -2 is there to allow extending the length of a part of val
+      // by 1 or 2 in order to prevent an encoded character from being
+      // split in half
       int i = 0;
       QString shortValue;
       QCString shortLabel;
 
       while (!val.isEmpty ())
       {
-        //don't truncate the encoded chars
-        int offset = 0;
-        if (limit > int(vlen))
-          limit = vlen;
-        offset = val.findRev ('%', limit);
-        if (offset == limit - 1 || offset == limit - 2)
-        {
-//          cout << "offset " << offset << "-" << limit << "=" << limit-offset << endl;
-          offset = limit - offset;
+        int partLen; // the length of the next part of the value
+        if ( limit >= int(vlen) ) {
+          // the rest of the value fits completely into one continued header
+          partLen = vlen;
+        }
+        else {
+          partLen = limit;
+          // make sure that we don't split an encoded char in half
+          if ( val[partLen-1] == '%' ) {
+            partLen += 2;
+          }
+          else if ( partLen > 1 && val[partLen-2] == '%' ) {
+            partLen += 1;
+          }
+          // make sure partLen does not exceed vlen (could happen in case of
+          // an incomplete encoded char)
+          if ( partLen > int(vlen) ) {
+            partLen = vlen;
+          }
         }
-        else
-          offset = 0;
-        shortValue = val.left (limit - offset);
+        shortValue = val.left( partLen );
         shortLabel.setNum (i);
         shortLabel = aLabel + "*" + shortLabel;
-        val = val.right (vlen - limit + offset);
-        vlen = vlen - limit + offset;
+        val = val.right( vlen - partLen );
+        vlen = vlen - partLen;
         if (encoded)
         {
           if (i == 0)
openSUSE Build Service is sponsored by