diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 05c813dc9ecc..47b4e4f379f9 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -69,6 +69,7 @@ | |||
69 | #include <linux/oom.h> | 69 | #include <linux/oom.h> |
70 | #include <linux/khugepaged.h> | 70 | #include <linux/khugepaged.h> |
71 | #include <linux/signalfd.h> | 71 | #include <linux/signalfd.h> |
72 | #include <linux/uprobes.h> | ||
72 | 73 | ||
73 | #include <asm/pgtable.h> | 74 | #include <asm/pgtable.h> |
74 | #include <asm/pgalloc.h> | 75 | #include <asm/pgalloc.h> |
@@ -451,6 +452,9 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
451 | 452 | ||
452 | if (retval) | 453 | if (retval) |
453 | goto out; | 454 | goto out; |
455 | |||
456 | if (file && uprobe_mmap(tmp)) | ||
457 | goto out; | ||
454 | } | 458 | } |
455 | /* a new mm has just been created */ | 459 | /* a new mm has just been created */ |
456 | arch_dup_mmap(oldmm, mm); | 460 | arch_dup_mmap(oldmm, mm); |
@@ -599,6 +603,7 @@ void mmput(struct mm_struct *mm) | |||
599 | might_sleep(); | 603 | might_sleep(); |
600 | 604 | ||
601 | if (atomic_dec_and_test(&mm->mm_users)) { | 605 | if (atomic_dec_and_test(&mm->mm_users)) { |
606 | uprobe_clear_state(mm); | ||
602 | exit_aio(mm); | 607 | exit_aio(mm); |
603 | ksm_exit(mm); | 608 | ksm_exit(mm); |
604 | khugepaged_exit(mm); /* must run before exit_mmap */ | 609 | khugepaged_exit(mm); /* must run before exit_mmap */ |
@@ -777,6 +782,8 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
777 | exit_pi_state_list(tsk); | 782 | exit_pi_state_list(tsk); |
778 | #endif | 783 | #endif |
779 | 784 | ||
785 | uprobe_free_utask(tsk); | ||
786 | |||
780 | /* Get rid of any cached register state */ | 787 | /* Get rid of any cached register state */ |
781 | deactivate_mm(tsk, mm); | 788 | deactivate_mm(tsk, mm); |
782 | 789 | ||
@@ -831,6 +838,7 @@ struct mm_struct *dup_mm(struct task_struct *tsk) | |||
831 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 838 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
832 | mm->pmd_huge_pte = NULL; | 839 | mm->pmd_huge_pte = NULL; |
833 | #endif | 840 | #endif |
841 | uprobe_reset_state(mm); | ||
834 | 842 | ||
835 | if (!mm_init(mm, tsk)) | 843 | if (!mm_init(mm, tsk)) |
836 | goto fail_nomem; | 844 | goto fail_nomem; |
@@ -1373,6 +1381,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1373 | INIT_LIST_HEAD(&p->pi_state_list); | 1381 | INIT_LIST_HEAD(&p->pi_state_list); |
1374 | p->pi_state_cache = NULL; | 1382 | p->pi_state_cache = NULL; |
1375 | #endif | 1383 | #endif |
1384 | uprobe_copy_process(p); | ||
1376 | /* | 1385 | /* |
1377 | * sigaltstack should be cleared when sharing the same VM | 1386 | * sigaltstack should be cleared when sharing the same VM |
1378 | */ | 1387 | */ |