| 1792 | } |
| 1793 | |
| 1794 | int |
| 1795 | sys_rctl_get_limits(struct thread *td, struct rctl_get_limits_args *uap) |
| 1796 | { |
| 1797 | struct sbuf *sb; |
| 1798 | struct rctl_rule *filter; |
| 1799 | struct rctl_rule_link *link; |
| 1800 | char *inputstr, *buf; |
| 1801 | size_t bufsize; |
| 1802 | int error; |
| 1803 | |
| 1804 | if (!racct_enable) |
| 1805 | return (ENOSYS); |
| 1806 | |
| 1807 | error = priv_check(td, PRIV_RCTL_GET_LIMITS); |
| 1808 | if (error != 0) |
| 1809 | return (error); |
| 1810 | |
| 1811 | error = rctl_read_inbuf(&inputstr, uap->inbufp, uap->inbuflen); |
| 1812 | if (error != 0) |
| 1813 | return (error); |
| 1814 | |
| 1815 | sx_slock(&allproc_lock); |
| 1816 | error = rctl_string_to_rule(inputstr, &filter); |
| 1817 | free(inputstr, M_RCTL); |
| 1818 | if (error != 0) { |
| 1819 | sx_sunlock(&allproc_lock); |
| 1820 | return (error); |
| 1821 | } |
| 1822 | |
| 1823 | if (filter->rr_subject_type == RCTL_SUBJECT_TYPE_UNDEFINED) { |
| 1824 | rctl_rule_release(filter); |
| 1825 | sx_sunlock(&allproc_lock); |
| 1826 | return (EINVAL); |
| 1827 | } |
| 1828 | if (filter->rr_subject_type != RCTL_SUBJECT_TYPE_PROCESS) { |
| 1829 | rctl_rule_release(filter); |
| 1830 | sx_sunlock(&allproc_lock); |
| 1831 | return (EOPNOTSUPP); |
| 1832 | } |
| 1833 | if (filter->rr_subject.rs_proc == NULL) { |
| 1834 | rctl_rule_release(filter); |
| 1835 | sx_sunlock(&allproc_lock); |
| 1836 | return (EINVAL); |
| 1837 | } |
| 1838 | |
| 1839 | bufsize = uap->outbuflen; |
| 1840 | if (bufsize > rctl_maxbufsize) { |
| 1841 | rctl_rule_release(filter); |
| 1842 | sx_sunlock(&allproc_lock); |
| 1843 | return (E2BIG); |
| 1844 | } |
| 1845 | |
| 1846 | buf = malloc(bufsize, M_RCTL, M_WAITOK); |
| 1847 | sb = sbuf_new(NULL, buf, bufsize, SBUF_FIXEDLEN); |
| 1848 | KASSERT(sb != NULL, ("sbuf_new failed")); |
| 1849 | |
| 1850 | RACCT_LOCK(); |
| 1851 | LIST_FOREACH(link, &filter->rr_subject.rs_proc->p_racct->r_rule_links, |
nothing calls this directly
no test coverage detected