diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/debugobjects.c | 8 | ||||
-rw-r--r-- | lib/mpi/mpi-pow.c | 7 | ||||
-rw-r--r-- | lib/test_kasan.c | 29 |
3 files changed, 43 insertions, 1 deletions
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/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/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 | ||