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]