From kde-commits Sat Jun 27 17:38:09 2009 From: Bertjan Broeksema Date: Sat, 27 Jun 2009 17:38:09 +0000 To: kde-commits Subject: KDE/kdepim/akonadi/resources/mbox/libmbox Message-Id: <1246124289.808677.1603.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=124615167003139 SVN commit 988290 by bbroeksema: - Fix off-by-one - make sure that entries are only moved when an entry before is moved. M +8 -8 mbox.cpp --- trunk/KDE/kdepim/akonadi/resources/mbox/libmbox/mbox.cpp #988289:988290 @@ -358,6 +358,7 @@ quint64 origFileSize = d->mMboxFile.size(); + qDebug() << "ENTRIES:" << d->mEntries; QListIterator i( d->mEntries ); while ( i.hasNext() ) { MsgInfo entry = i.next(); @@ -365,15 +366,17 @@ if ( deletedItems.contains( entry.first ) && !writeOffSetInitialized ) { writeOffset = entry.first; writeOffSetInitialized = true; - } else if ( writeOffset < entry.first && !deletedItems.contains( entry.first ) ) { + } else if ( writeOffSetInitialized + && writeOffset < entry.first + && !deletedItems.contains( entry.first ) ) { // The current message doesn't have to be deleted, but must be moved. // First determine the size of the entry that must be moved. quint64 entrySize = 0; if ( i.hasNext() ) { - entrySize = i.next().first - entry.first - 1; + entrySize = i.next().first - entry.first; i.previous(); // Go back to make sure that we also handle the next entry. } else { - entrySize = origFileSize - entry.first - 1; + entrySize = origFileSize - entry.first; } Q_ASSERT( entrySize > 0 ); // MBox entries really cannot have a size <= 0; @@ -389,15 +392,12 @@ // Now read the entry that must be moved to writeOffset. quint64 startOffset = entry.first - writeOffset; - char *start = reinterpret_cast( memArea + startOffset ); - QByteArray entryToWriteData( start, entrySize ); + memmove( memArea, memArea + startOffset, entrySize ); - memcpy( memArea, entryToWriteData.constData(), entrySize ); - d->mMboxFile.unmap( memArea ); resultingEntryList << MsgInfo( writeOffset, entry.second ); - writeOffset += entrySize + 1; + writeOffset += entrySize; } else if ( !deletedItems.contains( entry.first ) ) { // Unmoved and not deleted entry, can only occure before the first deleted // entry.