mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
ppp: clarify parsing of user supplied data in ppp_set_compress()
* 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>
This commit is contained in:
parent
4fee7dab07
commit
555d5b70f1
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user