summaryrefslogtreecommitdiff
path: root/virt
diff options
context:
space:
mode:
authorAndrey Ryabinin <a.ryabinin@samsung.com>2014-08-08 14:22:07 -0700
committerChanho Park <chanho61.park@samsung.com>2015-01-04 20:50:16 -0800
commit6bb1b36726e8a9c8232fc2ec70796817b14d8f8e (patch)
tree127f77f92ba4ee456b3031e7ee53ffb51de23dda /virt
parent942d62204e43fa8280f702e4bed9f65aa3cde745 (diff)
downloadlinux-3.10-6bb1b36726e8a9c8232fc2ec70796817b14d8f8e.tar.gz
linux-3.10-6bb1b36726e8a9c8232fc2ec70796817b14d8f8e.tar.bz2
linux-3.10-6bb1b36726e8a9c8232fc2ec70796817b14d8f8e.zip
lib/idr.c: fix out-of-bounds pointer dereference
I'm working on address sanitizer project for kernel. Recently we started experiments with stack instrumentation, to detect out-of-bounds read/write bugs on stack. Just after booting I've hit out-of-bounds read on stack in idr_for_each (and in __idr_remove_all as well): struct idr_layer **paa = &pa[0]; while (id >= 0 && id <= max) { ... while (n < fls(id)) { n += IDR_BITS; p = *--paa; <--- here we are reading pa[-1] value. } } Despite the fact that after this dereference we are exiting out of loop and never use p, such behaviour is undefined and should be avoided. Fix this by moving pointer derference to the beggining of the loop, right before we will use it. Signed-off-by: Andrey Ryabinin <a.ryabinin@samsung.com> Reviewed-by: Lai Jiangshan <laijs@cn.fujitsu.com> Cc: Tejun Heo <tj@kernel.org> Cc: Alexey Preobrazhensky <preobr@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Konstantin Khlebnikov <koct9i@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Change-Id: Id151fc7e874e3cff64da43eb3359f022de7e6cae Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Diffstat (limited to 'virt')
0 files changed, 0 insertions, 0 deletions