netfilter: ipset: Replace strlcpy with strscpy
authorAzeem Shaikh <azeemshaikh38@gmail.com>
Tue, 13 Jun 2023 00:34:37 +0000 (00:34 +0000)
committerKees Cook <keescook@chromium.org>
Tue, 20 Jun 2023 20:35:37 +0000 (13:35 -0700)
strlcpy() reads the entire source buffer first.
This read may exceed the destination size limit.
This is both inefficient and can lead to linear read
overflows if a source string is not NUL-terminated [1].
In an effort to remove strlcpy() completely [2], replace
strlcpy() here with strscpy().

Direct replacement is safe here since return value from all
callers of STRLCPY macro were ignored.

[1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
[2] https://github.com/KSPP/linux/issues/89

Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
Acked-by: Jozsef Kadlecsik <kadlec@netfilter.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20230613003437.3538694-1-azeemshaikh38@gmail.com
net/netfilter/ipset/ip_set_hash_netiface.c

index 0310732..95aeb31 100644 (file)
@@ -40,7 +40,7 @@ MODULE_ALIAS("ip_set_hash:net,iface");
 #define IP_SET_HASH_WITH_MULTI
 #define IP_SET_HASH_WITH_NET0
 
-#define STRLCPY(a, b)  strlcpy(a, b, IFNAMSIZ)
+#define STRSCPY(a, b)  strscpy(a, b, IFNAMSIZ)
 
 /* IPv4 variant */
 
@@ -182,11 +182,11 @@ hash_netiface4_kadt(struct ip_set *set, const struct sk_buff *skb,
 
                if (!eiface)
                        return -EINVAL;
-               STRLCPY(e.iface, eiface);
+               STRSCPY(e.iface, eiface);
                e.physdev = 1;
 #endif
        } else {
-               STRLCPY(e.iface, SRCDIR ? IFACE(in) : IFACE(out));
+               STRSCPY(e.iface, SRCDIR ? IFACE(in) : IFACE(out));
        }
 
        if (strlen(e.iface) == 0)
@@ -400,11 +400,11 @@ hash_netiface6_kadt(struct ip_set *set, const struct sk_buff *skb,
 
                if (!eiface)
                        return -EINVAL;
-               STRLCPY(e.iface, eiface);
+               STRSCPY(e.iface, eiface);
                e.physdev = 1;
 #endif
        } else {
-               STRLCPY(e.iface, SRCDIR ? IFACE(in) : IFACE(out));
+               STRSCPY(e.iface, SRCDIR ? IFACE(in) : IFACE(out));
        }
 
        if (strlen(e.iface) == 0)