| 521 | } |
| 522 | |
| 523 | static int |
| 524 | stackgap_ctl(struct thread *td, struct proc *p, int state) |
| 525 | { |
| 526 | PROC_LOCK_ASSERT(p, MA_OWNED); |
| 527 | |
| 528 | if ((state & ~(PROC_STACKGAP_ENABLE | PROC_STACKGAP_DISABLE | |
| 529 | PROC_STACKGAP_ENABLE_EXEC | PROC_STACKGAP_DISABLE_EXEC)) != 0) |
| 530 | return (EINVAL); |
| 531 | switch (state & (PROC_STACKGAP_ENABLE | PROC_STACKGAP_DISABLE)) { |
| 532 | case PROC_STACKGAP_ENABLE: |
| 533 | if ((p->p_flag2 & P2_STKGAP_DISABLE) != 0) |
| 534 | return (EINVAL); |
| 535 | break; |
| 536 | case PROC_STACKGAP_DISABLE: |
| 537 | p->p_flag2 |= P2_STKGAP_DISABLE; |
| 538 | break; |
| 539 | case 0: |
| 540 | break; |
| 541 | default: |
| 542 | return (EINVAL); |
| 543 | } |
| 544 | switch (state & (PROC_STACKGAP_ENABLE_EXEC | |
| 545 | PROC_STACKGAP_DISABLE_EXEC)) { |
| 546 | case PROC_STACKGAP_ENABLE_EXEC: |
| 547 | p->p_flag2 &= ~P2_STKGAP_DISABLE_EXEC; |
| 548 | break; |
| 549 | case PROC_STACKGAP_DISABLE_EXEC: |
| 550 | p->p_flag2 |= P2_STKGAP_DISABLE_EXEC; |
| 551 | break; |
| 552 | case 0: |
| 553 | break; |
| 554 | default: |
| 555 | return (EINVAL); |
| 556 | } |
| 557 | return (0); |
| 558 | } |
| 559 | |
| 560 | static int |
| 561 | stackgap_status(struct thread *td, struct proc *p, int *data) |
no outgoing calls
no test coverage detected