Skip to content

Commit

Permalink
ppp: clarify parsing of user supplied data in ppp_set_compress()
Browse files Browse the repository at this point in the history
* Split big conditional statement.
  * Check (data.length <= CCP_MAX_OPTION_LENGTH) only once.
  * Don't read ccp_option[1] if not initialised.

Reading uninitialised ccp_option[1] was harmless, because this could
only happen when data.length was 0 or 1. So even then, we couldn't pass
the (ccp_option[1] < 2 || ccp_option[1] > data.length) test anyway.

Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Guillaume Nault authored and David S. Miller committed Feb 25, 2016
1 parent 4fee7da commit 555d5b7
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/net/ppp/ppp_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -2429,13 +2429,15 @@ ppp_set_compress(struct ppp *ppp, unsigned long arg)
unsigned char ccp_option[CCP_MAX_OPTION_LENGTH];

err = -EFAULT;
if (copy_from_user(&data, (void __user *) arg, sizeof(data)) ||
(data.length <= CCP_MAX_OPTION_LENGTH &&
copy_from_user(ccp_option, (void __user *) data.ptr, data.length)))
if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
goto out;
if (data.length > CCP_MAX_OPTION_LENGTH)
goto out;
if (copy_from_user(ccp_option, (void __user *) data.ptr, data.length))
goto out;

err = -EINVAL;
if (data.length > CCP_MAX_OPTION_LENGTH ||
ccp_option[1] < 2 || ccp_option[1] > data.length)
if (data.length < 2 || ccp_option[1] < 2 || ccp_option[1] > data.length)
goto out;

cp = try_then_request_module(
Expand Down

0 comments on commit 555d5b7

Please sign in to comment.