novi upstream verzije 2.8.3
[ossec-hids.git] / src / os_net / os_net.c
index c282b9f..08e1352 100755 (executable)
@@ -19,7 +19,7 @@
 
 
 
-
+#include <errno.h>
 #include "shared.h"
 #include "os_net.h"
 
@@ -37,8 +37,12 @@ socklen_t us_l = sizeof(n_us);
                                      + strlen ((ptr)->sun_path))
 #endif /* Sun_LEN */
 
-#else
-int ENOBUFS = 0;
+#else /* WIN32 */
+/*int ENOBUFS = 0;*/
+# ifndef ENOBUFS
+# define ENOBUFS 0
+# endif
+
 #endif /* WIN32*/
 
 
@@ -76,6 +80,7 @@ int OS_Bindport(unsigned int _port, unsigned int _proto, char *_ip, int ipv6)
         if(setsockopt(ossock, SOL_SOCKET, SO_REUSEADDR,
                               (char *)&flag,  sizeof(flag)) < 0)
         {
+            OS_CloseSocket(ossock);
             return(OS_SOCKTERR);
         }
     }
@@ -95,6 +100,7 @@ int OS_Bindport(unsigned int _port, unsigned int _proto, char *_ip, int ipv6)
 
         if(bind(ossock, (struct sockaddr *) &server6, sizeof(server6)) < 0)
         {
+            OS_CloseSocket(ossock);
             return(OS_SOCKTERR);
         }
         #endif
@@ -114,6 +120,7 @@ int OS_Bindport(unsigned int _port, unsigned int _proto, char *_ip, int ipv6)
 
         if(bind(ossock, (struct sockaddr *) &server, sizeof(server)) < 0)
         {
+            OS_CloseSocket(ossock);
             return(OS_SOCKTERR);
         }
     }
@@ -124,6 +131,7 @@ int OS_Bindport(unsigned int _port, unsigned int _proto, char *_ip, int ipv6)
     {
         if(listen(ossock, 32) < 0)
         {
+            OS_CloseSocket(ossock);
             return(OS_SOCKTERR);
         }
     }
@@ -167,29 +175,40 @@ int OS_BindUnixDomain(char * path, int mode, int max_msg_size)
     n_us.sun_family = AF_UNIX;
     strncpy(n_us.sun_path, path, sizeof(n_us.sun_path)-1);
 
-    if((ossock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
+    if((ossock = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
         return(OS_SOCKTERR);
 
     if(bind(ossock, (struct sockaddr *)&n_us, SUN_LEN(&n_us)) < 0)
     {
-        close(ossock);
+        OS_CloseSocket(ossock);
         return(OS_SOCKTERR);
     }
 
     /* Changing permissions */
-    chmod(path,mode);
+    if(chmod(path,mode) < 0)
+    {
+        OS_CloseSocket(ossock);
+        return(OS_SOCKTERR);
+    }
 
 
     /* Getting current maximum size */
     if(getsockopt(ossock, SOL_SOCKET, SO_RCVBUF, &len, &optlen) == -1)
+    {
+        OS_CloseSocket(ossock);
         return(OS_SOCKTERR);
+    }
 
 
     /* Setting socket opt */
     if(len < max_msg_size)
     {
         len = max_msg_size;
-        setsockopt(ossock, SOL_SOCKET, SO_RCVBUF, &len, optlen);
+        if(setsockopt(ossock, SOL_SOCKET, SO_RCVBUF, &len, optlen) < 0)
+        {
+            OS_CloseSocket(ossock);
+            return(OS_SOCKTERR);
+        }
     }
 
     return(ossock);
@@ -211,9 +230,9 @@ int OS_ConnectUnixDomain(char * path, int max_msg_size)
     n_us.sun_family = AF_UNIX;
 
     /* Setting up path */
-    strncpy(n_us.sun_path,path,sizeof(n_us.sun_path)-1);       
+    strncpy(n_us.sun_path,path,sizeof(n_us.sun_path)-1);
 
-    if((ossock = socket(AF_UNIX, SOCK_DGRAM,0)) < 0)
+    if((ossock = socket(PF_UNIX, SOCK_DGRAM,0)) < 0)
         return(OS_SOCKTERR);
 
 
@@ -221,23 +240,33 @@ int OS_ConnectUnixDomain(char * path, int max_msg_size)
      * We can use "send" after that
      */
     if(connect(ossock,(struct sockaddr *)&n_us,SUN_LEN(&n_us)) < 0)
+    {
+        OS_CloseSocket(ossock);
         return(OS_SOCKTERR);
+    }
 
 
     /* Getting current maximum size */
     if(getsockopt(ossock, SOL_SOCKET, SO_SNDBUF, &len, &optlen) == -1)
+    {
+        OS_CloseSocket(ossock);
         return(OS_SOCKTERR);
+    }
 
 
     /* Setting maximum message size */
     if(len < max_msg_size)
     {
         len = max_msg_size;
-        setsockopt(ossock, SOL_SOCKET, SO_SNDBUF, &len, optlen);
+        if(setsockopt(ossock, SOL_SOCKET, SO_SNDBUF, &len, optlen) < 0)
+        {
+            OS_CloseSocket(ossock);
+            return(OS_SOCKTERR);
+        }
     }
 
 
-    /* Returning the socket */ 
+    /* Returning the socket */
     return(ossock);
 }
 
@@ -296,7 +325,10 @@ int OS_Connect(unsigned int _port, unsigned int protocol, char *_ip, int ipv6)
 
 
     if((_ip == NULL)||(_ip[0] == '\0'))
+    {
+        OS_CloseSocket(ossock);
         return(OS_INVALID);
+    }
 
 
     if(ipv6 == 1)
@@ -308,7 +340,10 @@ int OS_Connect(unsigned int _port, unsigned int protocol, char *_ip, int ipv6)
         inet_pton(AF_INET6, _ip, &server6.sin6_addr.s6_addr);
 
         if(connect(ossock,(struct sockaddr *)&server6, sizeof(server6)) < 0)
+        {
+            OS_CloseSocket(ossock);
             return(OS_SOCKTERR);
+        }
         #endif
     }
     else
@@ -320,7 +355,10 @@ int OS_Connect(unsigned int _port, unsigned int protocol, char *_ip, int ipv6)
 
 
         if(connect(ossock,(struct sockaddr *)&server, sizeof(server)) < 0)
+        {
+            OS_CloseSocket(ossock);
             return(OS_SOCKTERR);
+        }
     }
 
 
@@ -407,7 +445,7 @@ int OS_AcceptTCP(int socket, char *srcip, int addrsize)
 
     if((clientsocket = accept(socket, (struct sockaddr *) &_nc,
                     &_ncl)) < 0)
-        return(-1);    
+        return(-1);
 
     strncpy(srcip, inet_ntoa(_nc.sin_addr),addrsize -1);
     srcip[addrsize -1]='\0';
@@ -423,14 +461,15 @@ char *OS_RecvTCP(int socket, int sizet)
 {
     char *ret;
 
-    int retsize=0;
-
     ret = (char *) calloc((sizet), sizeof(char));
     if(ret == NULL)
         return(NULL);
 
-    if((retsize = recv(socket, ret, sizet-1,0)) <= 0)
+    if(recv(socket, ret, sizet-1,0) <= 0)
+    {
+        free(ret);
         return(NULL);
+    }
 
     return(ret);
 }
@@ -441,17 +480,12 @@ char *OS_RecvTCP(int socket, int sizet)
  */
 int OS_RecvTCPBuffer(int socket, char *buffer, int sizet)
 {
-    int retsize = 0;
+    int retsize;
 
-    while(!retsize)
+    if((retsize = recv(socket, buffer, sizet -1, 0)) > 0)
     {
-        retsize = recv(socket, buffer, sizet -1, 0);
-        if(retsize > 0)
-        {
-            buffer[retsize] = '\0';
-            return(0);
-        }
-        return(-1);
+        buffer[retsize] = '\0';
+        return(0);
     }
     return(-1);
 }
@@ -471,7 +505,10 @@ char *OS_RecvUDP(int socket, int sizet)
         return(NULL);
 
     if((recv(socket,ret,sizet-1,0))<0)
+    {
+        free(ret);
         return(NULL);
+    }
 
     return(ret);
 }
@@ -564,4 +601,13 @@ char *OS_GetHost(char *host, int attempts)
     return(NULL);
 }
 
+int OS_CloseSocket(int socket)
+{
+    #ifdef WIN32
+    return (closesocket(socket));
+    #else
+    return (close(socket));
+    #endif /* WIN32 */
+}
+
 /* EOF */