Security fixes brought forward from 0.9.7.
[openssl.git] / apps / s_socket.c
index ba10d76b2893cf163152815cc684eacd9a52245d..01a980c96d2345f7609d0d91e7bebc4f56df3c91 100644 (file)
 #include <errno.h>
 #include <signal.h>
 
+#include <openssl/e_os2.h>
+
 /* With IPv6, it looks like Digital has mixed up the proper order of
    recursive header file inclusion, resulting in the compiler complaining
    that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
    is needed to have fileno() declared correctly...  So let's define u_int */
-#if defined(VMS) && defined(__DECC) && !defined(__U_INT)
+#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
 #define __U_INT
 typedef unsigned int u_int;
 #endif
@@ -80,7 +82,9 @@ typedef unsigned int u_int;
 #include <openssl/ssl.h>
 
 static struct hostent *GetHostByName(char *name);
+#ifdef OPENSSL_SYS_WINDOWS
 static void sock_cleanup(void);
+#endif
 static int sock_init(void);
 static int init_client_ip(int *sock,unsigned char ip[4], int port);
 static int init_server(int *sock, int port);
@@ -88,17 +92,17 @@ static int init_server_long(int *sock, int port,char *ip);
 static int do_accept(int acc_sock, int *sock, char **host);
 static int host_ip(char *str, unsigned char ip[4]);
 
-#ifdef WIN16
+#ifdef OPENSSL_SYS_WIN16
 #define SOCKET_PROTOCOL        0 /* more microsoft stupidity */
 #else
 #define SOCKET_PROTOCOL        IPPROTO_TCP
 #endif
 
-#ifdef WINDOWS
+#ifdef OPENSSL_SYS_WINDOWS
 static struct WSAData wsa_state;
 static int wsa_init_done=0;
 
-#ifdef WIN16
+#ifdef OPENSSL_SYS_WIN16
 static HWND topWnd=0;
 static FARPROC lpTopWndProc=NULL;
 static FARPROC lpTopHookProc=NULL;
@@ -127,24 +131,24 @@ static BOOL CALLBACK enumproc(HWND hwnd,LPARAM lParam)
        return(FALSE);
        }
 
-#endif /* WIN32 */
-#endif /* WINDOWS */
+#endif /* OPENSSL_SYS_WIN32 */
+#endif /* OPENSSL_SYS_WINDOWS */
 
+#ifdef OPENSSL_SYS_WINDOWS
 static void sock_cleanup(void)
        {
-#ifdef WINDOWS
        if (wsa_init_done)
                {
                wsa_init_done=0;
                WSACancelBlockingCall();
                WSACleanup();
                }
-#endif
        }
+#endif
 
 static int sock_init(void)
        {
-#ifdef WINDOWS
+#ifdef OPENSSL_SYS_WINDOWS
        if (!wsa_init_done)
                {
                int err;
@@ -161,15 +165,15 @@ static int sock_init(void)
                        return(0);
                        }
 
-#ifdef WIN16
+#ifdef OPENSSL_SYS_WIN16
                EnumTaskWindows(GetCurrentTask(),enumproc,0L);
                lpTopWndProc=(FARPROC)GetWindowLong(topWnd,GWL_WNDPROC);
                lpTopHookProc=MakeProcInstance((FARPROC)topHookProc,_hInstance);
 
                SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopHookProc);
-#endif /* WIN16 */
+#endif /* OPENSSL_SYS_WIN16 */
                }
-#endif /* WINDOWS */
+#endif /* OPENSSL_SYS_WINDOWS */
        return(1);
        }
 
@@ -207,9 +211,11 @@ static int init_client_ip(int *sock, unsigned char ip[4], int port)
        s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
        if (s == INVALID_SOCKET) { perror("socket"); return(0); }
 
+#ifndef OPENSSL_SYS_MPE
        i=0;
        i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
        if (i < 0) { perror("keepalive"); return(0); }
+#endif
 
        if (connect(s,(struct sockaddr *)&them,sizeof(them)) == -1)
                { close(s); perror("connect"); return(0); }
@@ -239,7 +245,7 @@ int do_server(int port, int *ret, int (*cb)(), char *context)
                        return(0);
                        }
                i=(*cb)(name,sock, context);
-               if (name != NULL) Free(name);
+               if (name != NULL) OPENSSL_free(name);
                SHUTDOWN2(sock);
                if (i < 0)
                        {
@@ -281,7 +287,7 @@ static int init_server_long(int *sock, int port, char *ip)
 #endif
        if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)
                {
-#ifndef WINDOWS
+#ifndef OPENSSL_SYS_WINDOWS
                perror("bind");
 #endif
                goto err;
@@ -314,7 +320,7 @@ static int do_accept(int acc_sock, int *sock, char **host)
 
        if (!sock_init()) return(0);
 
-#ifndef WINDOWS
+#ifndef OPENSSL_SYS_WINDOWS
 redoit:
 #endif
 
@@ -328,7 +334,7 @@ redoit:
        ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len);
        if (ret == INVALID_SOCKET)
                {
-#ifdef WINDOWS
+#ifdef OPENSSL_SYS_WINDOWS
                i=WSAGetLastError();
                BIO_printf(bio_err,"accept error %d\n",i);
 #else
@@ -370,9 +376,9 @@ redoit:
                }
        else
                {
-               if ((*host=(char *)Malloc(strlen(h1->h_name)+1)) == NULL)
+               if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL)
                        {
-                       perror("Malloc");
+                       perror("OPENSSL_malloc");
                        return(0);
                        }
                strcpy(*host,h1->h_name);
@@ -523,9 +529,12 @@ static struct hostent *GetHostByName(char *name)
                ret=gethostbyname(name);
                if (ret == NULL) return(NULL);
                /* else add to cache */
-               strncpy(ghbn_cache[lowi].name,name,128);
-               memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent));
-               ghbn_cache[lowi].order=ghbn_miss+ghbn_hits;
+               if(strlen(name) < sizeof ghbn_cache[0].name)
+                       {
+                       strcpy(ghbn_cache[lowi].name,name);
+                       memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent));
+                       ghbn_cache[lowi].order=ghbn_miss+ghbn_hits;
+                       }
                return(ret);
                }
        else