[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdepimlibs/KDE/4.7] kmime: a bunch of little things found by
From:       Allen Winter <winter () kde ! org>
Date:       2011-12-01 0:16:31
Message-ID: 20111201001631.72260A60A6 () git ! kde ! org
[Download RAW message or body]

Git commit 60e482be2e4defdc079a183d846eb82a6eaa3b49 by Allen Winter.
Committed on 01/12/2011 at 01:00.
Pushed by winterz into branch 'KDE/4.7'.

a bunch of little things found by valgrind to help prevent crashes:
- init memory
- check return codes
- check for negative length values passed to QByteArray::mid()

MERGE: 4.7
(cherry picked from commit c300ffa7d146197b06001793a56948d8369f5965)

M  +32   -14   kmime/kmime_util.cpp

http://commits.kde.org/kdepimlibs/60e482be2e4defdc079a183d846eb82a6eaa3b49

diff --git a/kmime/kmime_util.cpp b/kmime/kmime_util.cpp
index aee5223..64ae748 100644
--- a/kmime/kmime_util.cpp
+++ b/kmime/kmime_util.cpp
@@ -430,7 +430,7 @@ QByteArray encodeRFC2231String( const QString& str, const \
QByteArray& charset )  if ( str.isEmpty() )
     return QByteArray();
 
-  
+
   const QTextCodec *codec = KGlobal::charsets()->codecForName( QString::fromLatin1( \
charset ) );  QByteArray latin;
   if ( charset == "us-ascii" )
@@ -487,11 +487,11 @@ QString decodeRFC2231String( const QByteArray &str, QByteArray \
&usedCS, const QB  int p = str.indexOf('\'');
   if (p < 0) return KGlobal::charsets()->codecForName( QString::fromLatin1( \
defaultCS  ))->toUnicode( str );  
-  
+
   QByteArray charset = str.left(p);
 
   QByteArray st = str.mid( str.lastIndexOf('\'') + 1 );
-  
+
   char ch, ch2;
   p = 0;
   while (p < (int)st.length())
@@ -564,6 +564,10 @@ QByteArray multiPartBoundary()
 QByteArray unfoldHeader( const QByteArray &header )
 {
   QByteArray result;
+  if ( header.isEmpty() ) {
+    return result;
+  }
+
   int pos = 0, foldBegin = 0, foldMid = 0, foldEnd = 0;
   while ( ( foldMid = header.indexOf( '\n', pos ) ) >= 0 ) {
     foldBegin = foldEnd = foldMid;
@@ -598,7 +602,10 @@ QByteArray unfoldHeader( const QByteArray &header )
       result += ' ';
     pos = foldEnd;
   }
-  result += header.mid( pos, header.length() - pos );
+  const int len = header.length();
+  if ( len > pos ) {
+    result += header.mid( pos, len - pos );
+  }
   return result;
 }
 
@@ -687,6 +694,7 @@ int indexOfHeader( const QByteArray &src, const QByteArray &name, \
int &end, int  return begin;
 
   } else {
+    end = -1;
     dataBegin = -1;
     return -1; //header not found
   }
@@ -696,18 +704,23 @@ QByteArray extractHeader( const QByteArray &src, const \
QByteArray &name )  {
   int begin, end;
   bool folded;
-  indexOfHeader( src, name, end, begin, &folded );
+  QByteArray result;
+
+  if ( src.isEmpty() || indexOfHeader( src, name, end, begin, &folded ) < 0 ) {
+    return result;
+  }
 
   if ( begin >= 0 ) {
     if ( !folded ) {
-      return src.mid( begin, end - begin );
+      result = src.mid( begin, end - begin );
     } else {
-      QByteArray hdrValue = src.mid( begin, end - begin );
-      return unfoldHeader( hdrValue );
+      if ( end > begin ) {
+        QByteArray hdrValue = src.mid( begin, end - begin );
+        result = unfoldHeader( hdrValue );
+      }
     }
-  } else {
-    return QByteArray(); //header not found
   }
+  return result;
 }
 
 QList<QByteArray> extractHeaders( const QByteArray &src, const QByteArray &name )
@@ -717,7 +730,10 @@ QList<QByteArray> extractHeaders( const QByteArray &src, const \
QByteArray &name  QList<QByteArray> result;
   QByteArray copySrc( src );
 
-  indexOfHeader( copySrc, name, end, begin, &folded );
+  if ( indexOfHeader( copySrc, name, end, begin, &folded ) < 0 ) {
+    return result;
+  }
+
   while ( begin >= 0 ) {
     if ( !folded ) {
       result.append( copySrc.mid( begin, end - begin ) );
@@ -728,7 +744,9 @@ QList<QByteArray> extractHeaders( const QByteArray &src, const \
QByteArray &name  
     // get the next one, a tiny bit ugly, but we don't want the previous to be found \
again...  copySrc = copySrc.mid( end );
-    indexOfHeader( copySrc, name, end, begin, &folded );
+    if ( indexOfHeader( copySrc, name, end, begin, &folded ) < 0 ) {
+      break;
+    }
   }
 
   return result;
@@ -933,7 +951,7 @@ bool hasAttachment( Content* content )
         return true;
     }
   }
-  
+
   return false;
 }
 
@@ -965,7 +983,7 @@ bool isEncrypted( Message *message )
   const KMime::Headers::ContentType* const contentType = message->contentType();
   if ( contentType->isSubtype( "encrypted" ) ||
        contentType->isSubtype( "pgp-encrypted" ) ||
-       contentType->isSubtype( "pkcs7-mime" ) || 
+       contentType->isSubtype( "pkcs7-mime" ) ||
        message->mainBodyPart( "multipart/encrypted" ) ||
        message->mainBodyPart( "application/pgp-encrypted" ) ||
        message->mainBodyPart( "application/pkcs7-mime" ) ) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic