<div dir="ltr">I'm not sure I did all correctly<br><br>export LD_LIBRARY_PATH=/data-backup/DEVELOPMENT/Projects/tde-sup/sync_debug/openobex-1.7.2-Source/debian/build/lib<br><br>SYNCEVOLUTION_DEBUG=10 ./src/syncevolution --daemon=no -r loglevel=6 nokia_N9 addressbook                                                                   <br><div><br><br>DEBUG 00:00:02] ready to sync<br>[DEBUG 00:00:02] starting SAN 12 auth 1B2M2Y8AsgTpgAmY7PhCfg== nonce SyncEvolution session 1 server PC Suite<br>[DEBUG 00:00:02] SAN datastore addressbook uri Contacts type 7 mode 206<br>[DEVELOPER 00:00:02] ObexTransportAgent::wait(no reply)<br>[DEVELOPER 00:00:02] ObexTransportAgent::wait(): iteration<br>...<br></div><div>[same removed]<br></div><div>...<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): iteration<br>[DEVELOPER 00:00:04] Connecting Bluetooth device with address 40:98:4E:90:56:E3 and channel 25<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): iteration<br>[DEVELOPER 00:00:04] OBEX_EV_PROGRESS<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): iteration<br>[DEVELOPER 00:00:04] OBEX_EV_REQDONE<br>[DEVELOPER 00:00:04] OBEX Transport: get header who from connect response with value SYNCML-SYNC<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): is ready<br>[INFO 00:00:04] Server sending SAN<br>[DEVELOPER 00:00:04] ObexTransport send is called (46 bytes)<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(reply)<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): iteration<br>[DEVELOPER 00:00:04] OBEX_EV_PROGRESS<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): iteration<br>[DEVELOPER 00:00:04] OBEX_EV_REQDONE<br>[DEVELOPER 00:00:04] ObexTransport send completed<br>[DEVELOPER 00:00:04] ObexTransportAgent::wait(): is ready<br>[DEVELOPER 00:00:04] OBEX_EV_PROGRESS<br>[DEVELOPER 00:00:04] OBEX_EV_REQDONE<br>[ERROR 00:00:04] OBEX Request 3 got a failed response Unknown response<br>[DEBUG 00:00:04] Server Alerted Sync init with SANFormat 12 failed, trying with legacy format<br>[DEBUG 00:00:04] starting SAN 11 auth 1B2M2Y8AsgTpgAmY7PhCfg== nonce SyncEvolution session 1 server PC Suite<br>[DEBUG 00:00:04] SAN datastore addressbook uri Contacts type text/x-vcard<br>[DEBUG 00:00:04] SAN with overall sync mode 206<br>[kcrash] TDECrash: Application 'SyncEvolution' crashing...<br>Segmentation fault<br><br></div><div>In GDB<br></div><div><br>Program received signal SIGSEGV, Segmentation fault.<br>0x00007ffff2614358 in smlLibMemcpy () from /usr/lib/x86_64-linux-gnu/libsmltk.so.0<br>(gdb)   <br><br><br></div><div>Thanks in advance for taking your time<br><br></div><div>regards<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 5, 2017 at 11:12 AM, Patrick Ohly <span dir="ltr"><<a href="mailto:patrick.ohly@intel.com" target="_blank">patrick.ohly@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, 2017-09-04 at 20:24 +0200, deloptes wrote:<br>
> Patrick Ohly wrote:<br>
><br>
> > So have you built 1.5.2 with libopenobex2 from Debian Stretch and<br>
> > it<br>
> > failed? With which phone?<br>
> ><br>
><br>
> yes - built 1.5.2 with libopenobex2 from Debian Stretch.<br>
> phone is Nokia N9<br>
<br>
Unfortunately I indeed don't have that phone.<br>
<br>
> > What I did is a "configure --disable-shared --enable-static<br>
> > CFLAGS=-g<br>
> > CXXFLAGS=-g ..." and then in the build directory I ran<br>
> > "SYNCEVOLUTION_DEBUG=10 ./src/syncevolution --daemon=no nokia-n97-<br>
> > mini@<br>
> > devices  addressbook".<br>
> ><br>
> > This allows running the command under gdb. The interesting line is<br>
> > is<br>
> > the error message in ObexTransportAgent::obex_<wbr>callback. What value<br>
> > does<br>
> > obex_rsp have, and why does OBEX_ResponseToString not know it?<br>
><br>
> I may try test this next and post the output.<br>
<br>
Please do.<br>
<br>
I continued debugging this a bit further by running syncevolution under<br>
valgrind. When using libopenobex2, I get:<br>
<br>
==15128== Conditional jump or move depends on uninitialised value(s)<br>
==15128==    at 0x4C31CD6: __memcmp_sse4_1 (in /usr/lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>
==15128==    by 0x918502D: obex_hdr_it_equals (obex_hdr.c:298)<br>
==15128==    by 0x918661A: obex_msg_post_prepare (obex_msg.c:87)<br>
==15128==    by 0x918661A: obex_msg_prepare (obex_msg.c:117)<br>
==15128==    by 0x9184096: obex_client_request_tx_prepare (obex_client.c:237)<br>
==15128==    by 0x9183358: OBEX_Request (api.c:512)<br>
==15128==    by 0x10AF304: SyncEvo::ObexTransportAgent::<wbr>connectReq() (ObexTransportAgent.cpp:237)<br>
<br>
I don't get that with the older libopenobex. That further strengthens<br>
the hypothesis that this is a regression in libopenobex - unless of<br>
course they changed the API and SyncEvolution now lacks some changes,<br>
but it doesn't look like that this is the case.<br>
<br>
Found it. This patch on top of <a href="https://gitlab.com/openobex/mainline" rel="noreferrer" target="_blank">https://gitlab.com/openobex/<wbr>mainline</a><br>
master (no changes since 1.7.2 one year ago) fixes it:<br>
<br>
>From b496d1781db9c23c9984fc15108871<wbr>fe21b5fd0d Mon Sep 17 00:00:00 2001<br>
From: Patrick Ohly <<a href="mailto:patrick.ohly@intel.com">patrick.ohly@intel.com</a>><br>
Date: Tue, 5 Sep 2017 10:53:30 +0200<br>
Subject: [PATCH 1/1] obex_hdr.c: avoid reading uninitialized memory in<br>
 obex_hdr_it_equals<br>
<br>
valgrind correctly reports that the memcmp() in obex_hdr_it_equals()<br>
depends on uninitialized memory:<br>
<br>
==15128== Conditional jump or move depends on uninitialised value(s)<br>
==15128==    at 0x4C31CD6: __memcmp_sse4_1 (in /usr/lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>
==15128==    by 0x918502D: obex_hdr_it_equals (obex_hdr.c:298)<br>
==15128==    by 0x918661A: obex_msg_post_prepare (obex_msg.c:87)<br>
==15128==    by 0x918661A: obex_msg_prepare (obex_msg.c:117)<br>
==15128==    by 0x9184096: obex_client_request_tx_prepare (obex_client.c:237)<br>
==15128==    by 0x9183358: OBEX_Request (api.c:512)<br>
==15128==    by 0x10AF304: SyncEvo::ObexTransportAgent::<wbr>connectReq() (ObexTransportAgent.cpp:237)<br>
...<br>
<br>
That's because on x86-64, the iterator struct contains padding which<br>
does not get initialized by obex_hdr_it_init_from():<br>
<br>
(gdb) p sizeof(it)<br>
$13 = 16<br>
(gdb) p sizeof(it.is_valid)<br>
$14 = 4<br>
<br>
Instead of fixing all places where an iterator might get set up, it<br>
seems safer to limit the comparison to the individual fields. There<br>
are few enough of them that this should not affect performance.<br>
<br>
Signed-off-by: Patrick Ohly <<a href="mailto:patrick.ohly@intel.com">patrick.ohly@intel.com</a>><br>
---<br>
 lib/obex_hdr.c | 2 +-<br>
 1 file changed, 1 insertion(+), 1 deletion(-)<br>
<br>
diff --git a/lib/obex_hdr.c b/lib/obex_hdr.c<br>
index 48576a3..a660405 100644<br>
--- a/lib/obex_hdr.c<br>
+++ b/lib/obex_hdr.c<br>
@@ -295,5 +295,5 @@ void obex_hdr_it_next(struct obex_hdr_it *it)<br>
 <br>
 int obex_hdr_it_equals(const struct obex_hdr_it *a, const struct obex_hdr_it *b)<br>
 {<br>
-       return a && b && (memcmp(a, b, sizeof(*a)) == 0);<br>
+       return a && b && a->list == b->list && a->is_valid == b->is_valid;<br>
 }<br>
-- <br>
2.11.0<br>
<br>
Deloptes, can you rebuild libopenobex2 with that patch and check<br>
whether it helps? It's enough to do "cmake . && make", then set<br>
LD_LIBRARY_PATH so that it includes the lib directory when invoking<br>
syncevolution, i.e. there's no need to actually install libopenobex.<br>
<br>
I do get another valgrind hit in libsynthesis also with the older<br>
libopenobex, but that's later. Here's the fix for that:<br>
<br>
>From de5f1c80d180c326d02f431c6c3189<wbr>f1ca9ae6b3 Mon Sep 17 00:00:00 2001<br>
From: Patrick Ohly <<a href="mailto:patrick.ohly@intel.com">patrick.ohly@intel.com</a>><br>
Date: Tue, 5 Sep 2017 11:03:44 +0200<br>
Subject: [PATCH 1/1] xltenc.c: fix integer underflow<br>
<br>
"len" is unsigned, so subtracting 2 yields a very high value and then<br>
the comparison against n causes memory to be read beyond the end of<br>
the buffer when the buffer is smaller than 2.<br>
<br>
Happens in SyncEvolution when sending a SAN message to a phone via<br>
OBEX. In practice this typically had no effect because the<br>
uninitialized memory is unlikely to contain exactly the sequence of<br>
bytes that was checked for.<br>
<br>
==28571== Invalid read of size 1<br>
==28571==    at 0x1275989: xltEncPcdata (xltenc.c:1177)<br>
==28571==    by 0x1274DAE: xltEncBlock (xltenc.c:1108)<br>
==28571==    by 0x1272DCD: xltEncBlock (xltenc.c:704)<br>
==28571==    by 0x1272698: xltEncInit (xltenc.c:332)<br>
==28571==    by 0x125ED1B: smlStartMessageExt (mgrcmdbuilder.c:207)<br>
==28571==    by 0x112066B: sysync::TSyncSession::<wbr>StartMessage(sml_sync_hdr_s*) (syncsession.cpp:5512)<br>
==28571==    by 0x113F4A6: sysync::<wbr>TEngineSessionDispatch::<wbr>StartMessage(void*, void*, sml_sync_hdr_s*) (enginesessiondispatch.cpp:<wbr>125)<br>
==28571==    by 0x11038DC: sysync::<wbr>smlStartMessageCallback(void*, void*, sml_sync_hdr_s*) (syncappbase.cpp:2394)<br>
==28571==    by 0x125F7C7: mgrProcessStartMessage (mgrcmddispatcher.c:247)<br>
==28571==    by 0x125F552: smlProcessData (mgrcmddispatcher.c:138)<br>
==28571==    by 0x12200EA: sysync::TSyncAgent::<wbr>ServerProcessingStep(unsigned short&, sysync::TEngineProgressType*) (syncagent.cpp:3289)<br>
==28571==    by 0x121FE2B: sysync::TSyncAgent::<wbr>ServerSessionStep(unsigned short&, sysync::TEngineProgressType*) (syncagent.cpp:3257)<br>
==28571==    by 0x121F5FE: sysync::TSyncAgent::<wbr>SessionStep(unsigned short&, sysync::TEngineProgressType*) (syncagent.cpp:3058)<br>
==28571==    by 0x114049D: sysync::<wbr>TServerEngineInterface::<wbr>SessionStep(sysync::<wbr>SessionType*, unsigned short&, sysync::TEngineProgressType*) (enginesessiondispatch.cpp:<wbr>478)<br>
==28571==    by 0x10DD6FC: sysync::SessionStep(void*, sysync::SessionType*, unsigned short*, sysync::TEngineProgressType*) (engineentry.cpp:88)<br>
==28571==    by 0x10D234F: sysync::TEngineModuleBridge::<wbr>SessionStep(sysync::<wbr>SessionType*, unsigned short&, sysync::TEngineProgressType*) (enginemodulebridge.cpp:109)<br>
==28571==    by 0x10CABCC: SyncEvo::SharedEngine::<wbr>SessionStep(boost::shared_ptr<<wbr>sysync::SessionType> const&, unsigned short&, sysync::TEngineProgressType*) (SynthesisEngine.cpp:94)<br>
==28571==    by 0xFDB098: SyncEvo::SyncContext::doSync() (SyncContext.cpp:4101)<br>
==28571==    by 0xFD6DDE: SyncEvo::SyncContext::sync(<wbr>SyncEvo::SyncReport*) (SyncContext.cpp:3445)<br>
==28571==    by 0xE4FD57: SyncEvo::Cmdline::run() (Cmdline.cpp:1726)<br>
==28571==    by 0xC26689: main (syncevolution.cpp:531)<br>
==28571==  Address 0x13733782 is 0 bytes after a block of size 2 alloc'd<br>
==28571==    at 0x4C2BBAF: malloc (in /usr/lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>
==28571==    by 0x126A2D0: wbxmlOpaqueToken (xltdecwbxml.c:680)<br>
==28571==    by 0x1269485: _nextTok (xltdecwbxml.c:341)<br>
==28571==    by 0x1264BAB: nextToken (xltdec.c:649)<br>
==28571==    by 0x126572C: buildPCData (xltdec.c:2368)<br>
==28571==    by 0x1264F60: buildSyncHdr (xltdec.c:777)<br>
==28571==    by 0x1264A75: xltDecInit (xltdec.c:474)<br>
==28571==    by 0x125F6FC: mgrProcessStartMessage (mgrcmddispatcher.c:225)<br>
==28571==    by 0x125F552: smlProcessData (mgrcmddispatcher.c:138)<br>
==28571==    by 0x12200EA: sysync::TSyncAgent::<wbr>ServerProcessingStep(unsigned short&, sysync::TEngineProgressType*) (syncagent.cpp:3289)<br>
...<br>
<br>
Signed-off-by: Patrick Ohly <<a href="mailto:patrick.ohly@intel.com">patrick.ohly@intel.com</a>><br>
---<br>
 src/syncml_tk/src/sml/xlt/<wbr>all/xltenc.c | 2 +-<br>
 1 file changed, 1 insertion(+), 1 deletion(-)<br>
<br>
diff --git a/src/syncml_tk/src/sml/xlt/<wbr>all/xltenc.c b/src/syncml_tk/src/sml/xlt/<wbr>all/xltenc.c<br>
index 46ff6fd..3b74828 100755<br>
--- a/src/syncml_tk/src/sml/xlt/<wbr>all/xltenc.c<br>
+++ b/src/syncml_tk/src/sml/xlt/<wbr>all/xltenc.c<br>
@@ -1173,7 +1173,7 @@ Ret_t xltEncPcdata(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pConten<br>
               p=((<wbr>SmlPcdataPtr_t)pContent)-><wbr>content;<br>
               len=((<wbr>SmlPcdataPtr_t)pContent)-><wbr>length;<br>
               n=0;<br>
-              while (n<len-2) {<br>
+              while (n+2<len) {<br>
                 if (p[n]==']' && p[n+1]==']' && p[n+2]=='>') {<br>
                   // we must substitute "]]>" with "]]>]<![CDATA[]>"<br>
                   // - copy what we have so far (includes ]]>)<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.11.0<br>
<br>
--<br>
Best Regards, Patrick Ohly<br>
<br>
The content of this message is my personal opinion only and although<br>
I am an employee of Intel, the statements I make here in no way<br>
represent Intel's position on the issue, nor am I authorized to speak<br>
on behalf of Intel on this matter.<br>
<br>
<br>
</font></span></blockquote></div><br></div>