aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2017-11-23 04:19:51 -0500
committerThomas Gleixner <tglx@linutronix.de>2017-11-23 14:17:59 -0500
commite2a5dca753d1cdc3212519023ed8a13e13f5495b (patch)
tree04bd970b855884f0f104041c4662713841b750d3
parent69550d41ff9c884c6d996fca41037974b2255852 (diff)
x86/umip: Fix insn_get_code_seg_params()'s return value
In order to save on redundant structs definitions insn_get_code_seg_params() was made to return two 4-bit values in a char but clang complains: arch/x86/lib/insn-eval.c:780:10: warning: implicit conversion from 'int' to 'char' changes value from 132 to -124 [-Wconstant-conversion] return INSN_CODE_SEG_PARAMS(4, 8); ~~~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~ ./arch/x86/include/asm/insn-eval.h:16:57: note: expanded from macro 'INSN_CODE_SEG_PARAMS' #define INSN_CODE_SEG_PARAMS(oper_sz, addr_sz) (oper_sz | (addr_sz << 4)) Those two values do get picked apart afterwards the opposite way of how they were ORed so wrt to the LSByte, the return value is the same. But this function returns -EINVAL in the error case, which is an int. So make it return an int which is the native word size anyway and thus fix the clang warning. Reported-by: Kees Cook <keescook@google.com> Reported-by: Nick Desaulniers <nick.desaulniers@gmail.com> Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: ricardo.neri-calderon@linux.intel.com Link: https://lkml.kernel.org/r/20171123091951.1462-1-bp@alien8.de
-rw-r--r--arch/x86/include/asm/insn-eval.h2
-rw-r--r--arch/x86/kernel/umip.c2
-rw-r--r--arch/x86/lib/insn-eval.c4
3 files changed, 4 insertions, 4 deletions
diff --git a/arch/x86/include/asm/insn-eval.h b/arch/x86/include/asm/insn-eval.h
index e1d3b4ce8a92..2b6ccf2c49f1 100644
--- a/arch/x86/include/asm/insn-eval.h
+++ b/arch/x86/include/asm/insn-eval.h
@@ -18,6 +18,6 @@
18void __user *insn_get_addr_ref(struct insn *insn, struct pt_regs *regs); 18void __user *insn_get_addr_ref(struct insn *insn, struct pt_regs *regs);
19int insn_get_modrm_rm_off(struct insn *insn, struct pt_regs *regs); 19int insn_get_modrm_rm_off(struct insn *insn, struct pt_regs *regs);
20unsigned long insn_get_seg_base(struct pt_regs *regs, int seg_reg_idx); 20unsigned long insn_get_seg_base(struct pt_regs *regs, int seg_reg_idx);
21char insn_get_code_seg_params(struct pt_regs *regs); 21int insn_get_code_seg_params(struct pt_regs *regs);
22 22
23#endif /* _ASM_X86_INSN_EVAL_H */ 23#endif /* _ASM_X86_INSN_EVAL_H */
diff --git a/arch/x86/kernel/umip.c b/arch/x86/kernel/umip.c
index dabbac30acdf..f44ce0fb3583 100644
--- a/arch/x86/kernel/umip.c
+++ b/arch/x86/kernel/umip.c
@@ -319,7 +319,7 @@ bool fixup_umip_exception(struct pt_regs *regs)
319 unsigned char buf[MAX_INSN_SIZE]; 319 unsigned char buf[MAX_INSN_SIZE];
320 void __user *uaddr; 320 void __user *uaddr;
321 struct insn insn; 321 struct insn insn;
322 char seg_defs; 322 int seg_defs;
323 323
324 if (!regs) 324 if (!regs)
325 return false; 325 return false;
diff --git a/arch/x86/lib/insn-eval.c b/arch/x86/lib/insn-eval.c
index 35625d279458..9119d8e41f1f 100644
--- a/arch/x86/lib/insn-eval.c
+++ b/arch/x86/lib/insn-eval.c
@@ -733,11 +733,11 @@ static unsigned long get_seg_limit(struct pt_regs *regs, int seg_reg_idx)
733 * 733 *
734 * Returns: 734 * Returns:
735 * 735 *
736 * A signed 8-bit value containing the default parameters on success. 736 * An int containing ORed-in default parameters on success.
737 * 737 *
738 * -EINVAL on error. 738 * -EINVAL on error.
739 */ 739 */
740char insn_get_code_seg_params(struct pt_regs *regs) 740int insn_get_code_seg_params(struct pt_regs *regs)
741{ 741{
742 struct desc_struct *desc; 742 struct desc_struct *desc;
743 short sel; 743 short sel;