# HG changeset patch
# User R Kent James <rkent@caspia.com>
# Date 1461194554 25200
#      Wed Apr 20 16:22:34 2016 -0700
# Branch THUNDERBIRD3880_2016050308_RELBRANCH
# Node ID 2506d7a34aba0d5ce7b8e9a1a0a4ad12ee7bf8c0
# Parent  52b3cf378da6c37cc1829b17a6e221f3e8eeeb70
Bug 617946 - crash in nsImapMailFolder::GetDatabase() with null database, r=aceman, a=rkent

diff --git a/mailnews/db/msgdb/src/nsMsgDatabase.cpp b/mailnews/db/msgdb/src/nsMsgDatabase.cpp
--- a/mailnews/db/msgdb/src/nsMsgDatabase.cpp
+++ b/mailnews/db/msgdb/src/nsMsgDatabase.cpp
@@ -385,17 +385,25 @@
   
   nsCOMPtr <nsIMsgDatabase> msgDB = do_CreateInstance(dbContractID.get(), &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsMsgDatabase *msgDatabase = static_cast<nsMsgDatabase *>(msgDB.get());
 
   msgDatabase->m_folder = aFolder;
   rv = msgDatabase->Open(this, summaryFilePath, true, true);
-  NS_ENSURE_TRUE(rv == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING, rv);
+
+  // We are trying to create a new database, but that implies that it did not
+  // already exist. Open returns NS_MSG_ERROR_FOLDER_SUMMARY_MISSING for the
+  // successful creation of a new database. But if it existed for some
+  // reason, then we would get rv = NS_OK instead. That is a "failure"
+  // from our perspective, so we want to return a failure since we are not
+  // returning a valid database object.
+  NS_ENSURE_TRUE(rv == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING,
+                 NS_SUCCEEDED(rv) ? NS_ERROR_FILE_ALREADY_EXISTS : rv);
 
   NS_ADDREF(*_retval = msgDB);
 
   HookupPendingListeners(msgDB, aFolder);
 
   msgDatabase->RememberLastUseTime();
 
   return NS_OK;
