[Lcdproc] sock_connect() bug

Frederick Nacino fnacino@internap.com
Fri May 5 19:43:02 2006


This is a multi-part message in MIME format.
--------------010406090309040404030901
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

sock_connect() in shared/sockets.c is supposed to return a descriptor 
referencing the socket via the socket() function. 0 is a valid 
descriptor, however the sock_connect() code and a couple of the clients 
contradict that. I've included a patch that correctly assumes any 
descriptor above -1 is valid. People typically shouldn't run into this 
problem unless you finagle with environment as I have. Normally stdin 
will take up descriptor 0 eliminating the case where the socket() 
function can return a 0.

-- 
Frederick Nacino
Software Engineer, FCP Engineering
Internap Network Services
www.internap.com


--------------010406090309040404030901
Content-Type: text/plain;
 name="lcdproc-20060505-fnacino@internap.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="lcdproc-20060505-fnacino@internap.patch"

diff -ur lcdproc-CVS-current-20060505/clients/lcdexec/lcdexec.c lcdproc-fixes-20060505/clients/lcdexec/lcdexec.c
--- lcdproc-CVS-current-20060505/clients/lcdexec/lcdexec.c	Sun Apr 30 00:00:35 2006
+++ lcdproc-fixes-20060505/clients/lcdexec/lcdexec.c	Fri May  5 12:14:34 2006
@@ -226,7 +226,7 @@
 	report(RPT_INFO, "Connecting to %s:%d", address, port);
 
 	sock = sock_connect(address, port);
-	if (sock <= 0) {
+	if (sock < 0) {
 		return -1;
 	}
 
diff -ur lcdproc-CVS-current-20060505/clients/lcdproc/iface.c lcdproc-fixes-20060505/clients/lcdproc/iface.c
--- lcdproc-CVS-current-20060505/clients/lcdproc/iface.c	Fri May  5 00:00:42 2006
+++ lcdproc-fixes-20060505/clients/lcdproc/iface.c	Fri May  5 12:16:01 2006
@@ -138,7 +138,7 @@
 	/* Try to connect to server */
 	sock = sock_connect(server, port);
 
-	if (sock <= 0) {  /* there was some error and exit */
+	if (sock < 0) {  /* there was some error and exit */
 		fprintf(stderr, "Error: Could not connect to %s:%d\n", server, port);
 		exit(0);
 	}
diff -ur lcdproc-CVS-current-20060505/clients/lcdproc/main.c lcdproc-fixes-20060505/clients/lcdproc/main.c
--- lcdproc-CVS-current-20060505/clients/lcdproc/main.c	Sun Apr 30 00:00:35 2006
+++ lcdproc-fixes-20060505/clients/lcdproc/main.c	Fri May  5 12:13:40 2006
@@ -278,7 +278,7 @@
 	// Connect to the server...
 	usleep(500000);		// wait for the server to start up
 	sock = sock_connect(server, port);
-	if (sock <= 0) {
+	if (sock < 0) {
 		fprintf(stderr, "Error connecting to LCD server %s on port %d.\n"
 		                "Check to see that the server is running and operating normally.\n",
 				server, port);
diff -ur lcdproc-CVS-current-20060505/clients/lcdvc/lcd_link.c lcdproc-fixes-20060505/clients/lcdvc/lcd_link.c
--- lcdproc-CVS-current-20060505/clients/lcdvc/lcd_link.c	Sat Apr 29 00:00:30 2006
+++ lcdproc-fixes-20060505/clients/lcdvc/lcd_link.c	Fri May  5 12:16:30 2006
@@ -41,7 +41,7 @@
 	report(RPT_INFO, "Connecting to %s:%d", address, port);
 
 	sock = sock_connect(address, port);
-	if (sock <= 0) {
+	if (sock < 0) {
 		report(RPT_ERR, "Connecting to %s:%d failed", address, port);
 		return -1;
 	}
diff -ur lcdproc-CVS-current-20060505/shared/sockets.c lcdproc-fixes-20060505/shared/sockets.c
--- lcdproc-CVS-current-20060505/shared/sockets.c	Fri Apr 28 00:00:36 2006
+++ lcdproc-fixes-20060505/shared/sockets.c	Fri May  5 12:20:12 2006
@@ -82,7 +82,7 @@
 #endif
 		report (RPT_ERR, "sock_connect: connect failed");
 		shutdown (sock, SHUT_RDWR);
-		return 0;					  // Normal exit if server doesn't exist...
+		return -1;
 	}
 
 #ifndef WINSOCK2        

--------------010406090309040404030901--