diff options
| -rw-r--r-- | include/linux/audit.h | 2 | ||||
| -rw-r--r-- | net/netlabel/netlabel_unlabeled.c | 207 |
2 files changed, 195 insertions, 14 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h index c68781692838..bdd6f5de5fc4 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -115,6 +115,8 @@ | |||
| 115 | #define AUDIT_MAC_IPSEC_ADDSPD 1413 /* Not used */ | 115 | #define AUDIT_MAC_IPSEC_ADDSPD 1413 /* Not used */ |
| 116 | #define AUDIT_MAC_IPSEC_DELSPD 1414 /* Not used */ | 116 | #define AUDIT_MAC_IPSEC_DELSPD 1414 /* Not used */ |
| 117 | #define AUDIT_MAC_IPSEC_EVENT 1415 /* Audit an IPSec event */ | 117 | #define AUDIT_MAC_IPSEC_EVENT 1415 /* Audit an IPSec event */ |
| 118 | #define AUDIT_MAC_UNLBL_STCADD 1416 /* NetLabel: add a static label */ | ||
| 119 | #define AUDIT_MAC_UNLBL_STCDEL 1417 /* NetLabel: del a static label */ | ||
| 118 | 120 | ||
| 119 | #define AUDIT_FIRST_KERN_ANOM_MSG 1700 | 121 | #define AUDIT_FIRST_KERN_ANOM_MSG 1700 |
| 120 | #define AUDIT_LAST_KERN_ANOM_MSG 1799 | 122 | #define AUDIT_LAST_KERN_ANOM_MSG 1799 |
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index d0c628c875ae..42e81fd8cc49 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
| @@ -147,6 +147,74 @@ static const struct nla_policy netlbl_unlabel_genl_policy[NLBL_UNLABEL_A_MAX + 1 | |||
| 147 | }; | 147 | }; |
| 148 | 148 | ||
| 149 | /* | 149 | /* |
| 150 | * Audit Helper Functions | ||
| 151 | */ | ||
| 152 | |||
| 153 | /** | ||
| 154 | * netlbl_unlabel_audit_addr4 - Audit an IPv4 address | ||
| 155 | * @audit_buf: audit buffer | ||
| 156 | * @dev: network interface | ||
| 157 | * @addr: IP address | ||
| 158 | * @mask: IP address mask | ||
| 159 | * | ||
| 160 | * Description: | ||
| 161 | * Write the IPv4 address and address mask, if necessary, to @audit_buf. | ||
| 162 | * | ||
| 163 | */ | ||
| 164 | static void netlbl_unlabel_audit_addr4(struct audit_buffer *audit_buf, | ||
| 165 | const char *dev, | ||
| 166 | __be32 addr, __be32 mask) | ||
| 167 | { | ||
| 168 | u32 mask_val = ntohl(mask); | ||
| 169 | |||
| 170 | if (dev != NULL) | ||
| 171 | audit_log_format(audit_buf, " netif=%s", dev); | ||
| 172 | audit_log_format(audit_buf, " src=" NIPQUAD_FMT, NIPQUAD(addr)); | ||
| 173 | if (mask_val != 0xffffffff) { | ||
| 174 | u32 mask_len = 0; | ||
| 175 | while (mask_val > 0) { | ||
| 176 | mask_val <<= 1; | ||
| 177 | mask_len++; | ||
| 178 | } | ||
| 179 | audit_log_format(audit_buf, " src_prefixlen=%d", mask_len); | ||
| 180 | } | ||
| 181 | } | ||
| 182 | |||
| 183 | /** | ||
| 184 | * netlbl_unlabel_audit_addr6 - Audit an IPv6 address | ||
| 185 | * @audit_buf: audit buffer | ||
| 186 | * @dev: network interface | ||
| 187 | * @addr: IP address | ||
| 188 | * @mask: IP address mask | ||
| 189 | * | ||
| 190 | * Description: | ||
| 191 | * Write the IPv6 address and address mask, if necessary, to @audit_buf. | ||
| 192 | * | ||
| 193 | */ | ||
| 194 | static void netlbl_unlabel_audit_addr6(struct audit_buffer *audit_buf, | ||
| 195 | const char *dev, | ||
| 196 | const struct in6_addr *addr, | ||
| 197 | const struct in6_addr *mask) | ||
| 198 | { | ||
| 199 | if (dev != NULL) | ||
| 200 | audit_log_format(audit_buf, " netif=%s", dev); | ||
| 201 | audit_log_format(audit_buf, " src=" NIP6_FMT, NIP6(*addr)); | ||
| 202 | if (ntohl(mask->s6_addr32[3]) != 0xffffffff) { | ||
| 203 | u32 mask_len = 0; | ||
| 204 | u32 mask_val; | ||
| 205 | int iter = -1; | ||
| 206 | while (ntohl(mask->s6_addr32[++iter]) == 0xffffffff) | ||
| 207 | mask_len += 32; | ||
| 208 | mask_val = ntohl(mask->s6_addr32[iter]); | ||
| 209 | while (mask_val > 0) { | ||
| 210 | mask_val <<= 1; | ||
| 211 | mask_len++; | ||
| 212 | } | ||
| 213 | audit_log_format(audit_buf, " src_prefixlen=%d", mask_len); | ||
| 214 | } | ||
| 215 | } | ||
| 216 | |||
| 217 | /* | ||
| 150 | * Unlabeled Connection Hash Table Functions | 218 | * Unlabeled Connection Hash Table Functions |
| 151 | */ | 219 | */ |
| 152 | 220 | ||
| @@ -530,6 +598,7 @@ add_iface_failure: | |||
| 530 | * @mask: address mask in network byte order | 598 | * @mask: address mask in network byte order |
| 531 | * @addr_len: length of address/mask (4 for IPv4, 16 for IPv6) | 599 | * @addr_len: length of address/mask (4 for IPv4, 16 for IPv6) |
| 532 | * @secid: LSM secid value for the entry | 600 | * @secid: LSM secid value for the entry |
| 601 | * @audit_info: NetLabel audit information | ||
| 533 | * | 602 | * |
| 534 | * Description: | 603 | * Description: |
| 535 | * Adds a new entry to the unlabeled connection hash table. Returns zero on | 604 | * Adds a new entry to the unlabeled connection hash table. Returns zero on |
| @@ -541,12 +610,18 @@ static int netlbl_unlhsh_add(struct net *net, | |||
| 541 | const void *addr, | 610 | const void *addr, |
| 542 | const void *mask, | 611 | const void *mask, |
| 543 | u32 addr_len, | 612 | u32 addr_len, |
| 544 | u32 secid) | 613 | u32 secid, |
| 614 | struct netlbl_audit *audit_info) | ||
| 545 | { | 615 | { |
| 546 | int ret_val; | 616 | int ret_val; |
| 547 | int ifindex; | 617 | int ifindex; |
| 548 | struct net_device *dev; | 618 | struct net_device *dev; |
| 549 | struct netlbl_unlhsh_iface *iface; | 619 | struct netlbl_unlhsh_iface *iface; |
| 620 | struct in_addr *addr4, *mask4; | ||
| 621 | struct in6_addr *addr6, *mask6; | ||
| 622 | struct audit_buffer *audit_buf = NULL; | ||
| 623 | char *secctx = NULL; | ||
| 624 | u32 secctx_len; | ||
| 550 | 625 | ||
| 551 | if (addr_len != sizeof(struct in_addr) && | 626 | if (addr_len != sizeof(struct in_addr) && |
| 552 | addr_len != sizeof(struct in6_addr)) | 627 | addr_len != sizeof(struct in6_addr)) |
| @@ -573,13 +648,28 @@ static int netlbl_unlhsh_add(struct net *net, | |||
| 573 | goto unlhsh_add_return; | 648 | goto unlhsh_add_return; |
| 574 | } | 649 | } |
| 575 | } | 650 | } |
| 651 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCADD, | ||
| 652 | audit_info); | ||
| 576 | switch (addr_len) { | 653 | switch (addr_len) { |
| 577 | case sizeof(struct in_addr): | 654 | case sizeof(struct in_addr): |
| 578 | ret_val = netlbl_unlhsh_add_addr4(iface, addr, mask, secid); | 655 | addr4 = (struct in_addr *)addr; |
| 656 | mask4 = (struct in_addr *)mask; | ||
| 657 | ret_val = netlbl_unlhsh_add_addr4(iface, addr4, mask4, secid); | ||
| 658 | if (audit_buf != NULL) | ||
| 659 | netlbl_unlabel_audit_addr4(audit_buf, | ||
| 660 | dev_name, | ||
| 661 | addr4->s_addr, | ||
| 662 | mask4->s_addr); | ||
| 579 | break; | 663 | break; |
| 580 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 664 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 581 | case sizeof(struct in6_addr): | 665 | case sizeof(struct in6_addr): |
| 582 | ret_val = netlbl_unlhsh_add_addr6(iface, addr, mask, secid); | 666 | addr6 = (struct in6_addr *)addr; |
| 667 | mask6 = (struct in6_addr *)mask; | ||
| 668 | ret_val = netlbl_unlhsh_add_addr6(iface, addr6, mask6, secid); | ||
| 669 | if (audit_buf != NULL) | ||
| 670 | netlbl_unlabel_audit_addr6(audit_buf, | ||
| 671 | dev_name, | ||
| 672 | addr6, mask6); | ||
| 583 | break; | 673 | break; |
| 584 | #endif /* IPv6 */ | 674 | #endif /* IPv6 */ |
| 585 | default: | 675 | default: |
| @@ -590,14 +680,26 @@ static int netlbl_unlhsh_add(struct net *net, | |||
| 590 | 680 | ||
| 591 | unlhsh_add_return: | 681 | unlhsh_add_return: |
| 592 | rcu_read_unlock(); | 682 | rcu_read_unlock(); |
| 683 | if (audit_buf != NULL) { | ||
| 684 | if (security_secid_to_secctx(secid, | ||
| 685 | &secctx, | ||
| 686 | &secctx_len) == 0) { | ||
| 687 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | ||
| 688 | security_release_secctx(secctx, secctx_len); | ||
| 689 | } | ||
| 690 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | ||
| 691 | audit_log_end(audit_buf); | ||
| 692 | } | ||
| 593 | return ret_val; | 693 | return ret_val; |
| 594 | } | 694 | } |
| 595 | 695 | ||
| 596 | /** | 696 | /** |
| 597 | * netlbl_unlhsh_remove_addr4 - Remove an IPv4 address entry | 697 | * netlbl_unlhsh_remove_addr4 - Remove an IPv4 address entry |
| 698 | * @net: network namespace | ||
| 598 | * @iface: interface entry | 699 | * @iface: interface entry |
| 599 | * @addr: IP address | 700 | * @addr: IP address |
| 600 | * @mask: IP address mask | 701 | * @mask: IP address mask |
| 702 | * @audit_info: NetLabel audit information | ||
| 601 | * | 703 | * |
| 602 | * Description: | 704 | * Description: |
| 603 | * Remove an IP address entry from the unlabeled connection hash table. | 705 | * Remove an IP address entry from the unlabeled connection hash table. |
| @@ -605,12 +707,18 @@ unlhsh_add_return: | |||
| 605 | * responsible for calling the rcu_read_[un]lock() functions. | 707 | * responsible for calling the rcu_read_[un]lock() functions. |
| 606 | * | 708 | * |
| 607 | */ | 709 | */ |
| 608 | static int netlbl_unlhsh_remove_addr4(struct netlbl_unlhsh_iface *iface, | 710 | static int netlbl_unlhsh_remove_addr4(struct net *net, |
| 711 | struct netlbl_unlhsh_iface *iface, | ||
| 609 | const struct in_addr *addr, | 712 | const struct in_addr *addr, |
| 610 | const struct in_addr *mask) | 713 | const struct in_addr *mask, |
| 714 | struct netlbl_audit *audit_info) | ||
| 611 | { | 715 | { |
| 612 | int ret_val = -ENOENT; | 716 | int ret_val = -ENOENT; |
| 613 | struct netlbl_unlhsh_addr4 *entry; | 717 | struct netlbl_unlhsh_addr4 *entry; |
| 718 | struct audit_buffer *audit_buf = NULL; | ||
| 719 | struct net_device *dev; | ||
| 720 | char *secctx = NULL; | ||
| 721 | u32 secctx_len; | ||
| 614 | 722 | ||
| 615 | spin_lock(&netlbl_unlhsh_lock); | 723 | spin_lock(&netlbl_unlhsh_lock); |
| 616 | entry = netlbl_unlhsh_search_addr4(addr->s_addr, iface); | 724 | entry = netlbl_unlhsh_search_addr4(addr->s_addr, iface); |
| @@ -622,6 +730,25 @@ static int netlbl_unlhsh_remove_addr4(struct netlbl_unlhsh_iface *iface, | |||
| 622 | } | 730 | } |
| 623 | spin_unlock(&netlbl_unlhsh_lock); | 731 | spin_unlock(&netlbl_unlhsh_lock); |
| 624 | 732 | ||
| 733 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, | ||
| 734 | audit_info); | ||
| 735 | if (audit_buf != NULL) { | ||
| 736 | dev = dev_get_by_index(net, iface->ifindex); | ||
| 737 | netlbl_unlabel_audit_addr4(audit_buf, | ||
| 738 | (dev != NULL ? dev->name : NULL), | ||
| 739 | entry->addr, entry->mask); | ||
| 740 | if (dev != NULL) | ||
| 741 | dev_put(dev); | ||
| 742 | if (security_secid_to_secctx(entry->secid, | ||
| 743 | &secctx, | ||
| 744 | &secctx_len) == 0) { | ||
| 745 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | ||
| 746 | security_release_secctx(secctx, secctx_len); | ||
| 747 | } | ||
| 748 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | ||
| 749 | audit_log_end(audit_buf); | ||
| 750 | } | ||
| 751 | |||
| 625 | if (ret_val == 0) | 752 | if (ret_val == 0) |
| 626 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4); | 753 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4); |
| 627 | return ret_val; | 754 | return ret_val; |
| @@ -630,9 +757,11 @@ static int netlbl_unlhsh_remove_addr4(struct netlbl_unlhsh_iface *iface, | |||
| 630 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 757 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 631 | /** | 758 | /** |
| 632 | * netlbl_unlhsh_remove_addr6 - Remove an IPv6 address entry | 759 | * netlbl_unlhsh_remove_addr6 - Remove an IPv6 address entry |
| 760 | * @net: network namespace | ||
| 633 | * @iface: interface entry | 761 | * @iface: interface entry |
| 634 | * @addr: IP address | 762 | * @addr: IP address |
| 635 | * @mask: IP address mask | 763 | * @mask: IP address mask |
| 764 | * @audit_info: NetLabel audit information | ||
| 636 | * | 765 | * |
| 637 | * Description: | 766 | * Description: |
| 638 | * Remove an IP address entry from the unlabeled connection hash table. | 767 | * Remove an IP address entry from the unlabeled connection hash table. |
| @@ -640,12 +769,18 @@ static int netlbl_unlhsh_remove_addr4(struct netlbl_unlhsh_iface *iface, | |||
| 640 | * responsible for calling the rcu_read_[un]lock() functions. | 769 | * responsible for calling the rcu_read_[un]lock() functions. |
| 641 | * | 770 | * |
| 642 | */ | 771 | */ |
| 643 | static int netlbl_unlhsh_remove_addr6(struct netlbl_unlhsh_iface *iface, | 772 | static int netlbl_unlhsh_remove_addr6(struct net *net, |
| 773 | struct netlbl_unlhsh_iface *iface, | ||
| 644 | const struct in6_addr *addr, | 774 | const struct in6_addr *addr, |
| 645 | const struct in6_addr *mask) | 775 | const struct in6_addr *mask, |
| 776 | struct netlbl_audit *audit_info) | ||
| 646 | { | 777 | { |
| 647 | int ret_val = -ENOENT; | 778 | int ret_val = -ENOENT; |
| 648 | struct netlbl_unlhsh_addr6 *entry; | 779 | struct netlbl_unlhsh_addr6 *entry; |
| 780 | struct audit_buffer *audit_buf = NULL; | ||
| 781 | struct net_device *dev; | ||
| 782 | char *secctx = NULL; | ||
| 783 | u32 secctx_len; | ||
| 649 | 784 | ||
| 650 | spin_lock(&netlbl_unlhsh_lock); | 785 | spin_lock(&netlbl_unlhsh_lock); |
| 651 | entry = netlbl_unlhsh_search_addr6(addr, iface); | 786 | entry = netlbl_unlhsh_search_addr6(addr, iface); |
| @@ -658,6 +793,25 @@ static int netlbl_unlhsh_remove_addr6(struct netlbl_unlhsh_iface *iface, | |||
| 658 | } | 793 | } |
| 659 | spin_unlock(&netlbl_unlhsh_lock); | 794 | spin_unlock(&netlbl_unlhsh_lock); |
| 660 | 795 | ||
| 796 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, | ||
| 797 | audit_info); | ||
| 798 | if (audit_buf != NULL) { | ||
| 799 | dev = dev_get_by_index(net, iface->ifindex); | ||
| 800 | netlbl_unlabel_audit_addr6(audit_buf, | ||
| 801 | (dev != NULL ? dev->name : NULL), | ||
| 802 | addr, mask); | ||
| 803 | if (dev != NULL) | ||
| 804 | dev_put(dev); | ||
| 805 | if (security_secid_to_secctx(entry->secid, | ||
| 806 | &secctx, | ||
| 807 | &secctx_len) == 0) { | ||
| 808 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | ||
| 809 | security_release_secctx(secctx, secctx_len); | ||
| 810 | } | ||
| 811 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | ||
| 812 | audit_log_end(audit_buf); | ||
| 813 | } | ||
| 814 | |||
| 661 | if (ret_val == 0) | 815 | if (ret_val == 0) |
| 662 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6); | 816 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6); |
| 663 | return ret_val; | 817 | return ret_val; |
| @@ -708,6 +862,7 @@ unlhsh_condremove_failure: | |||
| 708 | * @addr: IP address in network byte order | 862 | * @addr: IP address in network byte order |
| 709 | * @mask: address mask in network byte order | 863 | * @mask: address mask in network byte order |
| 710 | * @addr_len: length of address/mask (4 for IPv4, 16 for IPv6) | 864 | * @addr_len: length of address/mask (4 for IPv4, 16 for IPv6) |
| 865 | * @audit_info: NetLabel audit information | ||
| 711 | * | 866 | * |
| 712 | * Description: | 867 | * Description: |
| 713 | * Removes and existing entry from the unlabeled connection hash table. | 868 | * Removes and existing entry from the unlabeled connection hash table. |
| @@ -718,7 +873,8 @@ static int netlbl_unlhsh_remove(struct net *net, | |||
| 718 | const char *dev_name, | 873 | const char *dev_name, |
| 719 | const void *addr, | 874 | const void *addr, |
| 720 | const void *mask, | 875 | const void *mask, |
| 721 | u32 addr_len) | 876 | u32 addr_len, |
| 877 | struct netlbl_audit *audit_info) | ||
| 722 | { | 878 | { |
| 723 | int ret_val; | 879 | int ret_val; |
| 724 | struct net_device *dev; | 880 | struct net_device *dev; |
| @@ -745,11 +901,15 @@ static int netlbl_unlhsh_remove(struct net *net, | |||
| 745 | } | 901 | } |
| 746 | switch (addr_len) { | 902 | switch (addr_len) { |
| 747 | case sizeof(struct in_addr): | 903 | case sizeof(struct in_addr): |
| 748 | ret_val = netlbl_unlhsh_remove_addr4(iface, addr, mask); | 904 | ret_val = netlbl_unlhsh_remove_addr4(net, |
| 905 | iface, addr, mask, | ||
| 906 | audit_info); | ||
| 749 | break; | 907 | break; |
| 750 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 908 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 751 | case sizeof(struct in6_addr): | 909 | case sizeof(struct in6_addr): |
| 752 | ret_val = netlbl_unlhsh_remove_addr6(iface, addr, mask); | 910 | ret_val = netlbl_unlhsh_remove_addr6(net, |
| 911 | iface, addr, mask, | ||
| 912 | audit_info); | ||
| 753 | break; | 913 | break; |
| 754 | #endif /* IPv6 */ | 914 | #endif /* IPv6 */ |
| 755 | default: | 915 | default: |
| @@ -972,6 +1132,7 @@ static int netlbl_unlabel_staticadd(struct sk_buff *skb, | |||
| 972 | void *mask; | 1132 | void *mask; |
| 973 | u32 addr_len; | 1133 | u32 addr_len; |
| 974 | u32 secid; | 1134 | u32 secid; |
| 1135 | struct netlbl_audit audit_info; | ||
| 975 | 1136 | ||
| 976 | /* Don't allow users to add both IPv4 and IPv6 addresses for a | 1137 | /* Don't allow users to add both IPv4 and IPv6 addresses for a |
| 977 | * single entry. However, allow users to create two entries, one each | 1138 | * single entry. However, allow users to create two entries, one each |
| @@ -985,6 +1146,8 @@ static int netlbl_unlabel_staticadd(struct sk_buff *skb, | |||
| 985 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) | 1146 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) |
| 986 | return -EINVAL; | 1147 | return -EINVAL; |
| 987 | 1148 | ||
| 1149 | netlbl_netlink_auditinfo(skb, &audit_info); | ||
| 1150 | |||
| 988 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); | 1151 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); |
| 989 | if (ret_val != 0) | 1152 | if (ret_val != 0) |
| 990 | return ret_val; | 1153 | return ret_val; |
| @@ -997,7 +1160,8 @@ static int netlbl_unlabel_staticadd(struct sk_buff *skb, | |||
| 997 | return ret_val; | 1160 | return ret_val; |
| 998 | 1161 | ||
| 999 | return netlbl_unlhsh_add(&init_net, | 1162 | return netlbl_unlhsh_add(&init_net, |
| 1000 | dev_name, addr, mask, addr_len, secid); | 1163 | dev_name, addr, mask, addr_len, secid, |
| 1164 | &audit_info); | ||
| 1001 | } | 1165 | } |
| 1002 | 1166 | ||
| 1003 | /** | 1167 | /** |
| @@ -1019,6 +1183,7 @@ static int netlbl_unlabel_staticadddef(struct sk_buff *skb, | |||
| 1019 | void *mask; | 1183 | void *mask; |
| 1020 | u32 addr_len; | 1184 | u32 addr_len; |
| 1021 | u32 secid; | 1185 | u32 secid; |
| 1186 | struct netlbl_audit audit_info; | ||
| 1022 | 1187 | ||
| 1023 | /* Don't allow users to add both IPv4 and IPv6 addresses for a | 1188 | /* Don't allow users to add both IPv4 and IPv6 addresses for a |
| 1024 | * single entry. However, allow users to create two entries, one each | 1189 | * single entry. However, allow users to create two entries, one each |
| @@ -1031,6 +1196,8 @@ static int netlbl_unlabel_staticadddef(struct sk_buff *skb, | |||
| 1031 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) | 1196 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) |
| 1032 | return -EINVAL; | 1197 | return -EINVAL; |
| 1033 | 1198 | ||
| 1199 | netlbl_netlink_auditinfo(skb, &audit_info); | ||
| 1200 | |||
| 1034 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); | 1201 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); |
| 1035 | if (ret_val != 0) | 1202 | if (ret_val != 0) |
| 1036 | return ret_val; | 1203 | return ret_val; |
| @@ -1041,7 +1208,9 @@ static int netlbl_unlabel_staticadddef(struct sk_buff *skb, | |||
| 1041 | if (ret_val != 0) | 1208 | if (ret_val != 0) |
| 1042 | return ret_val; | 1209 | return ret_val; |
| 1043 | 1210 | ||
| 1044 | return netlbl_unlhsh_add(&init_net, NULL, addr, mask, addr_len, secid); | 1211 | return netlbl_unlhsh_add(&init_net, |
| 1212 | NULL, addr, mask, addr_len, secid, | ||
| 1213 | &audit_info); | ||
| 1045 | } | 1214 | } |
| 1046 | 1215 | ||
| 1047 | /** | 1216 | /** |
| @@ -1063,6 +1232,7 @@ static int netlbl_unlabel_staticremove(struct sk_buff *skb, | |||
| 1063 | void *addr; | 1232 | void *addr; |
| 1064 | void *mask; | 1233 | void *mask; |
| 1065 | u32 addr_len; | 1234 | u32 addr_len; |
| 1235 | struct netlbl_audit audit_info; | ||
| 1066 | 1236 | ||
| 1067 | /* See the note in netlbl_unlabel_staticadd() about not allowing both | 1237 | /* See the note in netlbl_unlabel_staticadd() about not allowing both |
| 1068 | * IPv4 and IPv6 in the same entry. */ | 1238 | * IPv4 and IPv6 in the same entry. */ |
| @@ -1073,12 +1243,16 @@ static int netlbl_unlabel_staticremove(struct sk_buff *skb, | |||
| 1073 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) | 1243 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) |
| 1074 | return -EINVAL; | 1244 | return -EINVAL; |
| 1075 | 1245 | ||
| 1246 | netlbl_netlink_auditinfo(skb, &audit_info); | ||
| 1247 | |||
| 1076 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); | 1248 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); |
| 1077 | if (ret_val != 0) | 1249 | if (ret_val != 0) |
| 1078 | return ret_val; | 1250 | return ret_val; |
| 1079 | dev_name = nla_data(info->attrs[NLBL_UNLABEL_A_IFACE]); | 1251 | dev_name = nla_data(info->attrs[NLBL_UNLABEL_A_IFACE]); |
| 1080 | 1252 | ||
| 1081 | return netlbl_unlhsh_remove(&init_net, dev_name, addr, mask, addr_len); | 1253 | return netlbl_unlhsh_remove(&init_net, |
| 1254 | dev_name, addr, mask, addr_len, | ||
| 1255 | &audit_info); | ||
| 1082 | } | 1256 | } |
| 1083 | 1257 | ||
| 1084 | /** | 1258 | /** |
| @@ -1099,6 +1273,7 @@ static int netlbl_unlabel_staticremovedef(struct sk_buff *skb, | |||
| 1099 | void *addr; | 1273 | void *addr; |
| 1100 | void *mask; | 1274 | void *mask; |
| 1101 | u32 addr_len; | 1275 | u32 addr_len; |
| 1276 | struct netlbl_audit audit_info; | ||
| 1102 | 1277 | ||
| 1103 | /* See the note in netlbl_unlabel_staticadd() about not allowing both | 1278 | /* See the note in netlbl_unlabel_staticadd() about not allowing both |
| 1104 | * IPv4 and IPv6 in the same entry. */ | 1279 | * IPv4 and IPv6 in the same entry. */ |
| @@ -1108,11 +1283,15 @@ static int netlbl_unlabel_staticremovedef(struct sk_buff *skb, | |||
| 1108 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) | 1283 | !info->attrs[NLBL_UNLABEL_A_IPV6MASK]))) |
| 1109 | return -EINVAL; | 1284 | return -EINVAL; |
| 1110 | 1285 | ||
| 1286 | netlbl_netlink_auditinfo(skb, &audit_info); | ||
| 1287 | |||
| 1111 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); | 1288 | ret_val = netlbl_unlabel_addrinfo_get(info, &addr, &mask, &addr_len); |
| 1112 | if (ret_val != 0) | 1289 | if (ret_val != 0) |
| 1113 | return ret_val; | 1290 | return ret_val; |
| 1114 | 1291 | ||
| 1115 | return netlbl_unlhsh_remove(&init_net, NULL, addr, mask, addr_len); | 1292 | return netlbl_unlhsh_remove(&init_net, |
| 1293 | NULL, addr, mask, addr_len, | ||
| 1294 | &audit_info); | ||
| 1116 | } | 1295 | } |
| 1117 | 1296 | ||
| 1118 | 1297 | ||
