]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wxcrt.cpp
Fix out of bounds string access in wxMSW wxDirDialog.
[wxWidgets.git] / src / common / wxcrt.cpp
index 0362f8f28e59283720db19a705ca692d87713603..dc51b48e41a7c00179e417ae63bf5bd8c9954dad 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <wchar.h>
+
+#ifdef __SGI__
+    // wide character functions are declared in std namespace under IRIX
+    using namespace std;
+
+    // and this one is only declared if __c99 is defined which is not the case
+    // for C++ builds, so declare it ourselves
+    extern "C" int vswscanf(const wchar_t *, const wchar_t *, va_list);
+#endif
 
 #ifndef __WXPALMOS5__
 #ifndef __WXWINCE__
 
 #ifndef __WXPALMOS5__
 #ifndef __WXWINCE__
@@ -65,13 +75,12 @@ using namespace std ;
 #endif
 
 #if defined(__DARWIN__)
 #endif
 
 #if defined(__DARWIN__)
-       #include "wx/osx/core/cfref.h"
-       #include <CoreFoundation/CFLocale.h>
-       #include "wx/osx/core/cfstring.h"
+    #include "wx/osx/core/cfref.h"
+    #include <CoreFoundation/CFLocale.h>
+    #include "wx/osx/core/cfstring.h"
     #include <xlocale.h>
 #endif
 
     #include <xlocale.h>
 #endif
 
-#if wxUSE_WCHAR_T
 WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n)
 {
   // assume that we have mbsrtowcs() too if we have wcsrtombs()
 WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n)
 {
   // assume that we have mbsrtowcs() too if we have wcsrtombs()
@@ -131,7 +140,6 @@ WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *pwz, size_t n)
   return wxWcstombs(NULL, pwz, 0);
 #endif
 }
   return wxWcstombs(NULL, pwz, 0);
 #endif
 }
-#endif // wxUSE_WCHAR_T
 
 char* wxSetlocale(int category, const char *locale)
 {
 
 char* wxSetlocale(int category, const char *locale)
 {
@@ -578,13 +586,20 @@ namespace
 #if !wxUSE_UTF8_LOCALE_ONLY
 int ConvertStringToBuf(const wxString& s, char *out, size_t outsize)
 {
 #if !wxUSE_UTF8_LOCALE_ONLY
 int ConvertStringToBuf(const wxString& s, char *out, size_t outsize)
 {
-    const wxWX2WCbuf buf = s.wc_str();
+    const wxCharBuffer buf(s.mb_str());
 
 
-    size_t len = wxConvLibc.FromWChar(out, outsize, buf);
-    if ( len != wxCONV_FAILED )
-        return len-1;
-    else
-        return wxConvLibc.FromWChar(NULL, 0, buf);
+    const size_t len = buf.length();
+    if ( outsize > len )
+    {
+        memcpy(out, buf, (len+1) * sizeof(char));
+    }
+    else // not enough space
+    {
+        memcpy(out, buf, (outsize-1) * sizeof(char));
+        out[outsize-1] = '\0';
+    }
+
+    return len;
 }
 #endif // !wxUSE_UTF8_LOCALE_ONLY
 
 }
 #endif // !wxUSE_UTF8_LOCALE_ONLY
 
@@ -643,7 +658,7 @@ int wxVsprintf(wchar_t *str, const wxString& format, va_list argptr)
 #if wxUSE_UNICODE_WCHAR
 #ifdef __DMC__
 /*
 #if wxUSE_UNICODE_WCHAR
 #ifdef __DMC__
 /*
-This fails with a bug similar to 
+This fails with a bug similar to
 http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=c++.beta&artnum=680
 in DMC 8.49 and 8.50
 I don't see it being used in the wxWidgets sources at present (oct 2007) CE
 http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=c++.beta&artnum=680
 in DMC 8.49 and 8.50
 I don't see it being used in the wxWidgets sources at present (oct 2007) CE
@@ -725,7 +740,6 @@ int wxVsnprintf(wchar_t *str, size_t size, const wxString& format, va_list argpt
 }
 #endif // wxUSE_UNICODE
 
 }
 #endif // wxUSE_UNICODE
 
-#if wxUSE_WCHAR_T
 
 // ----------------------------------------------------------------------------
 // ctype.h stuff (currently unused)
 
 // ----------------------------------------------------------------------------
 // ctype.h stuff (currently unused)
@@ -797,17 +811,17 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_StrdupW(const wchar_t *pwz)
 #endif // wxCRT_StrdupW
 
 #ifndef wxWCHAR_T_IS_WXCHAR16
 #endif // wxCRT_StrdupW
 
 #ifndef wxWCHAR_T_IS_WXCHAR16
-size_t wxStrlen(const wxChar16 *s ) 
-{ 
-    if (!s) return 0; 
-    size_t i=0; 
-    while (*s!=0) { ++i; ++s; }; 
+size_t wxStrlen(const wxChar16 *s )
+{
+    if (!s) return 0;
+    size_t i=0;
+    while (*s!=0) { ++i; ++s; };
     return i;
 }
 
 wxChar16* wxStrdup(const wxChar16* s)
     return i;
 }
 
 wxChar16* wxStrdup(const wxChar16* s)
-{ 
-  size_t size = (wxStrlen(s) + 1) * sizeof(wxChar16); 
+{
+  size_t size = (wxStrlen(s) + 1) * sizeof(wxChar16);
   wxChar16 *ret = (wxChar16*) malloc(size);
   memcpy(ret, s, size);
   return ret;
   wxChar16 *ret = (wxChar16*) malloc(size);
   memcpy(ret, s, size);
   return ret;
@@ -815,17 +829,17 @@ wxChar16* wxStrdup(const wxChar16* s)
 #endif
 
 #ifndef wxWCHAR_T_IS_WXCHAR32
 #endif
 
 #ifndef wxWCHAR_T_IS_WXCHAR32
-size_t wxStrlen(const wxChar32 *s ) 
-{ 
-    if (!s) return 0; 
-    size_t i=0; 
-    while (*s!=0) { ++i; ++s; }; 
+size_t wxStrlen(const wxChar32 *s )
+{
+    if (!s) return 0;
+    size_t i=0;
+    while (*s!=0) { ++i; ++s; };
     return i;
 }
 
 wxChar32* wxStrdup(const wxChar32* s)
     return i;
 }
 
 wxChar32* wxStrdup(const wxChar32* s)
-{ 
-  size_t size = (wxStrlen(s) + 1) * sizeof(wxChar32); 
+{
+  size_t size = (wxStrlen(s) + 1) * sizeof(wxChar32);
   wxChar32 *ret = (wxChar32*) malloc(size);
   memcpy(ret, s, size);
   return ret;
   wxChar32 *ret = (wxChar32*) malloc(size);
   memcpy(ret, s, size);
   return ret;
@@ -943,8 +957,6 @@ wxCRT_StrftimeW(wchar_t *s, size_t maxsize, const wchar_t *fmt, const struct tm
 }
 #endif // !wxCRT_StrftimeW
 
 }
 #endif // !wxCRT_StrftimeW
 
-#endif // wxUSE_WCHAR_T
-
 #ifdef wxLongLong_t
 template<typename T>
 static wxULongLong_t
 #ifdef wxLongLong_t
 template<typename T>
 static wxULongLong_t
@@ -1099,7 +1111,7 @@ wxULongLong_t wxCRT_StrtoullW(const wchar_t* nptr, wchar_t** endptr, int base)
 #endif // wxLongLong_t
 
 // ----------------------------------------------------------------------------
 #endif // wxLongLong_t
 
 // ----------------------------------------------------------------------------
-// functions which we may need even if !wxUSE_WCHAR_T
+// strtok() functions
 // ----------------------------------------------------------------------------
 
 template<typename T>
 // ----------------------------------------------------------------------------
 
 template<typename T>
@@ -1246,9 +1258,11 @@ void wxUpdateLocaleIsUtf8()
 
 int wxPuts(const wxString& s)
 {
 
 int wxPuts(const wxString& s)
 {
+    // under IRIX putws() takes a non-const argument so use wchar_str() instead
+    // of wc_str()
     CALL_ANSI_OR_UNICODE(return,
                          wxCRT_PutsA(s.mb_str()),
     CALL_ANSI_OR_UNICODE(return,
                          wxCRT_PutsA(s.mb_str()),
-                         wxCRT_PutsW(s.wc_str()));
+                         wxCRT_PutsW(s.wchar_str()));
 }
 
 int wxFputs(const wxString& s, FILE *stream)
 }
 
 int wxFputs(const wxString& s, FILE *stream)