Avoid using buffer of already deallocated string in wxHTMLDataObject.
[wxWidgets.git] / src / common / sckaddr.cpp
index 6f7601842ebdee0e5c72196e17ae9bd822ef7a05..3d25f931549c73fc498321011dd903ef32bf43a3 100644 (file)
     #include "wx/object.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/object.h"
     #include "wx/log.h"
     #include "wx/intl.h"
+    #include "wx/thread.h"
 
     #include <stdio.h>
     #include <stdlib.h>
     #include <ctype.h>
 
 
     #include <stdio.h>
     #include <stdlib.h>
     #include <ctype.h>
 
-    #if !defined(__MWERKS__)
-        #include <memory.h>
-    #endif
+    #include <memory.h>
 #endif // !WX_PRECOMP
 
 #include "wx/socket.h"
 #endif // !WX_PRECOMP
 
 #include "wx/socket.h"
@@ -46,7 +45,9 @@
 #include "wx/private/socket.h"
 #include "wx/private/sckaddr.h"
 
 #include "wx/private/socket.h"
 #include "wx/private/sckaddr.h"
 
-#ifdef __UNIX__
+#include <errno.h>
+
+#if defined(__UNIX__) && !defined(__WXMSW__)
     #include <netdb.h>
     #include <arpa/inet.h>
 #endif // __UNIX__
     #include <netdb.h>
     #include <arpa/inet.h>
 #endif // __UNIX__
@@ -74,18 +75,40 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress)
 // ============================================================================
 
 // TODO: use POSIX getaddrinfo() (also available in Winsock 2) for simplicity
 // ============================================================================
 
 // TODO: use POSIX getaddrinfo() (also available in Winsock 2) for simplicity
-//       and IPv6 support
+//       and to use the same code for IPv4 and IPv6 support
 
 
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
     #define HAVE_INET_ADDR
 
     #define HAVE_INET_ADDR
 
+    #ifndef HAVE_GETHOSTBYNAME
     #define HAVE_GETHOSTBYNAME
     #define HAVE_GETHOSTBYNAME
+    #endif
+    #ifndef HAVE_GETSERVBYNAME
     #define HAVE_GETSERVBYNAME
     #define HAVE_GETSERVBYNAME
+    #endif
 
     // under MSW getxxxbyname() functions are MT-safe (but not reentrant) so
     // we don't need to serialize calls to them
     #define wxHAS_MT_SAFE_GETBY_FUNCS
 
     // under MSW getxxxbyname() functions are MT-safe (but not reentrant) so
     // we don't need to serialize calls to them
     #define wxHAS_MT_SAFE_GETBY_FUNCS
-#endif // __WXMSW__
+
+    #if wxUSE_IPV6
+        #ifdef __VISUALC__
+            // this header does dynamic dispatching of getaddrinfo/freeaddrinfo()
+            // by implementing them in its own code if the system versions are
+            // not available (as is the case for anything < XP)
+            #pragma warning(push)
+            #pragma warning(disable:4706)
+            #include <wspiapi.h>
+            #pragma warning(pop)
+        #else
+            // TODO: Use wxDynamicLibrary to bind to these functions
+            //       dynamically on older Windows systems, currently a program
+            //       built with wxUSE_IPV6==1 won't even start there, even if
+            //       it doesn't actually use the socket stuff.
+            #include <ws2tcpip.h>
+        #endif
+    #endif
+#endif // __WINDOWS__
 
 // we assume that we have gethostbyaddr_r() if and only if we have
 // gethostbyname_r() and that it uses the similar conventions to it (see
 
 // we assume that we have gethostbyaddr_r() if and only if we have
 // gethostbyname_r() and that it uses the similar conventions to it (see
@@ -102,20 +125,34 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress)
 #endif
 
 // the _r functions need the extra buffer parameter but unfortunately its type
 #endif
 
 // the _r functions need the extra buffer parameter but unfortunately its type
-// differs between different systems
+// differs between different systems and for the systems which use opaque
+// structs for it (at least AIX and OpenBSD) it must be zero-filled before
+// being passed to the system functions
 #ifdef HAVE_FUNC_GETHOSTBYNAME_R_3
 #ifdef HAVE_FUNC_GETHOSTBYNAME_R_3
-    typedef hostent_data wxGethostBuf;
+    struct wxGethostBuf : hostent_data
+    {
+        wxGethostBuf()
+        {
+            memset(this, 0, sizeof(hostent_data));
+        }
+    };
 #else
     typedef char wxGethostBuf[1024];
 #endif
 
 #else
     typedef char wxGethostBuf[1024];
 #endif
 
-#ifdef HAVE_FUNC_GETSERVBYNAME_R_3
-    typedef servent_data wxGetservBuf;
+#ifdef HAVE_FUNC_GETSERVBYNAME_R_4
+    struct wxGetservBuf : servent_data
+    {
+        wxGetservBuf()
+        {
+            memset(this, 0, sizeof(servent_data));
+        }
+    };
 #else
     typedef char wxGetservBuf[1024];
 #endif
 
 #else
     typedef char wxGetservBuf[1024];
 #endif
 
-#ifdef wxHAS_MT_SAFE_GETBY_FUNCS
+#if defined(wxHAS_MT_SAFE_GETBY_FUNCS) || !wxUSE_THREADS
     #define wxLOCK_GETBY_MUTEX(name)
 #else // may need mutexes to protect getxxxbyxxx() calls
     #if defined(HAVE_GETHOSTBYNAME) || \
     #define wxLOCK_GETBY_MUTEX(name)
 #else // may need mutexes to protect getxxxbyxxx() calls
     #if defined(HAVE_GETHOSTBYNAME) || \
@@ -235,8 +272,9 @@ hostent *wxGethostbyname_r(const char *hostname,
 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5)
     he = gethostbyname_r(hostname, h, buffer, size, err);
 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_3)
 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5)
     he = gethostbyname_r(hostname, h, buffer, size, err);
 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_3)
-    he = gethostbyname_r(hostname, h,  &buffer);
-    *err = h_errno;
+    wxUnusedVar(var);
+    *err = gethostbyname_r(hostname, h,  &buffer);
+    he = h;
 #elif defined(HAVE_GETHOSTBYNAME)
     wxLOCK_GETBY_MUTEX(name);
 
 #elif defined(HAVE_GETHOSTBYNAME)
     wxLOCK_GETBY_MUTEX(name);
 
@@ -266,8 +304,9 @@ hostent *wxGethostbyaddr_r(const char *addr_buf,
 #elif defined(HAVE_FUNC_GETHOSTBYADDR_R_5)
     he = gethostbyaddr_r(addr_buf, buf_size, proto, h, buffer, size, err);
 #elif defined(HAVE_FUNC_GETHOSTBYADDR_R_3)
 #elif defined(HAVE_FUNC_GETHOSTBYADDR_R_5)
     he = gethostbyaddr_r(addr_buf, buf_size, proto, h, buffer, size, err);
 #elif defined(HAVE_FUNC_GETHOSTBYADDR_R_3)
-    he = gethostbyaddr_r(addr_buf, buf_size, proto, h, buffer);
-    *err = h_errno;
+    wxUnusedVar(size);
+    *err = gethostbyaddr_r(addr_buf, buf_size, proto, h, &buffer);
+    he = h;
 #elif defined(HAVE_GETHOSTBYADDR)
     wxLOCK_GETBY_MUTEX(addr);
 
 #elif defined(HAVE_GETHOSTBYADDR)
     wxLOCK_GETBY_MUTEX(addr);
 
@@ -350,7 +389,7 @@ servent *deepCopyServent(servent *s,
 servent *wxGetservbyname_r(const char *port,
                            const char *protocol,
                            servent *serv,
 servent *wxGetservbyname_r(const char *port,
                            const char *protocol,
                            servent *serv,
-                           wxGetservBuf buffer,
+                           wxGetservBuf& buffer,
                            int size)
 {
     servent *se;
                            int size)
 {
     servent *se;
@@ -359,7 +398,9 @@ servent *wxGetservbyname_r(const char *port,
 #elif defined(HAVE_FUNC_GETSERVBYNAME_R_5)
     se = getservbyname_r(port, protocol, serv, buffer, size);
 #elif defined(HAVE_FUNC_GETSERVBYNAME_R_4)
 #elif defined(HAVE_FUNC_GETSERVBYNAME_R_5)
     se = getservbyname_r(port, protocol, serv, buffer, size);
 #elif defined(HAVE_FUNC_GETSERVBYNAME_R_4)
-    se = getservbyname_r(port, protocol, serv, &buffer);
+    wxUnusedVar(size);
+    if ( getservbyname_r(port, protocol, serv, &buffer) != 0 )
+        return NULL;
 #elif defined(HAVE_GETSERVBYNAME)
     wxLOCK_GETBY_MUTEX(serv);
 
 #elif defined(HAVE_GETSERVBYNAME)
     wxLOCK_GETBY_MUTEX(serv);
 
@@ -474,7 +515,7 @@ bool wxSockAddressImpl::SetHostName4(const wxString& name)
     if ( !addr )
         return false;
 
     if ( !addr )
         return false;
 
-    const wxUTF8Buf namebuf(name.utf8_str());
+    const wxScopedCharBuffer namebuf(name.utf8_str());
 
     // first check if this is an address in quad dotted notation
 #if defined(HAVE_INET_ATON)
 
     // first check if this is an address in quad dotted notation
 #if defined(HAVE_INET_ATON)
@@ -661,7 +702,7 @@ bool wxSockAddressImpl::SetPath(const wxString& path)
     if ( !addr )
         return false;
 
     if ( !addr )
         return false;
 
-    const wxUTF8Buf buf(path.utf8_str());
+    const wxScopedCharBuffer buf(path.utf8_str());
     if ( strlen(buf) >= UNIX_PATH_MAX )
         return false;
 
     if ( strlen(buf) >= UNIX_PATH_MAX )
         return false;
 
@@ -688,9 +729,19 @@ wxString wxSockAddressImpl::GetPath() const
 // wxSockAddress
 // ----------------------------------------------------------------------------
 
 // wxSockAddress
 // ----------------------------------------------------------------------------
 
+const sockaddr *wxSockAddress::GetAddressData() const
+{
+    return GetAddress().GetAddr();
+}
+
+int wxSockAddress::GetAddressDataLen() const
+{
+    return GetAddress().GetLen();
+}
+
 void wxSockAddress::Init()
 {
 void wxSockAddress::Init()
 {
-    if ( !wxSocketBase::IsInitialized() )
+    if ( wxIsMainThread() && !wxSocketBase::IsInitialized() )
     {
         // we must do it before using any socket functions
         (void)wxSocketBase::Initialize();
     {
         // we must do it before using any socket functions
         (void)wxSocketBase::Initialize();
@@ -829,7 +880,7 @@ wxString wxIPV4address::IPAddress() const
 
     return wxString::Format
            (
 
     return wxString::Format
            (
-            "%lu.%lu.%lu.%lu",
+            "%u.%u.%u.%u",
             (addr >> 24) & 0xff,
             (addr >> 16) & 0xff,
             (addr >> 8) & 0xff,
             (addr >> 24) & 0xff,
             (addr >> 16) & 0xff,
             (addr >> 8) & 0xff,