X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;ds=sidebyside;f=src%2Fos_net%2Fos_net.c;fp=src%2Fos_net%2Fos_net.c;h=08e1352ee72721e412a2c3f2053eba13bad36718;hb=789cbc8e52da68eba3517b920ef22e000cf3c9fd;hp=c282b9f3253deb13efe9ad7de7fe6ce3f34e899f;hpb=ef70704f0b31b59bb719b884d6a99cb9e3e2044a;p=ossec-hids.git diff --git a/src/os_net/os_net.c b/src/os_net/os_net.c index c282b9f..08e1352 100755 --- a/src/os_net/os_net.c +++ b/src/os_net/os_net.c @@ -19,7 +19,7 @@ - +#include #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 */