FYI

Be careful with type wchar_t for code validation.

GNU implements wchar_t as 32-bit.
Windows implements wchar_t as 16-bit.
Other platforms may also have 16/32, mixed, or undefined.

The type XMLCh is a 16-bit type.  The internal data storage
is UTF-16.

Sincerely,
Steven J. Hathaway

> Hi,
>
> I wanted to try using xerces on openbsd 5.1.
>
> After compilation, DOMCount was always returning:
> unknow reason.
>
> After reading the code, it turns out that the end of conversion by
> wcsrtombs and mbsrtowcs is based on a test on source pointer (source
> pointer should point on null character).
>
> The problem is that this behaviour is not implemented. Source pointer
> points on the character following the last converted character leading
> xerces binary to a risky memory access.
>
> Below, there is a patch based on values returned by the functions (-1 in
> case of error, >= 0 in case of complete/incomplete conversion) that fixes
> the problem.
>
> Regards,
> Simon Elbaz
>
> $ svn diff xercesc/util/Transcoders/Iconv/IconvTransService.cpp
> Index: xercesc/util/Transcoders/Iconv/IconvTransService.cpp
> ===================================================================
> --- xercesc/util/Transcoders/Iconv/IconvTransService.cpp        (revision
> 1387785)
> +++ xercesc/util/Transcoders/Iconv/IconvTransService.cpp        (working
> copy)
> @@ -429,7 +429,7 @@
>      srcBuffer[gTempBuffArraySize - 1] = 0;
>      const wchar_t *src = 0;
>
> -    while (toTranscode[srcCursor] || src)
> +    while (toTranscode[srcCursor])
>      {
>          if (src == 0) // copy a piece of the source string into a local
>                        // buffer, converted to wchar_t and
> NULL-terminated.
> @@ -454,7 +454,7 @@
>              break;
>          }
>          dstCursor += len;
> -        if (src != 0) // conversion not finished. This *always* means
> there
> +        if (len == (resultSize - dstCursor)) // conversion not finished.
> This *always* means there
>                        // was not enough room in the destination buffer.
>          {
>              reallocString<char>(resultString, resultSize, manager,
> resultString != localBuffer);
> @@ -512,9 +512,9 @@
>              break;
>          }
>          dstCursor += len;
> -        if (src == 0) // conversion finished
> +        if ((len >= 0) && (len < (resultSize - dstCursor))) // conversion
> finished
>              break;
> -        if (dstCursor >= resultSize - 1)
> +        if (len == (resultSize - dstCursor))
>              reallocString<wchar_t>(tmpString, resultSize, manager,
> tmpString != localBuffer);
>      }
>      // make a final copy, converting from wchar_t to XMLCh:
>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to