]> git.ipfire.org Git - thirdparty/ipset.git/commitdiff
netfilter: ipset: Replace strlcpy with strscpy
authorAzeem Shaikh <azeemshaikh38@gmail.com>
Tue, 13 Jun 2023 00:34:37 +0000 (00:34 +0000)
committerJozsef Kadlecsik <kadlec@netfilter.org>
Mon, 18 Sep 2023 20:16:51 +0000 (22:16 +0200)
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
Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
kernel/net/netfilter/ipset/ip_set_hash_netiface.c

index af210c7da4632f1a11de7c38c00b6ea536879645..5baa852e8177d9544f5018a870b7145d6f9f9125 100644 (file)
@@ -41,7 +41,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 */
 
@@ -183,11 +183,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)
@@ -401,11 +401,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)