On Tue, 16 Mar 2010, Russell McOrmond wrote:
The segmentation fault is caused by using a string which is actually null
being returned from string functions, with the null then being used as if it
were a string.
See: http://trac.osgeo.org/mapserver/ticket/2988 "Check error returns from
mapstring functions."
Sorry to be responding to my own messages, but wanted to report on
progress.
I added in some additional error return checking, and put some
suggestions into the bug listed above.
I created some additional error reporting on what the reason for the
iconv() failure was (see path at end of message), and now I see "An
invalid multibyte sequence has been encountered in the input" in the
MS_ERRORFILE.
While it is great to have mapserver not core dumping, I am still
wondering if anyone has ideas of where to go next. I suspect there is
something invalid in the data that is causing ArcSDE to send me strings
that aren't valid UTF-16 characters. I don't know enough about ArcSDE or
other ESRI software to know how to validate such things.
Note: Please consider patches like the one below and/or the ones in the
bug for future releases of mapserver. It would be great if Mapserver
would output error messages rather than core dump.
--- mapstring.c-orig 2010-03-17 16:43:19.000000000 -0400
+++ mapstring.c 2010-03-18 11:54:02.000000000 -0400
@@ -1504,8 +1504,8 @@
char* msConvertWideStringToUTF8 (const wchar_t* string, const char*
encoding) {
#ifdef USE_ICONV
- int bconvFailed = MS_TRUE;
char* output = NULL;
+ char* errormessage = NULL;
iconv_t cd = NULL;
size_t nStr;
size_t nInSize;
@@ -1540,23 +1540,36 @@
pszUTF8 = output;
pwszWide = string;
nConv = iconv(cd, (char **)&pwszWide, &nInSize, &pszUTF8,
&nOutSize);
- if ((size_t)-1 != nConv && nOutSize != nBufferSize)
- bconvFailed = MS_FALSE;
+ if ((size_t)-1 != nConv && nOutSize != nBufferSize) {
+ switch (errno) {
+ case E2BIG:
+ errormessage = "There is not sufficient room in buffer";
+ break;
+ case EILSEQ:
+ errormessage = "An invalid multibyte sequence has been
encountered in the input";
+ break;
+ case EINVAL:
+ errormessage = "An incomplete multibyte sequence has been
encountered in the input";
+ break;
+ default:
+ errormessage = "Unknown";
+ break;
+ }
+ msSetError(MS_MISCERR, "Unable to convert string in encoding
'%s' to UTF8: %s",
+ "msConvertWideStringToUTF8()",
+ encoding,errormessage);
+ iconv_close(cd);
+ msFree(output);
+ return NULL;
+ }
iconv_close(cd);
} else {
msSetError(MS_MISCERR, "Encoding not supported by libiconv
(%s).",
"msConvertWideStringToUTF8()",
encoding);
+ msFree(output);
return NULL;
}
-
- if (bconvFailed) {
- msFree(output);
- output = NULL;
- msSetError(MS_MISCERR, "Unable to convert string in encoding
'%s' to UTF8",
- "msConvertWideStringToUTF8()",
- encoding);
- }
} else {
/* we were given a NULL wide string, nothing we can do here */
return NULL;
--
Russell McOrmond, Internet Consultant: <http://www.flora.ca/>
Please help us tell the Canadian Parliament to protect our property
rights as owners of Information Technology. Sign the petition!
http://digital-copyright.ca/petition/ict/ http://KillBillC61.ca
"The government, lobbied by legacy copyright holders and hardware
manufacturers, can pry control over my camcorder, computer,
home theatre, or portable media player from my cold dead hands!"
_______________________________________________
mapserver-users mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/mapserver-users