| 556 | } |
| 557 | |
| 558 | int |
| 559 | mac_getsockopt_label(struct ucred *cred, struct socket *so, struct mac *mac) |
| 560 | { |
| 561 | char *buffer, *elements; |
| 562 | struct label *intlabel; |
| 563 | int error; |
| 564 | |
| 565 | if (!(mac_labeled & MPC_OBJECT_SOCKET)) |
| 566 | return (EINVAL); |
| 567 | |
| 568 | error = mac_check_structmac_consistent(mac); |
| 569 | if (error) |
| 570 | return (error); |
| 571 | |
| 572 | elements = malloc(mac->m_buflen, M_MACTEMP, M_WAITOK); |
| 573 | error = copyinstr(mac->m_string, elements, mac->m_buflen, NULL); |
| 574 | if (error) { |
| 575 | free(elements, M_MACTEMP); |
| 576 | return (error); |
| 577 | } |
| 578 | |
| 579 | buffer = malloc(mac->m_buflen, M_MACTEMP, M_WAITOK | M_ZERO); |
| 580 | intlabel = mac_socket_label_alloc(M_WAITOK); |
| 581 | SOCK_LOCK(so); |
| 582 | mac_socket_copy_label(so->so_label, intlabel); |
| 583 | SOCK_UNLOCK(so); |
| 584 | error = mac_socket_externalize_label(intlabel, elements, buffer, |
| 585 | mac->m_buflen); |
| 586 | mac_socket_label_free(intlabel); |
| 587 | if (error == 0) |
| 588 | error = copyout(buffer, mac->m_string, strlen(buffer)+1); |
| 589 | |
| 590 | free(buffer, M_MACTEMP); |
| 591 | free(elements, M_MACTEMP); |
| 592 | |
| 593 | return (error); |
| 594 | } |
| 595 | |
| 596 | int |
| 597 | mac_getsockopt_peerlabel(struct ucred *cred, struct socket *so, |
no test coverage detected