[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdepim/akonadi/resources/mbox/libmbox
From: Bertjan Broeksema <b.broeksema () home ! nl>
Date: 2009-06-27 17:38:09
Message-ID: 1246124289.808677.1603.nullmailer () svn ! kde ! org
[Download RAW message or body]
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<MsgInfo> 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<char*>( 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.
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic