diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 43e9add5834043f325b687b2e615ad9e5aca23f9..1a0196fbb49c8dcfe52e0d75bdfe96451f6cbf26 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -1359,13 +1359,16 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
 	if (!regbuf)
 		return -ENOMEM;
 
+	if (regs.len < reglen)
+		reglen = regs.len;
+
 	ops->get_regs(dev, &regs, regbuf);
 
 	ret = -EFAULT;
 	if (copy_to_user(useraddr, &regs, sizeof(regs)))
 		goto out;
 	useraddr += offsetof(struct ethtool_regs, data);
-	if (regbuf && copy_to_user(useraddr, regbuf, regs.len))
+	if (copy_to_user(useraddr, regbuf, reglen))
 		goto out;
 	ret = 0;