diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 6d2089a1bce7..3b25b182d2be 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -371,6 +371,12 @@ static inline void close_files(struct files_struct * files) | |||
| 371 | struct fdtable *fdt; | 371 | struct fdtable *fdt; |
| 372 | 372 | ||
| 373 | j = 0; | 373 | j = 0; |
| 374 | |||
| 375 | /* | ||
| 376 | * It is safe to dereference the fd table without RCU or | ||
| 377 | * ->file_lock because this is the last reference to the | ||
| 378 | * files structure. | ||
| 379 | */ | ||
| 374 | fdt = files_fdtable(files); | 380 | fdt = files_fdtable(files); |
| 375 | for (;;) { | 381 | for (;;) { |
| 376 | unsigned long set; | 382 | unsigned long set; |
| @@ -837,6 +843,7 @@ fastcall NORET_TYPE void do_exit(long code) | |||
| 837 | group_dead = atomic_dec_and_test(&tsk->signal->live); | 843 | group_dead = atomic_dec_and_test(&tsk->signal->live); |
| 838 | if (group_dead) { | 844 | if (group_dead) { |
| 839 | del_timer_sync(&tsk->signal->real_timer); | 845 | del_timer_sync(&tsk->signal->real_timer); |
| 846 | exit_itimers(tsk->signal); | ||
| 840 | acct_process(code); | 847 | acct_process(code); |
| 841 | } | 848 | } |
| 842 | exit_mm(tsk); | 849 | exit_mm(tsk); |
| @@ -1197,7 +1204,7 @@ static int wait_task_stopped(task_t *p, int delayed_group_leader, int noreap, | |||
| 1197 | 1204 | ||
| 1198 | exit_code = p->exit_code; | 1205 | exit_code = p->exit_code; |
| 1199 | if (unlikely(!exit_code) || | 1206 | if (unlikely(!exit_code) || |
| 1200 | unlikely(p->state > TASK_STOPPED)) | 1207 | unlikely(p->state & TASK_TRACED)) |
| 1201 | goto bail_ref; | 1208 | goto bail_ref; |
| 1202 | return wait_noreap_copyout(p, pid, uid, | 1209 | return wait_noreap_copyout(p, pid, uid, |
| 1203 | why, (exit_code << 8) | 0x7f, | 1210 | why, (exit_code << 8) | 0x7f, |
