diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Kconfig.debug | 3 | ||||
| -rw-r--r-- | lib/debugobjects.c | 8 | ||||
| -rw-r--r-- | lib/iov_iter.c | 4 | ||||
| -rw-r--r-- | lib/mpi/mpi-pow.c | 7 | ||||
| -rw-r--r-- | lib/stackdepot.c | 2 | ||||
| -rw-r--r-- | lib/test_kasan.c | 29 |
6 files changed, 51 insertions, 2 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index b01e547d4d04..a6c8db1d62f6 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -1085,6 +1085,9 @@ config PROVE_LOCKING | |||
| 1085 | 1085 | ||
| 1086 | For more details, see Documentation/locking/lockdep-design.txt. | 1086 | For more details, see Documentation/locking/lockdep-design.txt. |
| 1087 | 1087 | ||
| 1088 | config PROVE_LOCKING_SMALL | ||
| 1089 | bool | ||
| 1090 | |||
| 1088 | config LOCKDEP | 1091 | config LOCKDEP |
| 1089 | bool | 1092 | bool |
| 1090 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT | 1093 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT |
diff --git a/lib/debugobjects.c b/lib/debugobjects.c index a8e12601eb37..056052dc8e91 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c | |||
| @@ -362,6 +362,7 @@ void debug_object_init(void *addr, struct debug_obj_descr *descr) | |||
| 362 | 362 | ||
| 363 | __debug_object_init(addr, descr, 0); | 363 | __debug_object_init(addr, descr, 0); |
| 364 | } | 364 | } |
| 365 | EXPORT_SYMBOL_GPL(debug_object_init); | ||
| 365 | 366 | ||
| 366 | /** | 367 | /** |
| 367 | * debug_object_init_on_stack - debug checks when an object on stack is | 368 | * debug_object_init_on_stack - debug checks when an object on stack is |
| @@ -376,6 +377,7 @@ void debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr) | |||
| 376 | 377 | ||
| 377 | __debug_object_init(addr, descr, 1); | 378 | __debug_object_init(addr, descr, 1); |
| 378 | } | 379 | } |
| 380 | EXPORT_SYMBOL_GPL(debug_object_init_on_stack); | ||
| 379 | 381 | ||
| 380 | /** | 382 | /** |
| 381 | * debug_object_activate - debug checks when an object is activated | 383 | * debug_object_activate - debug checks when an object is activated |
| @@ -449,6 +451,7 @@ int debug_object_activate(void *addr, struct debug_obj_descr *descr) | |||
| 449 | } | 451 | } |
| 450 | return 0; | 452 | return 0; |
| 451 | } | 453 | } |
| 454 | EXPORT_SYMBOL_GPL(debug_object_activate); | ||
| 452 | 455 | ||
| 453 | /** | 456 | /** |
| 454 | * debug_object_deactivate - debug checks when an object is deactivated | 457 | * debug_object_deactivate - debug checks when an object is deactivated |
| @@ -496,6 +499,7 @@ void debug_object_deactivate(void *addr, struct debug_obj_descr *descr) | |||
| 496 | 499 | ||
| 497 | raw_spin_unlock_irqrestore(&db->lock, flags); | 500 | raw_spin_unlock_irqrestore(&db->lock, flags); |
| 498 | } | 501 | } |
| 502 | EXPORT_SYMBOL_GPL(debug_object_deactivate); | ||
| 499 | 503 | ||
| 500 | /** | 504 | /** |
| 501 | * debug_object_destroy - debug checks when an object is destroyed | 505 | * debug_object_destroy - debug checks when an object is destroyed |
| @@ -542,6 +546,7 @@ void debug_object_destroy(void *addr, struct debug_obj_descr *descr) | |||
| 542 | out_unlock: | 546 | out_unlock: |
| 543 | raw_spin_unlock_irqrestore(&db->lock, flags); | 547 | raw_spin_unlock_irqrestore(&db->lock, flags); |
| 544 | } | 548 | } |
| 549 | EXPORT_SYMBOL_GPL(debug_object_destroy); | ||
| 545 | 550 | ||
| 546 | /** | 551 | /** |
| 547 | * debug_object_free - debug checks when an object is freed | 552 | * debug_object_free - debug checks when an object is freed |
| @@ -582,6 +587,7 @@ void debug_object_free(void *addr, struct debug_obj_descr *descr) | |||
| 582 | out_unlock: | 587 | out_unlock: |
| 583 | raw_spin_unlock_irqrestore(&db->lock, flags); | 588 | raw_spin_unlock_irqrestore(&db->lock, flags); |
| 584 | } | 589 | } |
| 590 | EXPORT_SYMBOL_GPL(debug_object_free); | ||
| 585 | 591 | ||
| 586 | /** | 592 | /** |
| 587 | * debug_object_assert_init - debug checks when object should be init-ed | 593 | * debug_object_assert_init - debug checks when object should be init-ed |
| @@ -626,6 +632,7 @@ void debug_object_assert_init(void *addr, struct debug_obj_descr *descr) | |||
| 626 | 632 | ||
| 627 | raw_spin_unlock_irqrestore(&db->lock, flags); | 633 | raw_spin_unlock_irqrestore(&db->lock, flags); |
| 628 | } | 634 | } |
| 635 | EXPORT_SYMBOL_GPL(debug_object_assert_init); | ||
| 629 | 636 | ||
| 630 | /** | 637 | /** |
| 631 | * debug_object_active_state - debug checks object usage state machine | 638 | * debug_object_active_state - debug checks object usage state machine |
| @@ -673,6 +680,7 @@ debug_object_active_state(void *addr, struct debug_obj_descr *descr, | |||
| 673 | 680 | ||
| 674 | raw_spin_unlock_irqrestore(&db->lock, flags); | 681 | raw_spin_unlock_irqrestore(&db->lock, flags); |
| 675 | } | 682 | } |
| 683 | EXPORT_SYMBOL_GPL(debug_object_active_state); | ||
| 676 | 684 | ||
| 677 | #ifdef CONFIG_DEBUG_OBJECTS_FREE | 685 | #ifdef CONFIG_DEBUG_OBJECTS_FREE |
| 678 | static void __debug_check_no_obj_freed(const void *address, unsigned long size) | 686 | static void __debug_check_no_obj_freed(const void *address, unsigned long size) |
diff --git a/lib/iov_iter.c b/lib/iov_iter.c index f0c7f1481bae..f2bd21b93dfc 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c | |||
| @@ -683,10 +683,11 @@ static void pipe_advance(struct iov_iter *i, size_t size) | |||
| 683 | struct pipe_inode_info *pipe = i->pipe; | 683 | struct pipe_inode_info *pipe = i->pipe; |
| 684 | struct pipe_buffer *buf; | 684 | struct pipe_buffer *buf; |
| 685 | int idx = i->idx; | 685 | int idx = i->idx; |
| 686 | size_t off = i->iov_offset; | 686 | size_t off = i->iov_offset, orig_sz; |
| 687 | 687 | ||
| 688 | if (unlikely(i->count < size)) | 688 | if (unlikely(i->count < size)) |
| 689 | size = i->count; | 689 | size = i->count; |
| 690 | orig_sz = size; | ||
| 690 | 691 | ||
| 691 | if (size) { | 692 | if (size) { |
| 692 | if (off) /* make it relative to the beginning of buffer */ | 693 | if (off) /* make it relative to the beginning of buffer */ |
| @@ -713,6 +714,7 @@ static void pipe_advance(struct iov_iter *i, size_t size) | |||
| 713 | pipe->nrbufs--; | 714 | pipe->nrbufs--; |
| 714 | } | 715 | } |
| 715 | } | 716 | } |
| 717 | i->count -= orig_sz; | ||
| 716 | } | 718 | } |
| 717 | 719 | ||
| 718 | void iov_iter_advance(struct iov_iter *i, size_t size) | 720 | void iov_iter_advance(struct iov_iter *i, size_t size) |
diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c index 5464c8744ea9..e24388a863a7 100644 --- a/lib/mpi/mpi-pow.c +++ b/lib/mpi/mpi-pow.c | |||
| @@ -64,8 +64,13 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) | |||
| 64 | if (!esize) { | 64 | if (!esize) { |
| 65 | /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 | 65 | /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 |
| 66 | * depending on if MOD equals 1. */ | 66 | * depending on if MOD equals 1. */ |
| 67 | rp[0] = 1; | ||
| 68 | res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; | 67 | res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; |
| 68 | if (res->nlimbs) { | ||
| 69 | if (mpi_resize(res, 1) < 0) | ||
| 70 | goto enomem; | ||
| 71 | rp = res->d; | ||
| 72 | rp[0] = 1; | ||
| 73 | } | ||
| 69 | res->sign = 0; | 74 | res->sign = 0; |
| 70 | goto leave; | 75 | goto leave; |
| 71 | } | 76 | } |
diff --git a/lib/stackdepot.c b/lib/stackdepot.c index 4d830e299989..f87d138e9672 100644 --- a/lib/stackdepot.c +++ b/lib/stackdepot.c | |||
| @@ -192,6 +192,7 @@ void depot_fetch_stack(depot_stack_handle_t handle, struct stack_trace *trace) | |||
| 192 | trace->entries = stack->entries; | 192 | trace->entries = stack->entries; |
| 193 | trace->skip = 0; | 193 | trace->skip = 0; |
| 194 | } | 194 | } |
| 195 | EXPORT_SYMBOL_GPL(depot_fetch_stack); | ||
| 195 | 196 | ||
| 196 | /** | 197 | /** |
| 197 | * depot_save_stack - save stack in a stack depot. | 198 | * depot_save_stack - save stack in a stack depot. |
| @@ -283,3 +284,4 @@ exit: | |||
| 283 | fast_exit: | 284 | fast_exit: |
| 284 | return retval; | 285 | return retval; |
| 285 | } | 286 | } |
| 287 | EXPORT_SYMBOL_GPL(depot_save_stack); | ||
diff --git a/lib/test_kasan.c b/lib/test_kasan.c index 5e51872b3fc1..fbdf87920093 100644 --- a/lib/test_kasan.c +++ b/lib/test_kasan.c | |||
| @@ -20,6 +20,11 @@ | |||
| 20 | #include <linux/uaccess.h> | 20 | #include <linux/uaccess.h> |
| 21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
| 22 | 22 | ||
| 23 | /* | ||
| 24 | * Note: test functions are marked noinline so that their names appear in | ||
| 25 | * reports. | ||
| 26 | */ | ||
| 27 | |||
| 23 | static noinline void __init kmalloc_oob_right(void) | 28 | static noinline void __init kmalloc_oob_right(void) |
| 24 | { | 29 | { |
| 25 | char *ptr; | 30 | char *ptr; |
| @@ -411,6 +416,29 @@ static noinline void __init copy_user_test(void) | |||
| 411 | kfree(kmem); | 416 | kfree(kmem); |
| 412 | } | 417 | } |
| 413 | 418 | ||
| 419 | static noinline void __init use_after_scope_test(void) | ||
| 420 | { | ||
| 421 | volatile char *volatile p; | ||
| 422 | |||
| 423 | pr_info("use-after-scope on int\n"); | ||
| 424 | { | ||
| 425 | int local = 0; | ||
| 426 | |||
| 427 | p = (char *)&local; | ||
| 428 | } | ||
| 429 | p[0] = 1; | ||
| 430 | p[3] = 1; | ||
| 431 | |||
| 432 | pr_info("use-after-scope on array\n"); | ||
| 433 | { | ||
| 434 | char local[1024] = {0}; | ||
| 435 | |||
| 436 | p = local; | ||
| 437 | } | ||
| 438 | p[0] = 1; | ||
| 439 | p[1023] = 1; | ||
| 440 | } | ||
| 441 | |||
| 414 | static int __init kmalloc_tests_init(void) | 442 | static int __init kmalloc_tests_init(void) |
| 415 | { | 443 | { |
| 416 | kmalloc_oob_right(); | 444 | kmalloc_oob_right(); |
| @@ -436,6 +464,7 @@ static int __init kmalloc_tests_init(void) | |||
| 436 | kasan_global_oob(); | 464 | kasan_global_oob(); |
| 437 | ksize_unpoisons_memory(); | 465 | ksize_unpoisons_memory(); |
| 438 | copy_user_test(); | 466 | copy_user_test(); |
| 467 | use_after_scope_test(); | ||
| 439 | return -EAGAIN; | 468 | return -EAGAIN; |
| 440 | } | 469 | } |
| 441 | 470 | ||
