summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2014-01-03 12:19:42 +0000
committerGeorge Hazan <george.hazan@gmail.com>2014-01-03 12:19:42 +0000
commit23617c95e41dc21347d4957c29fe5989a36e2a85 (patch)
tree3a88d117557a7dd5f04863e82966225037c21853
parent6064262200ecd2cead6f706765e3049f559cfcd0 (diff)
more correct way of writing signatures
git-svn-id: http://svn.miranda-ng.org/main/trunk@7477 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r--plugins/Db3x_mmap/src/database.cpp2
-rw-r--r--plugins/Db3x_mmap/src/dbcontacts.cpp8
-rw-r--r--plugins/Db3x_mmap/src/dbcrypt.cpp3
-rw-r--r--plugins/Db3x_mmap/src/dbheaders.cpp7
-rw-r--r--plugins/Db3x_mmap/src/dbintf.cpp1
-rw-r--r--plugins/Db3x_mmap/src/dbintf.h102
-rw-r--r--plugins/Db3x_mmap/src/dbmodulechain.cpp6
-rw-r--r--plugins/Db3x_mmap/src/dbsettings.cpp4
-rw-r--r--plugins/Db3x_mmap/src/ui.cpp2
9 files changed, 73 insertions, 62 deletions
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 <pshpack1.h>
-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));