Hi Alberto, your modification of configure script solves my problem. Thanks.
On Fri, Sep 28, 2012 at 4:27 PM, Alberto Massari < [email protected]> wrote: > Hi Simon, > it looks that libc in OpenBSD 5.1 is not obeying to the documentation for > wcsrtombs/mbsrtowcs. > > If *d**s**t* is not a null pointer, the pointer object pointed to > by *s**r**c* is assigned either a null pointer (if conversion > stopped due to reaching a terminating null wide-character) > or the address just past the last wide-character converted > (if any). > > Instead of hacking the code to try to detect whether the conversion > actually wrote a NULL character in the converted string, I chose to modify > the 'configure' script to detect this behaviour and disable the usage of > the re-entrant functions if it doesn't match how the Xerces code uses them. > > Thank you for reporting this issue, > Alberto > > Il 28/09/2012 00:18, Simon Elbaz ha scritto: > > 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: > > >
