Good evening,

In attachment, a fix that should fix the PST import for this mailbox.

The fix is temporary as it only add support for PT_MV_BINARY and would
require similar approach for other multi-valued type.

Kind Regards,
Julien.

On Wed, 2013-07-10 at 11:24 -0400, Ludovic Marcotte wrote:
> On 2013-07-09 7:50 AM, balta.cos...@gmail.com wrote:
> > anyone else having this problem ?
> At first, it looks like an OpenChange bug. Here is the stack trace 
> during the PST import:
> 
> (gdb) bt
> #0  0x00007ffff3aed445 in __GI_raise (sig=<optimized out>) at 
> ../nptl/sysdeps/unix/sysv/linux/raise.c:64
> #1  0x00007ffff3af0bab in __GI_abort () at abort.c:91
> #2  0x00007fffd808e30f in mapi_copy_spropvalues (mem_ctx=0x1bea210, 
> source_values=0xf0f730, dest_values=0x1bea210, count=23) at 
> libmapi/property.c:674
> #3  0x00007fffd73aa969 in emsmdbp_object_create_folder 
> (emsmdbp_ctx=0x2a2a9a0, parent_folder=0x2aa7fc0, mem_ctx=0x0, 
> fid=14063964281557221377, rowp=0x7fffffffd5d0, new_folderp=0x7fffffffd5f0)
>      at mapiproxy/servers/default/emsmdb/emsmdbp_object.c:367
> #4  0x00007fffd73c48da in EcDoRpc_RopSyncImportHierarchyChange 
> (mem_ctx=0xca8e40, emsmdbp_ctx=0x2a2a9a0, mapi_req=0x2fe36b0, 
> mapi_repl=0x3035aa0, handles=0x1498360, size=0x7fffffffd6fc)
>      at mapiproxy/servers/default/emsmdb/oxcfxics.c:2317
> #5  0x00007fffd73a69e8 in EcDoRpc_process_transaction (mem_ctx=0xca8e40, 
> emsmdbp_ctx=0x2a2a9a0, mapi_request=0x278dfa0) at 
> mapiproxy/servers/default/emsmdb/dcesrv_exchange_emsmdb.c:1140
> #6  0x00007fffd73a85e3 in dcesrv_EcDoRpcExt2 (dce_call=0xca8e40, 
> mem_ctx=0xca8e40, r=0x1110970) at 
> mapiproxy/servers/default/emsmdb/dcesrv_exchange_emsmdb.c:1755
> #7  0x00007fffd73a8ac5 in dcesrv_exchange_emsmdb_dispatch 
> (dce_call=0xca8e40, mem_ctx=0xca8e40, r=0x1110970, 
> mapiproxy=0x7fffffffd8c0) at 
> mapiproxy/servers/default/emsmdb/dcesrv_exchange_emsmdb.c:1916
> #8  0x00007fffd8418121 in mapiproxy_server_dispatch (dce_call=0xca8e40, 
> mem_ctx=0xca8e40, r=0x1110970, mapiproxy=0x7fffffffd8c0) at 
> mapiproxy/libmapiproxy/dcesrv_mapiproxy_server.c:57
> #9  0x00007fffd864ea27 in mapiproxy_op_dispatch (dce_call=0xca8e40, 
> mem_ctx=0xca8e40, r=0x1110970) at mapiproxy/dcesrv_mapiproxy.c:497
> 
> More investigation will be needed.
> 
> Thanks,
> 
> -- 
> Ludovic Marcotte
> lmarco...@inverse.ca  ::  +1.514.755.3630  ::  http://inverse.ca
> Inverse inc. :: Leaders behind SOGo (http://sogo.nu) and PacketFence 
> (http://packetfence.org)
> 

-- 
Julien Kerihuel
j.kerih...@openchange.org
OpenChange Project Founder

Twitter: http://twitter.com/jkerihuel

GPG Fingerprint: 0B55 783D A781 6329 108A  B609 7EF6 FE11 A35F 1F79




-- 
users@sogo.nu
https://inverse.ca/sogo/lists
diff --git a/libmapi/property.c b/libmapi/property.c
index 9f2b70c..715d7db 100644
--- a/libmapi/property.c
+++ b/libmapi/property.c
@@ -669,26 +669,37 @@ _PUBLIC_ void mapi_copy_spropvalues(TALLOC_CTX *mem_ctx, struct SPropValue *sour
 		*dest_value = *source_value;
 
 		prop_type = (source_value->ulPropTag & 0xFFFF);
-		if ((prop_type & MV_FLAG)) {
-			DEBUG(5, ("multivalues not handled\n"));
-			abort();
-		}
-		else {
-			switch(prop_type) {
-			case PT_STRING8:
-				dest_value->value.lpszA = talloc_strdup(mem_ctx, source_value->value.lpszA);
-				break;
-			case PT_UNICODE:
-				dest_value->value.lpszW = talloc_strdup(mem_ctx, source_value->value.lpszW);
-				break;
-			case PT_BINARY:
-				dest_value->value.bin.cb = source_value->value.bin.cb;
-				dest_value->value.bin.lpb = talloc_memdup(mem_ctx, source_value->value.bin.lpb, sizeof(uint8_t) * source_value->value.bin.cb);
-				break;
-			default:
-				*dest_value = *source_value;
+		switch(prop_type) {
+		case PT_STRING8:
+			dest_value->value.lpszA = talloc_strdup(mem_ctx, source_value->value.lpszA);
+			break;
+		case PT_UNICODE:
+			dest_value->value.lpszW = talloc_strdup(mem_ctx, source_value->value.lpszW);
+			break;
+		case PT_BINARY:
+			dest_value->value.bin.cb = source_value->value.bin.cb;
+			dest_value->value.bin.lpb = talloc_memdup(mem_ctx, source_value->value.bin.lpb, sizeof(uint8_t) * source_value->value.bin.cb);
+			break;
+		case PT_MV_BINARY:
+		{
+			uint32_t        i;
+			uint32_t        size = 0;
+			
+			dest_value->value.MVbin.cValues = source_value->value.MVbin.cValues;
+			size += 4;
+			
+			dest_value->value.MVbin.lpbin = talloc_array(mem_ctx, struct Binary_r, 
+								   dest_value->value.MVbin.cValues);
+			for (i = 0; i < dest_value->value.MVbin.cValues; i++) {
+				dest_value->value.MVbin.lpbin[i].cb = source_value->value.MVbin.lpbin[i].cb;
+				dest_value->value.MVbin.lpbin[i].lpb = source_value->value.MVbin.lpbin[i].lpb;
+				size += dest_value->value.MVbin.lpbin[i].cb + sizeof (uint16_t);
 			}
 		}
+		break;
+		default:
+			*dest_value = *source_value;
+		}
 	}
 }
 

Reply via email to