wext: Add bound checks for copy_from_user
authorArjan van de Ven <arjan@linux.intel.com>
Sat, 26 Sep 2009 18:51:14 +0000 (20:51 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 28 Sep 2009 20:55:06 +0000 (16:55 -0400)
The wireless extensions have a copy_from_user to a local stack
array "essid", but both me and gcc have failed to find where
the bounds for this copy are located in the code.

This patch adds some basic sanity checks for the copy length
to make sure that we don't overflow the stack buffer.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Cc: linux-wireless@vger.kernel.org
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/wext.c

index 5b4a0cee4418543a3f034821b32c022c03a34e0c..ac4ac26b53ce0d09d7c205ed666d44cc9d878f83 100644 (file)
@@ -773,10 +773,13 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd,
                        essid_compat = 1;
                else if (IW_IS_SET(cmd) && (iwp->length != 0)) {
                        char essid[IW_ESSID_MAX_SIZE + 1];
+                       unsigned int len;
+                       len = iwp->length * descr->token_size;
 
-                       err = copy_from_user(essid, iwp->pointer,
-                                            iwp->length *
-                                            descr->token_size);
+                       if (len > IW_ESSID_MAX_SIZE)
+                               return -EFAULT;
+
+                       err = copy_from_user(essid, iwp->pointer, len);
                        if (err)
                                return -EFAULT;