signal.c (bdfa75ad70e93633e18b1ed2b3866c01aa9bf9d2) | signal.c (1bdda24c4af64cd2d65dec5192ab624c5fee7ca0) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/kernel/signal.c 4 * 5 * Copyright (C) 1991, 1992 Linus Torvalds 6 * 7 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson 8 * --- 412 unchanged lines hidden (view full) --- 421 * callers hold rcu read lock. 422 * 423 * NOTE! A pending signal will hold on to the user refcount, 424 * and we get/put the refcount only when the sigpending count 425 * changes from/to zero. 426 */ 427 rcu_read_lock(); 428 ucounts = task_ucounts(t); | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/kernel/signal.c 4 * 5 * Copyright (C) 1991, 1992 Linus Torvalds 6 * 7 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson 8 * --- 412 unchanged lines hidden (view full) --- 421 * callers hold rcu read lock. 422 * 423 * NOTE! A pending signal will hold on to the user refcount, 424 * and we get/put the refcount only when the sigpending count 425 * changes from/to zero. 426 */ 427 rcu_read_lock(); 428 ucounts = task_ucounts(t); |
429 sigpending = inc_rlimit_get_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING); 430 rcu_read_unlock(); 431 if (!sigpending) | 429 sigpending = inc_rlimit_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING, 1); 430 switch (sigpending) { 431 case 1: 432 if (likely(get_ucounts(ucounts))) 433 break; 434 fallthrough; 435 case LONG_MAX: 436 /* 437 * we need to decrease the ucount in the userns tree on any 438 * failure to avoid counts leaking. 439 */ 440 dec_rlimit_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING, 1); 441 rcu_read_unlock(); |
432 return NULL; | 442 return NULL; |
443 } 444 rcu_read_unlock(); |
|
433 434 if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { 435 q = kmem_cache_alloc(sigqueue_cachep, gfp_flags); 436 } else { 437 print_dropped_signal(sig); 438 } 439 440 if (unlikely(q == NULL)) { | 445 446 if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { 447 q = kmem_cache_alloc(sigqueue_cachep, gfp_flags); 448 } else { 449 print_dropped_signal(sig); 450 } 451 452 if (unlikely(q == NULL)) { |
441 dec_rlimit_put_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING); | 453 if (dec_rlimit_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING, 1)) 454 put_ucounts(ucounts); |
442 } else { 443 INIT_LIST_HEAD(&q->list); 444 q->flags = sigqueue_flags; 445 q->ucounts = ucounts; 446 } 447 return q; 448} 449 450static void __sigqueue_free(struct sigqueue *q) 451{ 452 if (q->flags & SIGQUEUE_PREALLOC) 453 return; | 455 } else { 456 INIT_LIST_HEAD(&q->list); 457 q->flags = sigqueue_flags; 458 q->ucounts = ucounts; 459 } 460 return q; 461} 462 463static void __sigqueue_free(struct sigqueue *q) 464{ 465 if (q->flags & SIGQUEUE_PREALLOC) 466 return; |
454 if (q->ucounts) { 455 dec_rlimit_put_ucounts(q->ucounts, UCOUNT_RLIMIT_SIGPENDING); | 467 if (q->ucounts && dec_rlimit_ucounts(q->ucounts, UCOUNT_RLIMIT_SIGPENDING, 1)) { 468 put_ucounts(q->ucounts); |
456 q->ucounts = NULL; 457 } 458 kmem_cache_free(sigqueue_cachep, q); 459} 460 461void flush_sigqueue(struct sigpending *queue) 462{ 463 struct sigqueue *q; --- 3669 unchanged lines hidden (view full) --- 4133 flush_sigqueue_mask(&mask, &t->pending); 4134 } 4135 } 4136 4137 spin_unlock_irq(&p->sighand->siglock); 4138 return 0; 4139} 4140 | 469 q->ucounts = NULL; 470 } 471 kmem_cache_free(sigqueue_cachep, q); 472} 473 474void flush_sigqueue(struct sigpending *queue) 475{ 476 struct sigqueue *q; --- 3669 unchanged lines hidden (view full) --- 4146 flush_sigqueue_mask(&mask, &t->pending); 4147 } 4148 } 4149 4150 spin_unlock_irq(&p->sighand->siglock); 4151 return 0; 4152} 4153 |
4154#ifdef CONFIG_DYNAMIC_SIGFRAME 4155static inline void sigaltstack_lock(void) 4156 __acquires(¤t->sighand->siglock) 4157{ 4158 spin_lock_irq(¤t->sighand->siglock); 4159} 4160 4161static inline void sigaltstack_unlock(void) 4162 __releases(¤t->sighand->siglock) 4163{ 4164 spin_unlock_irq(¤t->sighand->siglock); 4165} 4166#else 4167static inline void sigaltstack_lock(void) { } 4168static inline void sigaltstack_unlock(void) { } 4169#endif 4170 |
|
4141static int 4142do_sigaltstack (const stack_t *ss, stack_t *oss, unsigned long sp, 4143 size_t min_ss_size) 4144{ 4145 struct task_struct *t = current; | 4171static int 4172do_sigaltstack (const stack_t *ss, stack_t *oss, unsigned long sp, 4173 size_t min_ss_size) 4174{ 4175 struct task_struct *t = current; |
4176 int ret = 0; |
|
4146 4147 if (oss) { 4148 memset(oss, 0, sizeof(stack_t)); 4149 oss->ss_sp = (void __user *) t->sas_ss_sp; 4150 oss->ss_size = t->sas_ss_size; 4151 oss->ss_flags = sas_ss_flags(sp) | 4152 (current->sas_ss_flags & SS_FLAG_BITS); 4153 } --- 7 unchanged lines hidden (view full) --- 4161 if (unlikely(on_sig_stack(sp))) 4162 return -EPERM; 4163 4164 ss_mode = ss_flags & ~SS_FLAG_BITS; 4165 if (unlikely(ss_mode != SS_DISABLE && ss_mode != SS_ONSTACK && 4166 ss_mode != 0)) 4167 return -EINVAL; 4168 | 4177 4178 if (oss) { 4179 memset(oss, 0, sizeof(stack_t)); 4180 oss->ss_sp = (void __user *) t->sas_ss_sp; 4181 oss->ss_size = t->sas_ss_size; 4182 oss->ss_flags = sas_ss_flags(sp) | 4183 (current->sas_ss_flags & SS_FLAG_BITS); 4184 } --- 7 unchanged lines hidden (view full) --- 4192 if (unlikely(on_sig_stack(sp))) 4193 return -EPERM; 4194 4195 ss_mode = ss_flags & ~SS_FLAG_BITS; 4196 if (unlikely(ss_mode != SS_DISABLE && ss_mode != SS_ONSTACK && 4197 ss_mode != 0)) 4198 return -EINVAL; 4199 |
4200 sigaltstack_lock(); |
|
4169 if (ss_mode == SS_DISABLE) { 4170 ss_size = 0; 4171 ss_sp = NULL; 4172 } else { 4173 if (unlikely(ss_size < min_ss_size)) | 4201 if (ss_mode == SS_DISABLE) { 4202 ss_size = 0; 4203 ss_sp = NULL; 4204 } else { 4205 if (unlikely(ss_size < min_ss_size)) |
4174 return -ENOMEM; | 4206 ret = -ENOMEM; 4207 if (!sigaltstack_size_valid(ss_size)) 4208 ret = -ENOMEM; |
4175 } | 4209 } |
4176 4177 t->sas_ss_sp = (unsigned long) ss_sp; 4178 t->sas_ss_size = ss_size; 4179 t->sas_ss_flags = ss_flags; | 4210 if (!ret) { 4211 t->sas_ss_sp = (unsigned long) ss_sp; 4212 t->sas_ss_size = ss_size; 4213 t->sas_ss_flags = ss_flags; 4214 } 4215 sigaltstack_unlock(); |
4180 } | 4216 } |
4181 return 0; | 4217 return ret; |
4182} 4183 4184SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss) 4185{ 4186 stack_t new, old; 4187 int err; 4188 if (uss && copy_from_user(&new, uss, sizeof(stack_t))) 4189 return -EFAULT; --- 568 unchanged lines hidden --- | 4218} 4219 4220SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss) 4221{ 4222 stack_t new, old; 4223 int err; 4224 if (uss && copy_from_user(&new, uss, sizeof(stack_t))) 4225 return -EFAULT; --- 568 unchanged lines hidden --- |