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

Reply via email to