diff --git a/mozilla/mailnews/imap/src/nsImapUndoTxn.cpp b/mozilla/mailnews/imap/src/nsImapUndoTxn.cpp index 642b71dc203..a50a117c014 100644 --- a/mozilla/mailnews/imap/src/nsImapUndoTxn.cpp +++ b/mozilla/mailnews/imap/src/nsImapUndoTxn.cpp @@ -189,6 +189,12 @@ nsImapMoveCopyMsgTxn::UndoTransaction(void) nsMsgImapDeleteModel deleteModel; rv = GetImapDeleteModel(srcFolder, &deleteModel); + // protect against a bogus undo txn without any source keys + // see bug #179856 for details + NS_ASSERTION(m_srcKeyArray.GetSize(), "no source keys"); + if (!m_srcKeyArray.GetSize()) + return NS_ERROR_UNEXPECTED; + if (NS_SUCCEEDED(rv) && deleteModel == nsMsgImapDeleteModels::IMAPDelete) CheckForToggleDelete(srcFolder, m_srcKeyArray.GetAt(0), &deletedMsgs); @@ -263,6 +269,13 @@ nsImapMoveCopyMsgTxn::RedoTransaction(void) PRBool deletedMsgs = PR_FALSE; //default will be false unless imapDeleteModel; nsMsgImapDeleteModel deleteModel; rv = GetImapDeleteModel(srcFolder, &deleteModel); + + // protect against a bogus undo txn without any source keys + // see bug #179856 for details + NS_ASSERTION(m_srcKeyArray.GetSize(), "no source keys"); + if (!m_srcKeyArray.GetSize()) + return NS_ERROR_UNEXPECTED; + if (NS_SUCCEEDED(rv) && deleteModel == nsMsgImapDeleteModels::IMAPDelete) rv = CheckForToggleDelete(srcFolder, m_srcKeyArray.GetAt(0), &deletedMsgs); diff --git a/mozilla/mailnews/local/src/nsLocalMailFolder.cpp b/mozilla/mailnews/local/src/nsLocalMailFolder.cpp index 1f7928d259e..5899b612eda 100644 --- a/mozilla/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mozilla/mailnews/local/src/nsLocalMailFolder.cpp @@ -2539,11 +2539,11 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndCopy(PRBool copySucceeded) NS_ENSURE_SUCCESS(rv,rv); } } - //Copy the header to the new database - if(copySucceeded && mCopyState->m_message) - { // CopyMessages() goes here; CopyFileMessage() never gets in here because + //Copy the header to the new database + if(copySucceeded && mCopyState->m_message) + { // CopyMessages() goes here; CopyFileMessage() never gets in here because // the mCopyState->m_message will be always null for file message - + nsCOMPtr newHdr; if(!mCopyState->m_parseMsgState) @@ -2551,36 +2551,38 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndCopy(PRBool copySucceeded) if(mDatabase) { rv = mDatabase->CopyHdrFromExistingHdr(mCopyState->m_curDstKey, - mCopyState->m_message, PR_TRUE, - getter_AddRefs(newHdr)); + mCopyState->m_message, PR_TRUE, + getter_AddRefs(newHdr)); PRUint32 newHdrFlags; - - // turn off offline flag - it's not valid for local mail folders. if (newHdr) newHdr->AndFlags(~MSG_FLAG_OFFLINE, &newHdrFlags); - - PRBool isImap; - if (NS_SUCCEEDED(rv) && localUndoTxn) - localUndoTxn->GetSrcIsImap(&isImap); - if (NS_SUCCEEDED(rv) && localUndoTxn && (!isImap || !mCopyState->m_copyingMultipleMessages)) - { - nsMsgKey aKey; - mCopyState->m_message->GetMessageKey(&aKey); - localUndoTxn->AddSrcKey(aKey); - localUndoTxn->AddDstKey(mCopyState->m_curDstKey); - } } else mCopyState->m_undoMsgTxn = nsnull; //null out the transaction because we can't undo w/o the msg db } + + // if we plan on allowing undo, (if we have a mCopyState->m_parseMsgState or not) + // we need to save the source and dest keys on the undo txn. + // see bug #179856 for details + PRBool isImap; + if (NS_SUCCEEDED(rv) && localUndoTxn) { + localUndoTxn->GetSrcIsImap(&isImap); + if (!isImap || !mCopyState->m_copyingMultipleMessages) + { + nsMsgKey aKey; + mCopyState->m_message->GetMessageKey(&aKey); + localUndoTxn->AddSrcKey(aKey); + localUndoTxn->AddDstKey(mCopyState->m_curDstKey); + } + } } if (mCopyState->m_dummyEnvelopeNeeded) { mCopyState->m_fileStream->seek(PR_SEEK_END, 0); *(mCopyState->m_fileStream) << MSG_LINEBREAK; if (mCopyState->m_parseMsgState) - mCopyState->m_parseMsgState->ParseAFolderLine(CRLF, MSG_LINEBREAK_LEN); + mCopyState->m_parseMsgState->ParseAFolderLine(CRLF, MSG_LINEBREAK_LEN); } // CopyFileMessage() and CopyMessages() from servers other than mailbox diff --git a/mozilla/mailnews/local/src/nsLocalUndoTxn.cpp b/mozilla/mailnews/local/src/nsLocalUndoTxn.cpp index 313ecb73100..786526b61aa 100644 --- a/mozilla/mailnews/local/src/nsLocalUndoTxn.cpp +++ b/mozilla/mailnews/local/src/nsLocalUndoTxn.cpp @@ -244,6 +244,12 @@ nsLocalMoveCopyMsgTxn::UndoTransaction() nsCOMPtr oldHdr; nsCOMPtr newHdr; + // protect against a bogus undo txn without any source keys + // see bug #179856 for details + NS_ASSERTION(count, "no source keys"); + if (!count) + return NS_ERROR_UNEXPECTED; + if (m_isMove) { if (m_srcIsImap4) @@ -349,6 +355,12 @@ nsLocalMoveCopyMsgTxn::RedoTransaction() { if (m_srcIsImap4) { + // protect against a bogus undo txn without any source keys + // see bug #179856 for details + NS_ASSERTION(m_srcKeyArray.GetSize(), "no source keys"); + if (!m_srcKeyArray.GetSize()) + return NS_ERROR_UNEXPECTED; + PRBool deleteFlag = PR_FALSE; //message is un-deleted- we are trying to redo CheckForToggleDelete(srcFolder, m_srcKeyArray.GetAt(0), &deleteFlag); // there could have been a toggle rv = UndoImapDeleteFlag(srcFolder, m_srcKeyArray, deleteFlag);