On Wed, Dec 02, 2020 at 05:51:16PM +0900, Masami Hiramatsu wrote:
> Since the insn.prefixes.nbytes can be bigger than the size of
> insn.prefixes.bytes[] when a same prefix is repeated, we have to
> check whether the insn.prefixes.bytes[i] != 0 and i < 4 instead
> of insn.prefixes.nbytes.
> 
> Fixes: 2b1444983508 ("uprobes, mm, x86: Add the ability to install and remove 
> uprobes breakpoints")
> Cc: sta...@vger.kernel.org
> Reported-by: Kees Cook <keesc...@chromium.org>

This should probably be:

Reported-by: syzbot+9b64b619f10f19d19...@syzkaller.appspotmail.com
Debugged-by: Kees Cook <keesc...@chromium.org>

> Signed-off-by: Masami Hiramatsu <mhira...@kernel.org>
> ---
>  arch/x86/kernel/uprobes.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
> index 3fdaa042823d..bb3ea3705b99 100644
> --- a/arch/x86/kernel/uprobes.c
> +++ b/arch/x86/kernel/uprobes.c
> @@ -257,7 +257,7 @@ static bool is_prefix_bad(struct insn *insn)
>  {
>       int i;
>  
> -     for (i = 0; i < insn->prefixes.nbytes; i++) {
> +     for (i = 0; insn->prefixes.bytes[i] && i < 4; i++) {
>               insn_attr_t attr;
>  
>               attr = inat_get_opcode_attribute(insn->prefixes.bytes[i]);
> @@ -746,7 +746,7 @@ static int branch_setup_xol_ops(struct arch_uprobe 
> *auprobe, struct insn *insn)
>        * Intel and AMD behavior differ in 64-bit mode: Intel ignores 66 
> prefix.
>        * No one uses these insns, reject any branch insns with such prefix.
>        */
> -     for (i = 0; i < insn->prefixes.nbytes; i++) {
> +     for (i = 0; insn->prefixes.bytes[i] && i < 4; i++) {
>               if (insn->prefixes.bytes[i] == 0x66)
>                       return -ENOTSUPP;
>       }
> 


-- 
Kees Cook

Reply via email to