[PATCH libICE] Always terminate strncpy results.

Tobias Stoeckmann tobias at stoeckmann.org
Mon Jul 30 18:50:58 UTC 2018


The function strncpy does not guarantee to append a terminating
NUL character to the destination.

This patch merges libSM's way of handling this issue into libICE.

Signed-off-by: Tobias Stoeckmann <tobias at stoeckmann.org>
---
 src/connect.c    | 66 +++++++++++++++++++++++++++++++++++-------------
 src/listen.c     | 24 +++++++++++++-----
 src/listenwk.c   | 24 +++++++++++++-----
 src/protosetup.c | 37 +++++++++++++++++++--------
 4 files changed, 110 insertions(+), 41 deletions(-)

diff --git a/src/connect.c b/src/connect.c
index 086b7f3..1554ad6 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -66,8 +66,11 @@ IceOpenConnection (
 
     if (networkIdsList == NULL || *networkIdsList == '\0')
     {
-	strncpy (errorStringRet,
-	    "networkIdsList argument is NULL", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet,
+		"networkIdsList argument is NULL", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -144,7 +147,10 @@ IceOpenConnection (
 
     if ((iceConn = malloc (sizeof (struct _IceConn))) == NULL)
     {
-	strncpy (errorStringRet, "Can't malloc", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet, "Can't malloc", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -157,7 +163,10 @@ IceOpenConnection (
 	&iceConn->connection_string)) == NULL)
     {
 	free (iceConn);
-	strncpy (errorStringRet, "Could not open network socket", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet, "Could not open network socket", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -195,7 +204,10 @@ IceOpenConnection (
     if ((iceConn->inbuf = iceConn->inbufptr = malloc (ICE_INBUFSIZE)) == NULL)
     {
 	_IceFreeConnection (iceConn);
-	strncpy (errorStringRet, "Can't malloc", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet, "Can't malloc", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -204,7 +216,10 @@ IceOpenConnection (
     if ((iceConn->outbuf = iceConn->outbufptr = calloc (1, ICE_OUTBUFSIZE)) == NULL)
     {
 	_IceFreeConnection (iceConn);
-	strncpy (errorStringRet, "Can't malloc", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet, "Can't malloc", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -257,8 +272,11 @@ IceOpenConnection (
     if (ioErrorOccured)
     {
 	_IceFreeConnection (iceConn);
-	strncpy (errorStringRet, "IO error occured opening connection",
-	     errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet, "IO error occured opening connection",
+		 errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -269,9 +287,12 @@ IceOpenConnection (
 	 */
 
 	_IceFreeConnection (iceConn);
-	strncpy (errorStringRet,
-	    "Internal error - did not receive the expected ByteOrder message",
-	     errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet,
+		"Internal error - did not receive the expected ByteOrder "
+		"message", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (NULL);
     }
 
@@ -355,8 +376,11 @@ IceOpenConnection (
 
 	if (ioErrorOccured)
 	{
-	    strncpy (errorStringRet, "IO error occured opening connection",
-		errorLength);
+	    if (errorStringRet && errorLength > 0) {
+		strncpy (errorStringRet, "IO error occured opening connection",
+		    errorLength);
+		errorStringRet[errorLength - 1] = '\0';
+	    }
 	    _IceFreeConnection (iceConn);
 	    iceConn = NULL;
 	}
@@ -366,9 +390,12 @@ IceOpenConnection (
 	    {
 		if (reply.connection_reply.version_index >= _IceVersionCount)
 		{
-		    strncpy (errorStringRet,
-	    		"Got a bad version index in the Connection Reply",
-			errorLength);
+		    if (errorStringRet && errorLength > 0) {
+			strncpy (errorStringRet,
+			    "Got a bad version index in the Connection Reply",
+			    errorLength);
+			errorStringRet[errorLength - 1] = '\0';
+		    }
 
 		    free (reply.connection_reply.vendor);
 		    free (reply.connection_reply.release);
@@ -397,8 +424,11 @@ IceOpenConnection (
 	    {
 		/* Connection failed */
 
-		strncpy (errorStringRet, reply.connection_error.error_message,
-		    errorLength);
+		if (errorStringRet && errorLength > 0) {
+		    strncpy (errorStringRet,
+			reply.connection_error.error_message, errorLength);
+		    errorStringRet[errorLength - 1] = '\0';
+		}
 
 		free (reply.connection_error.error_message);
 
diff --git a/src/listen.c b/src/listen.c
index 802ea6a..2af9475 100644
--- a/src/listen.c
+++ b/src/listen.c
@@ -56,8 +56,11 @@ IceListenForConnections (
 	*listenObjsRet = NULL;
 	*countRet = 0;
 
-        strncpy (errorStringRet,
-	    "Cannot establish any listening sockets", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet,
+		"Cannot establish any listening sockets", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 
 	return (0);
     }
@@ -91,8 +94,11 @@ IceListenForConnections (
     {
 	*listenObjsRet = NULL;
 
-        strncpy (errorStringRet,
-	    "Cannot establish any listening sockets", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet,
+		"Cannot establish any listening sockets", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 
 	status = 0;
     }
@@ -102,7 +108,10 @@ IceListenForConnections (
 
 	if (*listenObjsRet == NULL)
 	{
-	    strncpy (errorStringRet, "Malloc failed", errorLength);
+	    if (errorStringRet && errorLength > 0) {
+		strncpy (errorStringRet, "Malloc failed", errorLength);
+		errorStringRet[errorLength - 1] = '\0';
+	    }
 
 	    status = 0;
 	}
@@ -114,7 +123,10 @@ IceListenForConnections (
 
 		if ((*listenObjsRet)[i] == NULL)
 		{
-		    strncpy (errorStringRet, "Malloc failed", errorLength);
+		    if (errorStringRet && errorLength > 0) {
+			strncpy (errorStringRet, "Malloc failed", errorLength);
+			errorStringRet[errorLength - 1] = '\0';
+		    }
 
 		    for (j = 0; j < i; j++)
 			free ((*listenObjsRet)[j]);
diff --git a/src/listenwk.c b/src/listenwk.c
index 4050989..37735b7 100644
--- a/src/listenwk.c
+++ b/src/listenwk.c
@@ -58,8 +58,11 @@ IceListenForWellKnownConnections (
 	*listenObjsRet = NULL;
 	*countRet = 0;
 
-        strncpy (errorStringRet,
-	    "Cannot establish any listening sockets", errorLength);
+	if (errorStringRet && errorLength > 0) {
+            strncpy (errorStringRet,
+		"Cannot establish any listening sockets", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 
 	return (0);
     }
@@ -91,8 +94,11 @@ IceListenForWellKnownConnections (
     {
 	*listenObjsRet = NULL;
 
-        strncpy (errorStringRet,
-	    "Cannot establish any listening sockets", errorLength);
+	if (errorStringRet && errorLength > 0) {
+            strncpy (errorStringRet,
+		"Cannot establish any listening sockets", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 
 	status = 0;
     }
@@ -102,7 +108,10 @@ IceListenForWellKnownConnections (
 
 	if (*listenObjsRet == NULL)
 	{
-	    strncpy (errorStringRet, "Malloc failed", errorLength);
+	    if (errorStringRet && errorLength > 0) {
+		strncpy (errorStringRet, "Malloc failed", errorLength);
+		errorStringRet[errorLength - 1] = '\0';
+	    }
 
 	    status = 0;
 	}
@@ -114,7 +123,10 @@ IceListenForWellKnownConnections (
 
 		if ((*listenObjsRet)[i] == NULL)
 		{
-		    strncpy (errorStringRet, "Malloc failed", errorLength);
+		    if (errorStringRet && errorLength > 0) {
+		        strncpy (errorStringRet, "Malloc failed", errorLength);
+			errorStringRet[errorLength - 1] = '\0';
+		    }
 
 		    for (j = 0; j < i; j++)
 			free ((*listenObjsRet)[j]);
diff --git a/src/protosetup.c b/src/protosetup.c
index fc6010a..8eaa9d6 100644
--- a/src/protosetup.c
+++ b/src/protosetup.c
@@ -71,7 +71,10 @@ IceProtocolSetup (
 
     if (myOpcode < 1 || myOpcode > _IceLastMajorOpcode)
     {
-	strncpy (errorStringRet, "myOpcode out of range", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet, "myOpcode out of range", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (IceProtocolSetupFailure);
     }
 
@@ -79,8 +82,11 @@ IceProtocolSetup (
 
     if (myProtocol->orig_client == NULL)
     {
-	strncpy (errorStringRet,
-	    "IceRegisterForProtocolSetup was not called", errorLength);
+	if (errorStringRet && errorLength > 0) {
+	    strncpy (errorStringRet,
+		"IceRegisterForProtocolSetup was not called", errorLength);
+	    errorStringRet[errorLength - 1] = '\0';
+	}
 	return (IceProtocolSetupFailure);
     }
 
@@ -198,9 +204,12 @@ IceProtocolSetup (
 
 	if (ioErrorOccured)
 	{
-	    strncpy (errorStringRet,
-		"IO error occured doing Protocol Setup on connection",
-		errorLength);
+	    if (errorStringRet && errorLength > 0) {
+		strncpy (errorStringRet,
+		    "IO error occured doing Protocol Setup on connection",
+		    errorLength);
+		errorStringRet[errorLength - 1] = '\0';
+	    }
 	    return (IceProtocolSetupIOError);
 	}
 	else if (gotReply)
@@ -210,9 +219,12 @@ IceProtocolSetup (
 		if (reply.protocol_reply.version_index >=
 		    myProtocol->orig_client->version_count)
 		{
-		    strncpy (errorStringRet,
-	                "Got a bad version index in the Protocol Reply",
-		        errorLength);
+		    if (errorStringRet && errorLength > 0) {
+			strncpy (errorStringRet,
+	                    "Got a bad version index in the Protocol Reply",
+		            errorLength);
+			errorStringRet[errorLength - 1] = '\0';
+		    }
 
 		    free (reply.protocol_reply.vendor);
 		    free (reply.protocol_reply.release);
@@ -229,8 +241,11 @@ IceProtocolSetup (
 	    {
 		/* Protocol Setup failed */
 
-		strncpy (errorStringRet, reply.protocol_error.error_message,
-		    errorLength);
+		if (errorStringRet && errorLength > 0) {
+		    strncpy (errorStringRet, reply.protocol_error.error_message,
+			errorLength);
+		    errorStringRet[errorLength - 1] = '\0';
+		}
 
 		free (reply.protocol_error.error_message);
 	    }
-- 
2.18.0



More information about the xorg-devel mailing list