See ChangeLog

Monotone-Parent: 34186beb96b4e03796e53fcc658539fd1c3dbb8a
Monotone-Revision: 8027e57cbf5cbb4ab2ee6bf9509fe2f571f150c1

Monotone-Author: ludovic@Sophos.ca
Monotone-Date: 2011-09-04T16:25:32
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Ludovic Marcotte 2011-09-04 16:25:32 +00:00
parent defb3e67dc
commit 8fb4411dd6
4 changed files with 76 additions and 64 deletions

View File

@ -1,3 +1,14 @@
2011-09-04 Ludovic Marcotte <lmarcotte@inverse.ca>
* OpenChange/MAPIStoreMapping.m: (MAPIStoreMappingTDBTraverse())
Fixed a major issue regarding the use of strtoll. It was overflowing
keys as they are unsigned long long int. We now make use of strtoull
which fixes the problem and avoids major cache corruption of the
indexing.tdb database (per user).
* OpenChange/MAPIStoreSOGo.m: Some cleanups to ease current and
future debugging
2011-08-18 Francis Lachapelle <flachapelle@inverse.ca> 2011-08-18 Francis Lachapelle <flachapelle@inverse.ca>
* UI/WebServerResources/UIxContactEditor.js * UI/WebServerResources/UIxContactEditor.js

View File

@ -410,6 +410,8 @@ _prepareContextClass (Class contextClass,
openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId); openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId);
[mapping registerURL: childURL withID: mappingId]; [mapping registerURL: childURL withID: mappingId];
contextId = 0; contextId = 0;
// FIXME: + 7 to skip the BOM or what?
mapistore_search_context_by_uri (mstoreCtx, [folderURL UTF8String] + 7, mapistore_search_context_by_uri (mstoreCtx, [folderURL UTF8String] + 7,
&contextId, &rootObject); &contextId, &rootObject);
mapistore_indexing_record_add_mid (mstoreCtx, contextId, mappingId); mapistore_indexing_record_add_mid (mstoreCtx, contextId, mappingId);

View File

@ -55,21 +55,36 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
NSNumber *idNbr; NSNumber *idNbr;
NSString *uri; NSString *uri;
char *idStr, *uriStr; char *idStr, *uriStr;
uint64_t idVal; long long unsigned int idVal;
// get the key
// key examples : key(18) = "0x6900000000000001"
// key(31) = "SOFT_DELETED:0xb100020000000001"
//
idStr = (char *) data1.dptr; idStr = (char *) data1.dptr;
idVal = strtoll (idStr, NULL, 16); idNbr = nil;
idNbr = [NSNumber numberWithUnsignedLongLong: idVal];
uriStr = strndup ((const char *) data2.dptr, data2.dsize); if (strncmp(idStr, "SOFT_DELETED:", 13) != 0)
*(uriStr+(data2.dsize)) = 0; {
// It's very important here to use strtoull and NOT strtoll as
// the latter will overflow a long long with typical key values.
idVal = strtoull(idStr, NULL, 0);
idNbr = [NSNumber numberWithUnsignedLongLong: idVal];
}
// get the value and null-terminate it
uriStr = (char *)malloc(sizeof(char *) * data2.dsize+1);
memset(uriStr, 0, data2.dsize+1);
memcpy(uriStr, (const char *) data2.dptr, data2.dsize);
uri = [NSString stringWithUTF8String: uriStr]; uri = [NSString stringWithUTF8String: uriStr];
free (uriStr); free (uriStr);
mapping = data; mapping = data;
[mapping setObject: uri forKey: idNbr];
// NSLog (@"preregistered url '%@' for id '%@'", uri, idNbr); if (uri && idNbr)
{
[mapping setObject: uri forKey: idNbr];
}
return 0; return 0;
} }
@ -142,9 +157,11 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2,
{ {
idNbr = [keys objectAtIndex: count]; idNbr = [keys objectAtIndex: count];
uri = [mapping objectForKey: idNbr]; uri = [mapping objectForKey: idNbr];
// [self logWithFormat: @"preregistered id '%@' for url '%@'", idNbr, uri]; //[self logWithFormat: @"preregistered id '%@' for url '%@'", idNbr, uri];
[reverseMapping setObject: idNbr forKey: uri]; [reverseMapping setObject: idNbr forKey: uri];
} }
//[self logWithFormat: @"Complete mapping: %@ \nComplete reverse mapping: %@", mapping, reverseMapping];
} }
return self; return self;

View File

@ -48,6 +48,13 @@
#include <mapistore/mapistore.h> #include <mapistore/mapistore.h>
#include <mapistore/mapistore_errors.h> #include <mapistore/mapistore_errors.h>
static int
sogo_backend_unexpected_error()
{
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT");
return MAPISTORE_SUCCESS;
}
/** /**
\details Initialize sogo mapistore backend \details Initialize sogo mapistore backend
@ -169,8 +176,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -200,8 +206,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -239,8 +244,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -277,8 +281,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -313,8 +316,7 @@ sogo_folder_delete_folder(void *folder_object, uint64_t fid)
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -340,8 +342,7 @@ sogo_folder_get_child_count(void *folder_object, uint8_t table_type, uint32_t *c
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -374,8 +375,7 @@ sogo_folder_open_message(void *folder_object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -409,8 +409,7 @@ sogo_folder_create_message(void *folder_object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -436,8 +435,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags)
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -469,8 +467,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -504,8 +501,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -535,8 +531,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -567,8 +562,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -599,8 +593,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -629,8 +622,7 @@ sogo_message_modify_recipients (void *message_object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -657,8 +649,7 @@ sogo_message_save (void *message_object)
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -685,8 +676,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags)
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO OBJECT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -724,8 +714,7 @@ sogo_message_attachment_open_embedded_message
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO CONTEXT"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -751,8 +740,7 @@ static int sogo_table_get_available_properties(void *table_object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -779,8 +767,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -809,8 +796,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -839,8 +825,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -869,8 +854,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -899,8 +883,7 @@ sogo_table_get_row_count (void *table_object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -912,6 +895,7 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id)
struct MAPIStoreTallocWrapper *wrapper; struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool; NSAutoreleasePool *pool;
MAPIStoreTable *table; MAPIStoreTable *table;
int rc;
DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__));
@ -922,13 +906,14 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id)
pool = [NSAutoreleasePool new]; pool = [NSAutoreleasePool new];
[table destroyHandle: handle_id]; [table destroyHandle: handle_id];
[pool release]; [pool release];
rc = MAPISTORE_SUCCESS;
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
} }
return MAPISTORE_SUCCESS; return rc;
} }
static int sogo_properties_get_available_properties(void *object, static int sogo_properties_get_available_properties(void *object,
@ -952,8 +937,7 @@ static int sogo_properties_get_available_properties(void *object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -984,8 +968,7 @@ sogo_properties_get_properties (void *object,
} }
else else
{ {
NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;
@ -1011,8 +994,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow)
} }
else else
{ {
NSLog (@" bad object pointer"); rc = sogo_backend_unexpected_error();
rc = MAPISTORE_SUCCESS;
} }
return rc; return rc;