Re: [PATCH] libsepol: cil: only overwrite cil_typeattribute used when false.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/16/2017 07:13 AM, jwcart2 wrote:
On 11/14/2017 07:44 PM, Daniel Cashman wrote:
From: Dan Cashman <dcashman@xxxxxxxxxx>

When using cil_db multiple_decls, the different cil_attribute nodes
all point to the same underlying cil_attribute struct.  This leads
to problems, though, when modifying the used value in the struct.
__cil_post_db_attr() changes the value of the field to based on
the output of cil_typeattribute_used(), for use later in
cil_typeattribute_to_policydb and cil_typeattribute_to_bitmap, but
due to the multiple declarations, cil_typeattribute_used() could be called
again by a second node.  In this second call, the value used is the
modifed value of CIL_TRUE or CIL_FALSE, not the flags actually needed.
This could result in the field being reset again, to an incorrect CIL_FALSE
value.  To avoid this, only change the value of the field if it is to
be set to CIL_FALSE.  Also update the checks that use this value to
explicitly check for CIL_FALSE, rather than relying on its underlying
value.

Alternatively, a different field could be used rather than overwriting the 'used' field, attrib structs could be un-shared, or duplicate declarations
could just be skipped rather than sticking around in the tree.


You patch does work. I am wondering if it might not be better to have a new field. I am going to experiment with this today and see how that would work.

Signed-off-by: Daniel Cashman <dcashman@xxxxxxxxxxx>
---
  libsepol/cil/src/cil_binary.c | 6 +++---
  libsepol/cil/src/cil_post.c   | 3 ++-
  2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/libsepol/cil/src/cil_binary.c b/libsepol/cil/src/cil_binary.c
index c0ca60f2..e4003c8b 100644
--- a/libsepol/cil/src/cil_binary.c
+++ b/libsepol/cil/src/cil_binary.c
@@ -567,8 +567,8 @@ int cil_typeattribute_to_policydb(policydb_t *pdb, struct cil_typeattribute *cil
      char *key = NULL;
      type_datum_t *sepol_attr = NULL;
-    if (!cil_attr->used) {
-        return SEPOL_OK;
+    if (cil_attr->used == CIL_FALSE) {
+        return SEPOL_OK;
      }
      sepol_attr = cil_malloc(sizeof(*sepol_attr));
@@ -632,7 +632,7 @@ int cil_typeattribute_to_bitmap(policydb_t *pdb, const struct cil_db *db, struct
      ebitmap_node_t *tnode;
      unsigned int i;
-    if (!cil_attr->used) {
+    if (cil_attr->used == CIL_FALSE) {
          return SEPOL_OK;
      }


I don't think these changes are necessary. It would be a problem if we were checking specifically for CIL_TRUE because with your patch the used field can contain other non-false values.

Yes, definitely not necessary. Just a proposed change to not always assume that CIL_FALSE is zero, but my guess is that:
1) it always will be
2) we actually want it to be
3) changing that would require huge numbers of changes scattered throughout the code base.

Perfectly happy to not include them.

Jim


diff --git a/libsepol/cil/src/cil_post.c b/libsepol/cil/src/cil_post.c
index 3e013c97..823ecf0f 100644
--- a/libsepol/cil/src/cil_post.c
+++ b/libsepol/cil/src/cil_post.c
@@ -1369,7 +1369,8 @@ static int __cil_post_db_attr_helper(struct cil_tree_node *node, uint32_t *finis
              rc = __evaluate_type_expression(attr, db);
              if (rc != SEPOL_OK) goto exit;
          }
-        attr->used = cil_typeattribute_used(attr, db);
+        if (cil_typeattribute_used(attr, db) == CIL_FALSE)
+            attr->used = CIL_FALSE;
          break;
      }
      case CIL_ROLEATTRIBUTE: {









[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux