NFC: llcp: integer underflow in nfc_llcp_set_remote_gb()
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 31 Jan 2013 08:16:46 +0000 (11:16 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 8 Feb 2013 19:51:31 +0000 (14:51 -0500)
If gb_len is less than 3 it would cause an integer underflow and
possibly memory corruption in nfc_llcp_parse_gb_tlv().

I removed the old test for gb_len == 0.  I also removed the test for
->remote_gb == NULL.  It's not possible for ->remote_gb to be NULL and
we have already dereferenced ->remote_gb_len so it's too late to test.

The old test return -ENODEV but my test returns -EINVAL.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/nfc/llcp/llcp.c

index 85bc75c38dea67544a39d7e352b144f3a8f4af0e..746f5a2f98048f1e1630f7c53bdba754a74a6d25 100644 (file)
@@ -549,14 +549,13 @@ int nfc_llcp_set_remote_gb(struct nfc_dev *dev, u8 *gb, u8 gb_len)
                pr_err("No LLCP device\n");
                return -ENODEV;
        }
+       if (gb_len < 3)
+               return -EINVAL;
 
        memset(local->remote_gb, 0, NFC_MAX_GT_LEN);
        memcpy(local->remote_gb, gb, gb_len);
        local->remote_gb_len = gb_len;
 
-       if (local->remote_gb == NULL || local->remote_gb_len == 0)
-               return -ENODEV;
-
        if (memcmp(local->remote_gb, llcp_magic, 3)) {
                pr_err("MAC does not support LLCP\n");
                return -EINVAL;