Deleted Added
full compact
mac_biba.c (113531) mac_biba.c (115395)
1/*-
2 * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson
3 * Copyright (c) 2001, 2002 Networks Associates Technology, Inc.
4 * All rights reserved.
5 *
6 * This software was developed by Robert Watson for the TrustedBSD Project.
7 *
8 * This software was developed for the FreeBSD Project in part by Network

--- 17 unchanged lines hidden (view full) ---

26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
1/*-
2 * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson
3 * Copyright (c) 2001, 2002 Networks Associates Technology, Inc.
4 * All rights reserved.
5 *
6 * This software was developed by Robert Watson for the TrustedBSD Project.
7 *
8 * This software was developed for the FreeBSD Project in part by Network

--- 17 unchanged lines hidden (view full) ---

26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 * $FreeBSD: head/sys/security/mac_biba/mac_biba.c 113531 2003-04-15 20:51:18Z rwatson $
34 * $FreeBSD: head/sys/security/mac_biba/mac_biba.c 115395 2003-05-29 22:51:52Z rwatson $
35 */
36
37/*
38 * Developed by the TrustedBSD Project.
39 * Biba fixed label mandatory integrity policy.
40 */
41
42#include <sys/types.h>

--- 599 unchanged lines hidden (view full) ---

642
643 *len = strlen(element_data);
644 return (0);
645}
646
647static int
648mac_biba_parse_element(struct mac_biba_element *element, char *string)
649{
35 */
36
37/*
38 * Developed by the TrustedBSD Project.
39 * Biba fixed label mandatory integrity policy.
40 */
41
42#include <sys/types.h>

--- 599 unchanged lines hidden (view full) ---

642
643 *len = strlen(element_data);
644 return (0);
645}
646
647static int
648mac_biba_parse_element(struct mac_biba_element *element, char *string)
649{
650 char *compartment, *end, *grade;
651 int value;
650
651 if (strcmp(string, "high") == 0 ||
652 strcmp(string, "hi") == 0) {
653 element->mbe_type = MAC_BIBA_TYPE_HIGH;
654 element->mbe_grade = MAC_BIBA_TYPE_UNDEF;
655 } else if (strcmp(string, "low") == 0 ||
656 strcmp(string, "lo") == 0) {
657 element->mbe_type = MAC_BIBA_TYPE_LOW;
658 element->mbe_grade = MAC_BIBA_TYPE_UNDEF;
659 } else if (strcmp(string, "equal") == 0 ||
660 strcmp(string, "eq") == 0) {
661 element->mbe_type = MAC_BIBA_TYPE_EQUAL;
662 element->mbe_grade = MAC_BIBA_TYPE_UNDEF;
663 } else {
652
653 if (strcmp(string, "high") == 0 ||
654 strcmp(string, "hi") == 0) {
655 element->mbe_type = MAC_BIBA_TYPE_HIGH;
656 element->mbe_grade = MAC_BIBA_TYPE_UNDEF;
657 } else if (strcmp(string, "low") == 0 ||
658 strcmp(string, "lo") == 0) {
659 element->mbe_type = MAC_BIBA_TYPE_LOW;
660 element->mbe_grade = MAC_BIBA_TYPE_UNDEF;
661 } else if (strcmp(string, "equal") == 0 ||
662 strcmp(string, "eq") == 0) {
663 element->mbe_type = MAC_BIBA_TYPE_EQUAL;
664 element->mbe_grade = MAC_BIBA_TYPE_UNDEF;
665 } else {
664 char *p0, *p1;
665 int d;
666 element->mbe_type = MAC_BIBA_TYPE_GRADE;
666
667
667 p0 = string;
668 d = strtol(p0, &p1, 10);
669
670 if (d < 0 || d > 65535)
668 /*
669 * Numeric grade piece of the element.
670 */
671 grade = strsep(&string, ":");
672 value = strtol(grade, &end, 10);
673 if (end == grade || *end != '\0')
671 return (EINVAL);
674 return (EINVAL);
672 element->mbe_type = MAC_BIBA_TYPE_GRADE;
673 element->mbe_grade = d;
675 if (value < 0 || value > 65535)
676 return (EINVAL);
677 element->mbe_grade = value;
674
678
675 if (*p1 != ':') {
676 if (p1 == p0 || *p1 != '\0')
677 return (EINVAL);
678 else
679 return (0);
680 }
681 else
682 if (*(p1 + 1) == '\0')
683 return (0);
679 /*
680 * Optional compartment piece of the element. If none
681 * are included, we assume that the label has no
682 * compartments.
683 */
684 if (string == NULL)
685 return (0);
686 if (*string == '\0')
687 return (0);
684
688
685 while ((p0 = ++p1)) {
686 d = strtol(p0, &p1, 10);
687 if (d < 1 || d > MAC_BIBA_MAX_COMPARTMENTS)
689 while ((compartment = strsep(&string, "+")) != NULL) {
690 value = strtol(compartment, &end, 10);
691 if (compartment == end || *end != '\0')
688 return (EINVAL);
692 return (EINVAL);
689
690 MAC_BIBA_BIT_SET(d, element->mbe_compartments);
691
692 if (*p1 == '\0')
693 break;
694 if (p1 == p0 || *p1 != '+')
693 if (value < 1 || value > MAC_BIBA_MAX_COMPARTMENTS)
695 return (EINVAL);
694 return (EINVAL);
695 MAC_BIBA_BIT_SET(value, element->mbe_compartments);
696 }
697 }
698
699 return (0);
700}
701
702/*
703 * Note: destructively consumes the string, make a local copy before
704 * calling if that's a problem.
705 */
706static int
707mac_biba_parse(struct mac_biba *mac_biba, char *string)
708{
696 }
697 }
698
699 return (0);
700}
701
702/*
703 * Note: destructively consumes the string, make a local copy before
704 * calling if that's a problem.
705 */
706static int
707mac_biba_parse(struct mac_biba *mac_biba, char *string)
708{
709 char *range, *rangeend, *rangehigh, *rangelow, *single;
709 char *rangehigh, *rangelow, *single;
710 int error;
711
710 int error;
711
712 /* Do we have a range? */
713 single = string;
714 range = index(string, '(');
715 if (range == single)
712 single = strsep(&string, "(");
713 if (*single == '\0')
716 single = NULL;
714 single = NULL;
717 rangelow = rangehigh = NULL;
718 if (range != NULL) {
719 /* Nul terminate the end of the single string. */
720 *range = '\0';
721 range++;
722 rangelow = range;
723 rangehigh = index(rangelow, '-');
724 if (rangehigh == NULL)
715
716 if (string != NULL) {
717 rangelow = strsep(&string, "-");
718 if (string == NULL)
725 return (EINVAL);
719 return (EINVAL);
726 rangehigh++;
727 if (*rangelow == '\0' || *rangehigh == '\0')
720 rangehigh = strsep(&string, ")");
721 if (string == NULL)
728 return (EINVAL);
722 return (EINVAL);
729 rangeend = index(rangehigh, ')');
730 if (rangeend == NULL)
723 if (*string != '\0')
731 return (EINVAL);
724 return (EINVAL);
732 if (*(rangeend + 1) != '\0')
733 return (EINVAL);
734 /* Nul terminate the ends of the ranges. */
735 *(rangehigh - 1) = '\0';
736 *rangeend = '\0';
725 } else {
726 rangelow = NULL;
727 rangehigh = NULL;
737 }
728 }
729
738 KASSERT((rangelow != NULL && rangehigh != NULL) ||
739 (rangelow == NULL && rangehigh == NULL),
730 KASSERT((rangelow != NULL && rangehigh != NULL) ||
731 (rangelow == NULL && rangehigh == NULL),
740 ("mac_biba_internalize_label: range mismatch"));
732 ("mac_biba_parse: range mismatch"));
741
742 bzero(mac_biba, sizeof(*mac_biba));
743 if (single != NULL) {
744 error = mac_biba_parse_element(&mac_biba->mb_single, single);
745 if (error)
746 return (error);
747 mac_biba->mb_flags |= MAC_BIBA_FLAG_SINGLE;
748 }

--- 2006 unchanged lines hidden ---
733
734 bzero(mac_biba, sizeof(*mac_biba));
735 if (single != NULL) {
736 error = mac_biba_parse_element(&mac_biba->mb_single, single);
737 if (error)
738 return (error);
739 mac_biba->mb_flags |= MAC_BIBA_FLAG_SINGLE;
740 }

--- 2006 unchanged lines hidden ---