net: use scnprintf() to avoid potential buffer overflow
authorChangli Gao <xiaosuo@gmail.com>
Tue, 24 Aug 2010 13:32:58 +0000 (13:32 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Aug 2010 21:11:49 +0000 (14:11 -0700)
strlcpy() returns the total length of the string they tried to create, so
we should not use its return value without any check. scnprintf() returns
the number of characters written into @buf not including the trailing '\0',
so use it instead here.

Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ethernet/eth.c

index 215c839..85e7b45 100644 (file)
@@ -367,7 +367,7 @@ struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count)
 EXPORT_SYMBOL(alloc_etherdev_mq);
 
 static size_t _format_mac_addr(char *buf, int buflen,
-                               const unsigned char *addr, int len)
+                              const unsigned char *addr, int len)
 {
        int i;
        char *cp = buf;
@@ -376,7 +376,7 @@ static size_t _format_mac_addr(char *buf, int buflen,
                cp += scnprintf(cp, buflen - (cp - buf), "%02x", addr[i]);
                if (i == len - 1)
                        break;
-               cp += strlcpy(cp, ":", buflen - (cp - buf));
+               cp += scnprintf(cp, buflen - (cp - buf), ":");
        }
        return cp - buf;
 }
@@ -386,7 +386,7 @@ ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len)
        size_t l;
 
        l = _format_mac_addr(buf, PAGE_SIZE, addr, len);
-       l += strlcpy(buf + l, "\n", PAGE_SIZE - l);
+       l += scnprintf(buf + l, PAGE_SIZE - l, "\n");
        return ((ssize_t) l);
 }
 EXPORT_SYMBOL(sysfs_format_mac);