arch: tile: fix null pointer dereference on pt_regs pointer
authorColin Ian King <colin.king@canonical.com>
Mon, 16 Mar 2015 20:14:02 +0000 (16:14 -0400)
committerChris Metcalf <cmetcalf@ezchip.com>
Fri, 17 Apr 2015 16:58:41 +0000 (12:58 -0400)
Cppcheck reports the following issue:
[arch/tile/kernel/stack.c:116]: (error) Possible null
  pointer dereference: p

In this case, on reporting on an odd fault, p is set to NULL
and immediately afterwords p is dereferenced iff
!kbt->profile is false.  Rather than doing this check just
return NULL rather than falling through to the potential
null pointer dereference (since the original intentional
outcome would be to return NULL anyhow) for this odd fault
case.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com> [tweaked lightly]
arch/tile/kernel/stack.c

index 7ff5afdbd3aa6f70a6384e2f24d2b38414369482..c42dce50acd81c94b26285410a9ce6e70d2e6e98 100644 (file)
@@ -108,14 +108,15 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt)
                   p->sp < PAGE_OFFSET && p->sp != 0) {
                if (kbt->verbose)
                        pr_err("  <%s while in user mode>\n", fault);
-       } else if (kbt->verbose) {
-               pr_err("  (odd fault: pc %#lx, sp %#lx, ex1 %#lx?)\n",
-                      p->pc, p->sp, p->ex1);
-               p = NULL;
+       } else {
+               if (kbt->verbose)
+                       pr_err("  (odd fault: pc %#lx, sp %#lx, ex1 %#lx?)\n",
+                              p->pc, p->sp, p->ex1);
+               return NULL;
        }
-       if (!kbt->profile || ((1ULL << p->faultnum) & QUEUED_INTERRUPTS) == 0)
-               return p;
-       return NULL;
+       if (kbt->profile && ((1ULL << p->faultnum) & QUEUED_INTERRUPTS) != 0)
+               return NULL;
+       return p;
 }
 
 /* Is the pc pointing to a sigreturn trampoline? */