Cleanup: ensure string is 0 terminated

The Linux kernel uses the sir_name as a standard C string (in one
instance copying it into a 60 char buffer using kstrncpy with a length
limit of 60), we therefore need to ensure that it is 0 terminated.

Since the existing code didn't notify the caller if we were truncating
the string at 25 characters, I didn't add such a warning/error for
truncating at 24 characters.

I was not able to find documentation on how Windows uses irdaServiceName
but since this is implementing the same standard, the same change was
made to the Windows code.

In both cases I replaced the hardcoded length of 25 with a sizeof()
argument (but both Linux and Windows hard code that length in their
headers, so it seems unlikely this would ever change).

Coverity CID 207790

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2018-01-04 08:50:21 -08:00 committed by Jef Driesen
parent 5997caf45f
commit 71f76819c0

View File

@ -221,18 +221,22 @@ dc_irda_connect_name (dc_iostream_t *abstract, unsigned int address, const char
peer.irdaDeviceID[1] = (address >> 8) & 0xFF;
peer.irdaDeviceID[2] = (address >> 16) & 0xFF;
peer.irdaDeviceID[3] = (address >> 24) & 0xFF;
if (name)
strncpy (peer.irdaServiceName, name, 25);
else
memset (peer.irdaServiceName, 0x00, 25);
if (name) {
strncpy (peer.irdaServiceName, name, sizeof(peer.irdaServiceName) - 1);
peer.irdaServiceName[sizeof(peer.irdaServiceName) - 1] = '\0';
} else {
memset (peer.irdaServiceName, 0x00, sizeof(peer.irdaServiceName));
}
#else
struct sockaddr_irda peer;
peer.sir_family = AF_IRDA;
peer.sir_addr = address;
if (name)
strncpy (peer.sir_name, name, 25);
else
memset (peer.sir_name, 0x00, 25);
if (name) {
strncpy (peer.sir_name, name, sizeof(peer.sir_name) - 1);
peer.sir_name[sizeof(peer.sir_name) - 1] = '\0';
} else {
memset (peer.sir_name, 0x00, sizeof(peer.sir_name));
}
#endif
return dc_socket_connect (&device->base, (struct sockaddr *) &peer, sizeof (peer));