Parcourir la source

Various coverity scan fixes for networking

Fix FreeBSD websocket compilation error
Fabio Alessandrelli il y a 7 ans
Parent
commit
03bf783f3c

+ 3 - 1
drivers/unix/ip_unix.cpp

@@ -101,7 +101,7 @@ IP_Address IP_Unix::_resolve_hostname(const String &p_hostname, Type p_type) {
 		hints.ai_family = AF_UNSPEC;
 		hints.ai_flags = AI_ADDRCONFIG;
 	};
-	hints.ai_flags &= !AI_NUMERICHOST;
+	hints.ai_flags &= ~AI_NUMERICHOST;
 
 	int s = getaddrinfo(p_hostname.utf8().get_data(), NULL, &hints, &result);
 	if (s != 0) {
@@ -111,6 +111,8 @@ IP_Address IP_Unix::_resolve_hostname(const String &p_hostname, Type p_type) {
 
 	if (result == NULL || result->ai_addr == NULL) {
 		ERR_PRINT("Invalid response from getaddrinfo");
+		if (result)
+			freeaddrinfo(result);
 		return IP_Address();
 	};
 

+ 15 - 6
drivers/unix/stream_peer_tcp_posix.cpp

@@ -124,11 +124,14 @@ void StreamPeerTCPPosix::set_socket(int p_sockfd, IP_Address p_host, int p_port,
 	sock_type = p_sock_type;
 	sockfd = p_sockfd;
 #ifndef NO_FCNTL
-	fcntl(sockfd, F_SETFL, O_NONBLOCK);
+	if (fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #else
 	int bval = 1;
-	ioctl(sockfd, FIONBIO, &bval);
-
+	if (ioctl(sockfd, FIONBIO, &bval) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #endif
 	status = STATUS_CONNECTING;
 
@@ -150,10 +153,14 @@ Error StreamPeerTCPPosix::connect_to_host(const IP_Address &p_host, uint16_t p_p
 	};
 
 #ifndef NO_FCNTL
-	fcntl(sockfd, F_SETFL, O_NONBLOCK);
+	if (fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #else
 	int bval = 1;
-	ioctl(sockfd, FIONBIO, &bval);
+	if (ioctl(sockfd, FIONBIO, &bval) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #endif
 
 	struct sockaddr_storage their_addr;
@@ -308,7 +315,9 @@ void StreamPeerTCPPosix::set_no_delay(bool p_enabled) {
 
 	ERR_FAIL_COND(!is_connected_to_host());
 	int flag = p_enabled ? 1 : 0;
-	setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));
+	if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0) {
+		ERR_PRINT("Unable to set TCP no delay option");
+	}
 }
 
 bool StreamPeerTCPPosix::is_connected_to_host() const {

+ 13 - 4
drivers/unix/tcp_server_posix.cpp

@@ -91,10 +91,14 @@ Error TCPServerPosix::listen(uint16_t p_port, const IP_Address &p_bind_address)
 	ERR_FAIL_COND_V(sockfd == -1, FAILED);
 
 #ifndef NO_FCNTL
-	fcntl(sockfd, F_SETFL, O_NONBLOCK);
+	if (fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #else
 	int bval = 1;
-	ioctl(sockfd, FIONBIO, &bval);
+	if (ioctl(sockfd, FIONBIO, &bval) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #endif
 
 	int reuse = 1;
@@ -113,6 +117,7 @@ Error TCPServerPosix::listen(uint16_t p_port, const IP_Address &p_bind_address)
 			ERR_FAIL_V(FAILED);
 		};
 	} else {
+		close(sockfd);
 		return ERR_ALREADY_IN_USE;
 	};
 
@@ -157,10 +162,14 @@ Ref<StreamPeerTCP> TCPServerPosix::take_connection() {
 	int fd = accept(listen_sockfd, (struct sockaddr *)&their_addr, &size);
 	ERR_FAIL_COND_V(fd == -1, Ref<StreamPeerTCP>());
 #ifndef NO_FCNTL
-	fcntl(fd, F_SETFL, O_NONBLOCK);
+	if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #else
 	int bval = 1;
-	ioctl(fd, FIONBIO, &bval);
+	if (ioctl(fd, FIONBIO, &bval) < 0) {
+		WARN_PRINT("Error setting socket as non blocking");
+	}
 #endif
 
 	Ref<StreamPeerTCPPosix> conn = memnew(StreamPeerTCPPosix);

+ 3 - 1
drivers/windows/stream_peer_tcp_winsock.cpp

@@ -335,7 +335,9 @@ Error StreamPeerTCPWinsock::connect_to_host(const IP_Address &p_host, uint16_t p
 void StreamPeerTCPWinsock::set_no_delay(bool p_enabled) {
 	ERR_FAIL_COND(!is_connected_to_host());
 	int flag = p_enabled ? 1 : 0;
-	setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));
+	if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) != 0) {
+		ERR_PRINT("Unable to set TCP no delay option");
+	}
 }
 
 int StreamPeerTCPWinsock::get_available_bytes() const {

+ 1 - 0
drivers/windows/tcp_server_winsock.cpp

@@ -105,6 +105,7 @@ Error TCPServerWinsock::listen(uint16_t p_port, const IP_Address &p_bind_address
 			ERR_FAIL_V(FAILED);
 		};
 	} else {
+		closesocket(sockfd);
 		return ERR_ALREADY_IN_USE;
 	};
 

+ 7 - 2
modules/websocket/lws_peer.cpp

@@ -35,6 +35,7 @@
 // Needed for socket_helpers on Android at least. UNIXes has it, just include if not windows
 #if !defined(WINDOWS_ENABLED)
 #include <netinet/in.h>
+#include <sys/socket.h>
 #endif
 
 #include "drivers/unix/socket_helpers.h"
@@ -190,9 +191,11 @@ IP_Address LWSPeer::get_connected_host() const {
 	IP_Address ip;
 	int port = 0;
 
-	socklen_t len;
+	socklen_t len = 0;
 	struct sockaddr_storage addr;
+
 	int fd = lws_get_socket_fd(wsi);
+	ERR_FAIL_COND_V(fd == -1, IP_Address());
 
 	int ret = getpeername(fd, (struct sockaddr *)&addr, &len);
 	ERR_FAIL_COND_V(ret != 0, IP_Address());
@@ -209,9 +212,11 @@ uint16_t LWSPeer::get_connected_port() const {
 	IP_Address ip;
 	int port = 0;
 
-	socklen_t len;
+	socklen_t len = 0;
 	struct sockaddr_storage addr;
+
 	int fd = lws_get_socket_fd(wsi);
+	ERR_FAIL_COND_V(fd == -1, 0);
 
 	int ret = getpeername(fd, (struct sockaddr *)&addr, &len);
 	ERR_FAIL_COND_V(ret != 0, 0);