[SyncEvolution] Broken UTF-8 item passed to backend (was Explicit type 'text/x-vcalendar' specified in command or item meta)

Patrick Ohly patrick.ohly at intel.com
Thu Oct 6 06:21:16 UTC 2016


On Thu, 2016-10-06 at 02:26 +0200, deloptes wrote:
> Patrick Ohly wrote:
> 
> > +        // The Nokia N9 vCalendar implementation sends ==0A=0D= at the
> > end of +        // the line when it should send just the =. Apparently the
> > CRLF octets +        // get inserted before quoted-printable encoding and
> > then get encoded. +        // Such a sequence is invalid because = cannot
> > be used literally +        // and must be followed by characters
> > representing the hex value, +        // i.e. == is already invalid.
> > +        //
> > +        // We must skip over the entire sequence and continue at the last
> > +        // = in ==0A=0D=, otherwise the code below would insert
> > additional +        // characters into the decoded text.
> 
> This seems to magically work

I don't like magic - at least not in software engineering ;-}

So let's try to understand this a bit better. Compared to my proposed
patch, you added "p=nextunfolded(p,aMimeMode,true)" before the
"continue".

Without it, we enter the next loop iteration:

c=*p; // c should be = now
if (isEndOfLineOrText(c) || (!escaped && aStructSep!=0 && (c==aStructSep || c==aAltSep))) break; // We haven't changed any of these, so it should continue.
escaped=(!escaped) && (c=='\\'); // No change either.
if (c=='=') {
  s=nextunfolded(p,aMimeMode,true); // Hmm, not quite the same...

Okay, I think I understand. The loop expects to start after skipping
over line folding, so when we enter it pointing towards the soft line
break =, it does the wrong thing. The additional nextunfolded() avoids
that.

> @@ -1937,6 +1938,23 @@ static void decodeValue(
>          uInt16 code;
>          const char *s;
>          char hex[2];
> +
> +       // The Nokia N9 vCalendar implementation sends ==0D=0A= at the end
> of
> +       // the line when it should send just the =. Apparently the CRLF
> octets
> +       // get inserted before quoted-printable encoding and then get
> encoded.
> +       // Such a sequence is invalid because = cannot be used literally
> +       // and must be followed by characters representing the hex value,
> +       // i.e. == is already invalid.
> +       //
> +       // We must skip over the entire sequence and continue at the last
> +       // = in ==0D=0A=, otherwise the code below would insert additional
> +       // characters into the decoded text.
> +        if (strncmp(p,"==0D=0A=",8)==0) {
> +          p += strlen("==0D=0A")-1;
> +          // put the cursor at the next useful =
> +          p=nextunfolded(p,aMimeMode,true);
> +          continue;
> +        }
>          s=nextunfolded(p,aMimeMode,true);
>          if (*s==0) break; // end of string
>          hex[0]=*s; // first digit

I'll add that patch to the next test run. Thanks for testing and the
correction.

-- 
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.






More information about the SyncEvolution mailing list