From 23617c95e41dc21347d4957c29fe5989a36e2a85 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 3 Jan 2014 12:19:42 +0000 Subject: more correct way of writing signatures git-svn-id: http://svn.miranda-ng.org/main/trunk@7477 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Db3x_mmap/src/database.cpp | 2 +- plugins/Db3x_mmap/src/dbcontacts.cpp | 8 +-- plugins/Db3x_mmap/src/dbcrypt.cpp | 3 +- plugins/Db3x_mmap/src/dbheaders.cpp | 7 ++- plugins/Db3x_mmap/src/dbintf.cpp | 1 + plugins/Db3x_mmap/src/dbintf.h | 102 +++++++++++++++++--------------- plugins/Db3x_mmap/src/dbmodulechain.cpp | 6 +- plugins/Db3x_mmap/src/dbsettings.cpp | 4 +- plugins/Db3x_mmap/src/ui.cpp | 2 + 9 files changed, 73 insertions(+), 62 deletions(-) (limited to 'plugins') diff --git a/plugins/Db3x_mmap/src/database.cpp b/plugins/Db3x_mmap/src/database.cpp index 1df59e9575..68b60d01dd 100644 --- a/plugins/Db3x_mmap/src/database.cpp +++ b/plugins/Db3x_mmap/src/database.cpp @@ -60,7 +60,7 @@ DWORD CDb3Base::ReallocSpace(DWORD ofs, int oldSize, int newSize) if (ofs+oldSize == m_dbHeader.ofsFileEnd) { ofsNew = ofs; m_dbHeader.ofsFileEnd += newSize-oldSize; - DBWrite(0,&m_dbHeader,sizeof(m_dbHeader)); + DBWrite(0, &m_dbHeader, sizeof(m_dbHeader)); log3("adding newspace %d@%08x+%d", newSize, ofsNew, oldSize); } else { diff --git a/plugins/Db3x_mmap/src/dbcontacts.cpp b/plugins/Db3x_mmap/src/dbcontacts.cpp index ee65364bf0..d330631b3b 100644 --- a/plugins/Db3x_mmap/src/dbcontacts.cpp +++ b/plugins/Db3x_mmap/src/dbcontacts.cpp @@ -142,7 +142,7 @@ STDMETHODIMP_(LONG) CDb3Base::DeleteContact(HANDLE hContact) dbc = (DBContact*)DBRead(hContact, sizeof(DBContact), NULL); if (m_dbHeader.ofsFirstContact == (DWORD)hContact) { m_dbHeader.ofsFirstContact = dbc->ofsNext; - DBWrite(0,&m_dbHeader,sizeof(m_dbHeader)); + DBWrite(0, &m_dbHeader, sizeof(m_dbHeader)); } else { DWORD ofsNext = dbc->ofsNext; @@ -161,7 +161,7 @@ STDMETHODIMP_(LONG) CDb3Base::DeleteContact(HANDLE hContact) DeleteSpace((DWORD)hContact, sizeof(DBContact)); //decrement contact count m_dbHeader.contactCount--; - DBWrite(0,&m_dbHeader,sizeof(m_dbHeader)); + DBWrite(0, &m_dbHeader, sizeof(m_dbHeader)); DBFlush(0); return 0; } @@ -179,8 +179,8 @@ STDMETHODIMP_(HANDLE) CDb3Base::AddContact() dbc.ofsNext = m_dbHeader.ofsFirstContact; m_dbHeader.ofsFirstContact = ofsNew; m_dbHeader.contactCount++; - DBWrite(ofsNew,&dbc,sizeof(DBContact)); - DBWrite(0,&m_dbHeader,sizeof(m_dbHeader)); + DBWrite(ofsNew, &dbc, sizeof(DBContact)); + DBWrite(0, &m_dbHeader, sizeof(m_dbHeader)); DBFlush(0); } m_cache->AddContactToCache((HANDLE)ofsNew); diff --git a/plugins/Db3x_mmap/src/dbcrypt.cpp b/plugins/Db3x_mmap/src/dbcrypt.cpp index 7aa8a0c046..00cab246e8 100644 --- a/plugins/Db3x_mmap/src/dbcrypt.cpp +++ b/plugins/Db3x_mmap/src/dbcrypt.cpp @@ -184,8 +184,7 @@ LBL_SetNewKey: EnumModuleNames(sttModuleEnum, this); // upgrade signature - memcpy(&m_dbHeader.signature, &dbSignatureU, sizeof(dbSignatureU)); - DBWrite(0, &dbSignatureU, sizeof(dbSignatureU)); + WriteSignature(dbSignatureU); } if (m_dbHeader.version == DB_OLD_VERSION) { diff --git a/plugins/Db3x_mmap/src/dbheaders.cpp b/plugins/Db3x_mmap/src/dbheaders.cpp index 5d19daaf35..97e7b915fe 100644 --- a/plugins/Db3x_mmap/src/dbheaders.cpp +++ b/plugins/Db3x_mmap/src/dbheaders.cpp @@ -65,6 +65,11 @@ int CDb3Base::CheckDbHeaders() if (m_dbHeader.ofsUser == 0) return EGROKPRF_DAMAGED; - m_bEncrypted = 0 == memcmp(m_dbHeader.signature, &dbSignatureE, sizeof(m_dbHeader.signature)); return 0; } + +void CDb3Base::WriteSignature(DBSignature &sign) +{ + memcpy(&m_dbHeader.signature, &sign, sizeof(DBSignature)); + DBWrite(0, &sign, sizeof(DBSignature)); +} \ No newline at end of file diff --git a/plugins/Db3x_mmap/src/dbintf.cpp b/plugins/Db3x_mmap/src/dbintf.cpp index 0efc944518..9a1b7e9fba 100644 --- a/plugins/Db3x_mmap/src/dbintf.cpp +++ b/plugins/Db3x_mmap/src/dbintf.cpp @@ -126,6 +126,7 @@ int CDb3Base::Load(bool bSkipInit) if (InitModuleNames()) return 1; m_bReadOnly = false; + m_bEncrypted = 0 == memcmp(m_dbHeader.signature, &dbSignatureE, sizeof(m_dbHeader.signature)); hContactDeletedEvent = CreateHookableEvent(ME_DB_CONTACT_DELETED); hContactAddedEvent = CreateHookableEvent(ME_DB_CONTACT_ADDED); diff --git a/plugins/Db3x_mmap/src/dbintf.h b/plugins/Db3x_mmap/src/dbintf.h index b3eb943f0a..eb0b67535f 100644 --- a/plugins/Db3x_mmap/src/dbintf.h +++ b/plugins/Db3x_mmap/src/dbintf.h @@ -54,9 +54,10 @@ DBHeader #define DBVT_ENCRYPTED 250 -struct DBSignature { - char name[15]; - BYTE eof; +struct DBSignature +{ + char name[15]; + BYTE eof; }; struct ModuleName @@ -66,68 +67,69 @@ struct ModuleName }; #include -struct DBHeader { - BYTE signature[16]; // 'Miranda ICQ DB',0,26 - DWORD version; //as 4 bytes, ie 1.2.3.10 = 0x0102030a - //this version is 0x00000700 - DWORD ofsFileEnd; //offset of the end of the database - place to write - //new structures - DWORD slackSpace; //a counter of the number of bytes that have been - //wasted so far due to deleting structures and/or - //re-making them at the end. We should compact when - //this gets above a threshold - DWORD contactCount; //number of contacts in the chain,excluding the user - DWORD ofsFirstContact; //offset to first DBContact in the chain - DWORD ofsUser; //offset to DBContact representing the user - DWORD ofsFirstModuleName; //offset to first struct DBModuleName in the chain +struct DBHeader +{ + BYTE signature[16]; // 'Miranda ICQ DB',0,26 + DWORD version; //as 4 bytes, ie 1.2.3.10 = 0x0102030a + //this version is 0x00000700 + DWORD ofsFileEnd; //offset of the end of the database - place to write + //new structures + DWORD slackSpace; //a counter of the number of bytes that have been + //wasted so far due to deleting structures and/or + //re-making them at the end. We should compact when + //this gets above a threshold + DWORD contactCount; //number of contacts in the chain,excluding the user + DWORD ofsFirstContact; //offset to first DBContact in the chain + DWORD ofsUser; //offset to DBContact representing the user + DWORD ofsFirstModuleName; //offset to first struct DBModuleName in the chain }; #define DBCONTACT_SIGNATURE 0x43DECADEu struct DBContact { - DWORD signature; - DWORD ofsNext; //offset to the next contact in the chain. zero if - //this is the 'user' contact or the last contact - //in the chain - DWORD ofsFirstSettings; //offset to the first DBContactSettings in the - //chain for this contact. - DWORD eventCount; //number of events in the chain for this contact - DWORD ofsFirstEvent,ofsLastEvent; //offsets to the first and last DBEvent in - //the chain for this contact - DWORD ofsFirstUnreadEvent; //offset to the first (chronological) unread event - //in the chain, 0 if all are read - DWORD timestampFirstUnread; //timestamp of the event at ofsFirstUnreadEvent + DWORD signature; + DWORD ofsNext; //offset to the next contact in the chain. zero if + //this is the 'user' contact or the last contact + //in the chain + DWORD ofsFirstSettings; //offset to the first DBContactSettings in the + //chain for this contact. + DWORD eventCount; //number of events in the chain for this contact + DWORD ofsFirstEvent, ofsLastEvent; //offsets to the first and last DBEvent in + //the chain for this contact + DWORD ofsFirstUnreadEvent; //offset to the first (chronological) unread event + //in the chain, 0 if all are read + DWORD timestampFirstUnread; //timestamp of the event at ofsFirstUnreadEvent }; #define DBMODULENAME_SIGNATURE 0x4DDECADEu struct DBModuleName { - DWORD signature; - DWORD ofsNext; //offset to the next module name in the chain - BYTE cbName; //number of characters in this module name - char name[1]; //name, no nul terminator + DWORD signature; + DWORD ofsNext; //offset to the next module name in the chain + BYTE cbName; //number of characters in this module name + char name[1]; //name, no nul terminator }; #define DBCONTACTSETTINGS_SIGNATURE 0x53DECADEu struct DBContactSettings { - DWORD signature; - DWORD ofsNext; //offset to the next contactsettings in the chain - DWORD ofsModuleName; //offset to the DBModuleName of the owner of these - //settings - DWORD cbBlob; //size of the blob in bytes. May be larger than the - //actual size for reducing the number of moves - //required using granularity in resizing - BYTE blob[1]; //the blob. a back-to-back sequence of DBSetting - //structs, the last has cbName = 0 + DWORD signature; + DWORD ofsNext; //offset to the next contactsettings in the chain + DWORD ofsModuleName; //offset to the DBModuleName of the owner of these + //settings + DWORD cbBlob; //size of the blob in bytes. May be larger than the + //actual size for reducing the number of moves + //required using granularity in resizing + BYTE blob[1]; //the blob. a back-to-back sequence of DBSetting + //structs, the last has cbName = 0 }; #define DBEVENT_SIGNATURE 0x45DECADEu struct DBEvent { DWORD signature; - DWORD ofsPrev,ofsNext; //offset to the previous and next events in the + DWORD ofsPrev, ofsNext; //offset to the previous and next events in the //chain. Chain is sorted chronologically DWORD ofsModuleName; //offset to a DBModuleName struct of the name of //the owner of this event @@ -151,7 +153,9 @@ struct CDb3Base : public MIDatabase, public MIDatabaseChecker, public MZeroedObj int Create(void); int CreateDbHeaders(const DBSignature&); int CheckDbHeaders(); + void DatabaseCorruption(TCHAR *text); + void WriteSignature(DBSignature&); __forceinline HANDLE getFile() const { return m_hDbFile; } __forceinline bool isEncrypted() const { return m_bEncrypted; } @@ -237,7 +241,7 @@ protected: //////////////////////////////////////////////////////////////////////////// // database stuff -public: +public: UINT_PTR m_flushBuffersTimerId; DWORD m_flushFailTick; PBYTE m_pDbCache; @@ -257,7 +261,8 @@ protected: DWORD ReallocSpace(DWORD ofs, int oldSize, int newSize); __forceinline PBYTE DBRead(HANDLE hContact, int bytesRequired, int *bytesAvail) - { return DBRead((DWORD)hContact, bytesRequired, bytesAvail); + { + return DBRead((DWORD)hContact, bytesRequired, bytesAvail); } //////////////////////////////////////////////////////////////////////////// @@ -293,14 +298,14 @@ protected: DWORD ConvertModuleNameOfs(DWORD ofsOld); void ConvertOldEvent(DBEvent*& dbei); - int GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs,int isStatic); + int GetContactSettingWorker(HANDLE hContact, DBCONTACTGETSETTING *dbcgs, int isStatic); int WorkSettingsChain(DWORD ofsContact, DBContact *dbc, int firstTime); int WorkEventChain(DWORD ofsContact, DBContact *dbc, int firstTime); DWORD WriteSegment(DWORD ofs, PVOID buf, int cbBytes); DWORD WriteEvent(DBEvent *dbe); - void WriteOfsNextToPrevious(DWORD ofsPrev,DBContact *dbc,DWORD ofsNext); - void FinishUp(DWORD ofsLast,DBContact *dbc); + void WriteOfsNextToPrevious(DWORD ofsPrev, DBContact *dbc, DWORD ofsNext); + void FinishUp(DWORD ofsLast, DBContact *dbc); DBCHeckCallback *cb; DWORD sourceFileSize, ofsAggrCur; @@ -326,4 +331,3 @@ protected: void InitDialogs(); bool EnterPassword(const BYTE *pKey, const size_t keyLen); }; - diff --git a/plugins/Db3x_mmap/src/dbmodulechain.cpp b/plugins/Db3x_mmap/src/dbmodulechain.cpp index 743bbd2b21..3b61a236fa 100644 --- a/plugins/Db3x_mmap/src/dbmodulechain.cpp +++ b/plugins/Db3x_mmap/src/dbmodulechain.cpp @@ -95,9 +95,9 @@ DWORD CDb3Base::GetModuleNameOfs(const char *szName) dbmn.cbName = nameLen; dbmn.ofsNext = m_dbHeader.ofsFirstModuleName; m_dbHeader.ofsFirstModuleName = ofsNew; - DBWrite(0,&m_dbHeader,sizeof(m_dbHeader)); - DBWrite(ofsNew,&dbmn,offsetof(struct DBModuleName,name)); - DBWrite(ofsNew+offsetof(struct DBModuleName,name),(PVOID)szName,nameLen); + DBWrite(0, &m_dbHeader, sizeof(m_dbHeader)); + DBWrite(ofsNew, &dbmn, offsetof(struct DBModuleName, name)); + DBWrite(ofsNew + offsetof(struct DBModuleName, name), (PVOID)szName, nameLen); DBFlush(0); //add to cache diff --git a/plugins/Db3x_mmap/src/dbsettings.cpp b/plugins/Db3x_mmap/src/dbsettings.cpp index 0383a12e41..254718fa9a 100644 --- a/plugins/Db3x_mmap/src/dbsettings.cpp +++ b/plugins/Db3x_mmap/src/dbsettings.cpp @@ -83,7 +83,7 @@ int CDb3Base::GetContactSettingWorker(HANDLE hContact, DBCONTACTGETSETTING *dbcg DBVARIANT *pCachedValue = m_cache->GetCachedValuePtr(hContact, szCachedSettingName, 0); if (pCachedValue != NULL) { if (pCachedValue->type == DBVT_ASCIIZ || pCachedValue->type == DBVT_UTF8) { - bool bIsEncrypted = m_bEncrypted || ::isEncrypted(dbcgs->szModule, dbcgs->szSetting); + bool bIsEncrypted = /*m_bEncrypted || */ ::isEncrypted(dbcgs->szModule, dbcgs->szSetting); int cbOrigLen = dbcgs->pValue->cchVal; char *cbOrigPtr = dbcgs->pValue->pszVal; memcpy(dbcgs->pValue, pCachedValue, sizeof(DBVARIANT)); @@ -412,7 +412,7 @@ STDMETHODIMP_(BOOL) CDb3Base::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT case DBVT_ASCIIZ: case DBVT_UTF8: if (tmp.value.pszVal == NULL) return 1; tmp.value.cchVal = (WORD)strlen(tmp.value.pszVal); - bIsEncrypted = m_bEncrypted || ::isEncrypted(dbcws->szModule, dbcws->szSetting); + bIsEncrypted = /*m_bEncrypted ||*/ ::isEncrypted(dbcws->szModule, dbcws->szSetting); if (bIsEncrypted) { size_t len; BYTE *pResult = m_crypto->encodeString(tmp.value.pszVal, &len); diff --git a/plugins/Db3x_mmap/src/ui.cpp b/plugins/Db3x_mmap/src/ui.cpp index 902791c1b2..a8fa3f787a 100644 --- a/plugins/Db3x_mmap/src/ui.cpp +++ b/plugins/Db3x_mmap/src/ui.cpp @@ -192,6 +192,7 @@ LBL_Error: SetDlgItemTextA(hwndDlg, IDC_USERPASS2, ""); } else { + param->db->WriteSignature(dbSignatureU); param->db->SetPassword(NULL); param->db->StoreKey(); EndDialog(hwndDlg, IDREMOVE); @@ -215,6 +216,7 @@ LBL_Error: if (!CheckOldPassword(hwndDlg, param->db)) goto LBL_Error; + param->db->WriteSignature(dbSignatureE); param->db->SetPassword(buf2); param->db->StoreKey(); SecureZeroMemory(buf2, sizeof(buf2)); -- cgit v1.2.3