Commit a9862c74 authored by Andrew Donnellan's avatar Andrew Donnellan Committed by Michael Ellerman

powerpc/rtas: Fix array overrun in ppc_rtas() syscall

If ppc_rtas() is called with args.nargs == 16 and args.nret == 0,
args.rets is set to point to &args.args[16], which is beyond the end of
the args.args array. This results in a minor read overrun of the array
when we check the first return code (which, per PAPR, is a required
output of all RTAS calls) to see if there's been a hardware error.

Change the nargs/nret check to ensure nargs is <= 15, allowing room for
the status code. Users shouldn't be calling with nret == 0, but there's
no real harm if they do, so we don't stop them.
Signed-off-by: default avatarAndrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 43750880
...@@ -1070,7 +1070,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) ...@@ -1070,7 +1070,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
nret = be32_to_cpu(args.nret); nret = be32_to_cpu(args.nret);
token = be32_to_cpu(args.token); token = be32_to_cpu(args.token);
if (nargs > ARRAY_SIZE(args.args) if (nargs >= ARRAY_SIZE(args.args)
|| nret > ARRAY_SIZE(args.args) || nret > ARRAY_SIZE(args.args)
|| nargs + nret > ARRAY_SIZE(args.args)) || nargs + nret > ARRAY_SIZE(args.args))
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment