rbac_internal.h File Reference


Detailed Description

Protected interface for role allow rule and role_transition rule differences.

Author:
Jeremy A. Mowery jmowery@tresys.com

Jason Tang jtang@tresys.com

Copyright (C) 2006-2007 Tresys Technology, LLC

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Definition in file rbac_internal.h.

Go to the source code of this file.


Typedefs

typedef poldiff_role_allow_summary poldiff_role_allow_summary_t
typedef poldiff_role_trans_summary poldiff_role_trans_summary_t

Functions

poldiff_role_allow_summary_trole_allow_create (void)
 Allocate and return a new poldiff_role_allow_summary_t object.
void role_allow_destroy (poldiff_role_allow_summary_t **ras)
 Deallocate all space associated with a poldiff_role_allow_summary_t object, including the pointer itself.
int role_allow_reset (poldiff_t *diff)
 Reset the state of all role allow rule differences.
apol_vector_trole_allow_get_items (poldiff_t *diff, const apol_policy_t *policy)
 Get a vector of all role allow rules from the given policy, sorted by source name.
int role_allow_comp (const void *x, const void *y, const poldiff_t *diff)
 Compare two pseudo_role_allow_t objects, determining if they have the same source name or not.
int role_allow_new_diff (poldiff_t *diff, poldiff_form_e form, const void *item)
 Create, initialize, and insert a new semantic difference entry for a role allow rule.
int role_allow_deep_diff (poldiff_t *diff, const void *x, const void *y)
 Compute the semantic difference of two role allow rules for which the compare callback returns 0.
poldiff_role_trans_summary_trole_trans_create (void)
 Allocate and return a new poldiff_role_trans_summary_t object.
void role_trans_destroy (poldiff_role_trans_summary_t **rts)
 Deallocate all space associated with a poldiff_role_trans_summary_t object, including the pointer itself.
int role_trans_reset (poldiff_t *diff)
 Reset the state of all role_transition rule differences.
apol_vector_trole_trans_get_items (poldiff_t *diff, const apol_policy_t *policy)
 Get a vector of all role_transition rules from the given policy, sorted by source name.
int role_trans_comp (const void *x, const void *y, const poldiff_t *diff)
 Compare two pseudo_role_trans_t objects, determining if they have the same source name and target or not.
int role_trans_new_diff (poldiff_t *diff, poldiff_form_e form, const void *item)
 Create, initialize, and insert a new semantic difference entry for a role_transition rule.
int role_trans_deep_diff (poldiff_t *diff, const void *x, const void *y)
 Compute the semantic difference of two role_transition rules for which the compare callback returns 0.

Typedef Documentation

typedef struct poldiff_role_allow_summary poldiff_role_allow_summary_t
 

Definition at line 34 of file rbac_internal.h.

Referenced by role_allow_create(), and role_allow_destroy().

typedef struct poldiff_role_trans_summary poldiff_role_trans_summary_t
 

Definition at line 35 of file rbac_internal.h.

Referenced by role_trans_create(), and role_trans_destroy().


Function Documentation

poldiff_role_allow_summary_t* role_allow_create void   ) 
 

Allocate and return a new poldiff_role_allow_summary_t object.

Returns:
A new role allow summary. The caller must call role_allow_destroy() afterwards. On error, return NULL and set errno.

Definition at line 243 of file rbac_diff.c.

References apol_vector_create(), poldiff_role_allow_summary_t, role_allow_destroy(), and role_allow_free().

Referenced by poldiff_create(), and role_allow_reset().

00244 {
00245         poldiff_role_allow_summary_t *ras = calloc(1, sizeof(*ras));
00246         if (ras == NULL) {
00247                 return NULL;
00248         }
00249         if ((ras->diffs = apol_vector_create(role_allow_free)) == NULL) {
00250                 role_allow_destroy(&ras);
00251                 return NULL;
00252         }
00253         return ras;
00254 }

void role_allow_destroy poldiff_role_allow_summary_t **  ras  ) 
 

Deallocate all space associated with a poldiff_role_allow_summary_t object, including the pointer itself.

If the pointer is already NULL then do nothing.

Parameters:
ras Reference to a role allow summary to destroy. The pointer will be set to NULL afterwards.

Definition at line 256 of file rbac_diff.c.

References apol_vector_destroy(), and poldiff_role_allow_summary_t.

Referenced by poldiff_destroy(), role_allow_create(), and role_allow_reset().

00257 {
00258         if (ras != NULL && *ras != NULL) {
00259                 apol_vector_destroy(&(*ras)->diffs);
00260                 free(*ras);
00261                 *ras = NULL;
00262         }
00263 }

int role_allow_reset poldiff_t diff  ) 
 

Reset the state of all role allow rule differences.

Parameters:
diff The policy difference structure containing the differences to reset.
Returns:
0 on success and < 0 on error; if the call fails, errno will be set and the user should call poldiff_destroy() on diff.

Definition at line 376 of file rbac_diff.c.

References diff, ERR, poldiff_t, role_allow_create(), role_allow_destroy(), and poldiff::role_allow_diffs.

00377 {
00378         int error = 0;
00379 
00380         if (diff == NULL) {
00381                 ERR(diff, "%s", strerror(EINVAL));
00382                 errno = EINVAL;
00383                 return -1;
00384         }
00385 
00386         role_allow_destroy(&diff->role_allow_diffs);
00387         diff->role_allow_diffs = role_allow_create();
00388         if (diff->role_allow_diffs == NULL) {
00389                 error = errno;
00390                 ERR(diff, "%s", strerror(error));
00391                 errno = error;
00392                 return -1;
00393         }
00394 
00395         return 0;
00396 }

apol_vector_t* role_allow_get_items poldiff_t diff,
const apol_policy_t policy
 

Get a vector of all role allow rules from the given policy, sorted by source name.

Parameters:
diff Policy diff error handler.
policy The policy from which to get the items.
Returns:
A newly allocated vector of all role allow rules (of type pseudo_role_allow_t). The caller is responsible for calling apol_vector_destroy() afterwards. On error, return NULL and set errno.

Definition at line 291 of file rbac_diff.c.

References apol_bst_create(), apol_bst_destroy(), apol_bst_get_vector(), apol_bst_insert_and_get(), apol_bst_t, apol_policy_get_qpol(), apol_policy_t, apol_str_strcmp(), apol_vector_append_unique(), apol_vector_create_from_iter(), apol_vector_create_with_capacity(), apol_vector_destroy(), apol_vector_get_element(), apol_vector_get_size(), apol_vector_t, diff, ERR, poldiff_t, pseudo_role_allow_t, qpol_iterator_destroy(), qpol_iterator_t, qpol_policy_get_role_allow_iter(), qpol_policy_t, qpol_role_allow_get_source_role(), qpol_role_allow_get_target_role(), qpol_role_allow_t, qpol_role_get_name(), qpol_role_t, role_allow_free_item(), and role_allow_source_comp().

00292 {
00293         qpol_iterator_t *iter = NULL;
00294         apol_vector_t *tmp = NULL, *v = NULL;
00295         int error = 0, retv;
00296         size_t i;
00297         apol_bst_t *bst = NULL;
00298         pseudo_role_allow_t *pra = NULL;
00299         const qpol_role_t *sr = NULL, *tr = NULL;
00300         const char *sr_name = NULL, *tr_name = NULL;
00301         const qpol_role_allow_t *qra = NULL;
00302         qpol_policy_t *q = apol_policy_get_qpol(policy);
00303 
00304         if (qpol_policy_get_role_allow_iter(q, &iter) < 0) {
00305                 return NULL;
00306         }
00307 
00308         tmp = apol_vector_create_from_iter(iter, NULL);
00309         if (tmp == NULL) {
00310                 error = errno;
00311                 ERR(diff, "%s", strerror(error));
00312                 qpol_iterator_destroy(&iter);
00313                 errno = error;
00314                 return NULL;
00315         }
00316         qpol_iterator_destroy(&iter);
00317 
00318         bst = apol_bst_create(role_allow_source_comp, role_allow_free_item);
00319 
00320         for (i = 0; i < apol_vector_get_size(tmp); i++) {
00321                 qra = apol_vector_get_element(tmp, i);
00322                 if (!(pra = calloc(1, sizeof(*pra))) || (!(pra->target_roles = apol_vector_create_with_capacity(1, NULL)))) {
00323                         error = errno;
00324                         ERR(diff, "%s", strerror(error));
00325                         goto err;
00326                 }
00327                 if (qpol_role_allow_get_source_role(q, qra, &sr) || qpol_role_get_name(q, sr, &sr_name)) {
00328                         error = errno;
00329                         ERR(diff, "%s", strerror(error));
00330                         goto err;
00331                 }
00332                 sr = NULL;
00333                 if (qpol_role_allow_get_target_role(q, qra, &tr) || qpol_role_get_name(q, tr, &tr_name)) {
00334                         error = errno;
00335                         ERR(diff, "%s", strerror(error));
00336                         goto err;
00337                 }
00338                 tr = NULL;
00339                 pra->source_role = sr_name;
00340                 retv = apol_bst_insert_and_get(bst, (void **)&pra, NULL);
00341                 if (retv < 0) {
00342                         error = errno;
00343                         ERR(diff, "%s", strerror(error));
00344                         goto err;
00345                 }
00346                 apol_vector_append_unique(pra->target_roles, (void *)tr_name, apol_str_strcmp, NULL);
00347                 pra = NULL;
00348         }
00349         apol_vector_destroy(&tmp);
00350 
00351         v = apol_bst_get_vector(bst, 1);
00352         if (!v) {
00353                 error = errno;
00354                 ERR(diff, "%s", strerror(error));
00355                 goto err;
00356         }
00357         apol_bst_destroy(&bst);
00358 
00359         return v;
00360 
00361       err:
00362         role_allow_free_item(pra);
00363         apol_bst_destroy(&bst);
00364         errno = error;
00365         return NULL;
00366 }

int role_allow_comp const void *  x,
const void *  y,
const poldiff_t diff
 

Compare two pseudo_role_allow_t objects, determining if they have the same source name or not.

Parameters:
x The role allow from the original policy.
y The role allow from the modified policy.
diff The policy difference structure associated with both policies.
Returns:
< 0, 0, or > 0 if source role of x is respectively less than, equal to, or greater than source role of y.

int role_allow_new_diff poldiff_t diff,
poldiff_form_e  form,
const void *  item
 

Create, initialize, and insert a new semantic difference entry for a role allow rule.

Parameters:
diff The policy difference structure to which to add the entry.
form The form of the difference.
item Item for which the entry is being created.
Returns:
0 on success and < 0 on error; if the call fails, set errno and leave the policy difference structure unchanged.

Definition at line 428 of file rbac_diff.c.

References poldiff_role_allow::added_roles, apol_vector_append(), apol_vector_cat(), diff, poldiff_role_allow_summary::diffs, ERR, make_ra_diff(), poldiff_role_allow_summary::num_added, poldiff_role_allow_summary::num_removed, poldiff_role_allow_t, poldiff_t, pseudo_role_allow_t, poldiff_role_allow::removed_roles, poldiff::role_allow_diffs, role_allow_free(), pseudo_role_allow::source_role, and pseudo_role_allow::target_roles.

00429 {
00430         pseudo_role_allow_t *ra = (pseudo_role_allow_t *) item;
00431         poldiff_role_allow_t *pra;
00432         int error;
00433 
00434         pra = make_ra_diff(diff, form, ra->source_role);
00435         if (pra == NULL) {
00436                 return -1;
00437         }
00438         int rt;
00439         if (form == POLDIFF_FORM_ADDED) {
00440                 rt = apol_vector_cat(pra->added_roles, ra->target_roles);
00441         } else {
00442                 rt = apol_vector_cat(pra->removed_roles, ra->target_roles);
00443         }
00444         if (rt < 0) {
00445                 error = errno;
00446                 ERR(diff, "%s", strerror(error));
00447                 role_allow_free(pra);
00448                 errno = error;
00449                 return -1;
00450         }
00451         if (apol_vector_append(diff->role_allow_diffs->diffs, pra) < 0) {
00452                 error = errno;
00453                 ERR(diff, "%s", strerror(error));
00454                 role_allow_free(pra);
00455                 errno = error;
00456                 return -1;
00457         }
00458         if (form == POLDIFF_FORM_ADDED) {
00459                 diff->role_allow_diffs->num_added++;
00460         } else {
00461                 diff->role_allow_diffs->num_removed++;
00462         }
00463         return 0;
00464 }

int role_allow_deep_diff poldiff_t diff,
const void *  x,
const void *  y
 

Compute the semantic difference of two role allow rules for which the compare callback returns 0.

If a difference is found then allocate, initialize, and insert a new semantic difference entry for that role allow rule.

Parameters:
diff The policy difference structure associated with both rules and to which to add an entry if needed.
x The role allow rule from the original policy.
y The role allow rule from the modified policy.
Returns:
0 on success and < 0 on error; if the call fails, set errno and leave the policy difference structure unchanged.

Definition at line 466 of file rbac_diff.c.

References poldiff_role_allow::added_roles, apol_str_strcmp(), apol_vector_append(), apol_vector_get_element(), apol_vector_get_size(), apol_vector_sort(), apol_vector_t, diff, poldiff_role_allow_summary::diffs, ERR, make_ra_diff(), poldiff_role_allow_summary::num_modified, poldiff_role_allow::orig_roles, POLDIFF_FORM_MODIFIED, poldiff_role_allow_t, poldiff_t, pseudo_role_allow_t, poldiff_role_allow::removed_roles, poldiff::role_allow_diffs, role_allow_free(), pseudo_role_allow::source_role, and pseudo_role_allow::target_roles.

00467 {
00468         const pseudo_role_allow_t *p1 = x;
00469         const pseudo_role_allow_t *p2 = y;
00470         apol_vector_t *v1 = NULL, *v2 = NULL;
00471         char *role1, *role2;
00472         poldiff_role_allow_t *pra = NULL;
00473         size_t i, j;
00474         int retval = -1, error = 0, compval;
00475 
00476         v1 = p1->target_roles;
00477         v2 = p2->target_roles;
00478 
00479         apol_vector_sort(v1, apol_str_strcmp, NULL);
00480         apol_vector_sort(v2, apol_str_strcmp, NULL);
00481         for (i = j = 0; i < apol_vector_get_size(v1);) {
00482                 if (j >= apol_vector_get_size(v2))
00483                         break;
00484                 role1 = (char *)apol_vector_get_element(v1, i);
00485                 role2 = (char *)apol_vector_get_element(v2, j);
00486                 compval = strcmp(role1, role2);
00487                 if (pra == NULL) {
00488                         if ((pra = make_ra_diff(diff, POLDIFF_FORM_MODIFIED, p1->source_role)) == NULL) {
00489                                 error = errno;
00490                                 goto cleanup;
00491                         }
00492                 }
00493                 if (compval < 0) {
00494                         if (apol_vector_append(pra->removed_roles, role1) < 0) {
00495                                 error = errno;
00496                                 ERR(diff, "%s", strerror(error));
00497                                 goto cleanup;
00498                         }
00499                         i++;
00500                 } else if (compval > 0) {
00501                         if (apol_vector_append(pra->added_roles, role2) < 0) {
00502                                 error = errno;
00503                                 ERR(diff, "%s", strerror(error));
00504                                 goto cleanup;
00505                         }
00506                         j++;
00507                 } else {
00508                         if (apol_vector_append(pra->orig_roles, role1) < 0) {
00509                                 error = errno;
00510                                 ERR(diff, "%s", strerror(error));
00511                                 goto cleanup;
00512                         }
00513                         i++;
00514                         j++;
00515                 }
00516         }
00517         for (; i < apol_vector_get_size(v1); i++) {
00518                 role1 = (char *)apol_vector_get_element(v1, i);
00519                 if (pra == NULL) {
00520                         if ((pra = make_ra_diff(diff, POLDIFF_FORM_MODIFIED, p1->source_role)) == NULL) {
00521                                 error = errno;
00522                                 goto cleanup;
00523                         }
00524                 }
00525                 if (apol_vector_append(pra->removed_roles, role1) < 0) {
00526                         error = errno;
00527                         free(role1);
00528                         ERR(diff, "%s", strerror(error));
00529                         goto cleanup;
00530                 }
00531         }
00532         for (; j < apol_vector_get_size(v2); j++) {
00533                 role2 = (char *)apol_vector_get_element(v2, j);
00534                 if (pra == NULL) {
00535                         if ((pra = make_ra_diff(diff, POLDIFF_FORM_MODIFIED, p1->source_role)) == NULL) {
00536                                 error = errno;
00537                                 goto cleanup;
00538                         }
00539                 }
00540                 if (apol_vector_append(pra->added_roles, role2) < 0) {
00541                         error = errno;
00542                         free(role2);
00543                         ERR(diff, "%s", strerror(error));
00544                         goto cleanup;
00545                 }
00546         }
00547         if (apol_vector_get_size(pra->added_roles) || apol_vector_get_size(pra->removed_roles)) {
00548                 apol_vector_sort(pra->removed_roles, apol_str_strcmp, NULL);
00549                 apol_vector_sort(pra->added_roles, apol_str_strcmp, NULL);
00550                 apol_vector_sort(pra->orig_roles, apol_str_strcmp, NULL);
00551                 if (apol_vector_append(diff->role_allow_diffs->diffs, pra) < 0) {
00552                         error = errno;
00553                         ERR(diff, "%s", strerror(error));
00554                         goto cleanup;
00555                 }
00556                 diff->role_allow_diffs->num_modified++;
00557         } else {
00558                 role_allow_free(pra);
00559                 pra = NULL;
00560         }
00561         retval = 0;
00562       cleanup:
00563         if (retval != 0) {
00564                 role_allow_free(pra);
00565         }
00566         errno = error;
00567         return retval;
00568 }

poldiff_role_trans_summary_t* role_trans_create void   ) 
 

Allocate and return a new poldiff_role_trans_summary_t object.

Returns:
A new role transition summary. The caller must call role_trans_destroy() afterwards. On error, return NULL and set errno.

Definition at line 698 of file rbac_diff.c.

References apol_vector_create(), poldiff_role_trans_summary_t, role_trans_destroy(), and role_trans_free().

Referenced by poldiff_create(), and role_trans_reset().

00699 {
00700         poldiff_role_trans_summary_t *rts = calloc(1, sizeof(*rts));
00701         if (rts == NULL) {
00702                 return NULL;
00703         }
00704         if ((rts->diffs = apol_vector_create(role_trans_free)) == NULL) {
00705                 role_trans_destroy(&rts);
00706                 return NULL;
00707         }
00708         return rts;
00709 }

void role_trans_destroy poldiff_role_trans_summary_t **  rts  ) 
 

Deallocate all space associated with a poldiff_role_trans_summary_t object, including the pointer itself.

If the pointer is already NULL then do nothing.

Parameters:
rts Reference to a role transition summary to destroy. The pointer will be set to NULL afterwards.

Definition at line 711 of file rbac_diff.c.

References apol_vector_destroy(), and poldiff_role_trans_summary_t.

Referenced by poldiff_destroy(), role_trans_create(), and role_trans_reset().

00712 {
00713         if (rts != NULL && *rts != NULL) {
00714                 apol_vector_destroy(&(*rts)->diffs);
00715                 free(*rts);
00716                 *rts = NULL;
00717         }
00718 }

int role_trans_reset poldiff_t diff  ) 
 

Reset the state of all role_transition rule differences.

Parameters:
diff The policy difference structure containing the differences to reset.
Returns:
0 on success and < 0 on error; if the call fails, errno will be set and the user should call poldiff_destroy() on diff.

Definition at line 720 of file rbac_diff.c.

References diff, ERR, poldiff_t, role_trans_create(), role_trans_destroy(), and poldiff::role_trans_diffs.

00721 {
00722         int error = 0;
00723 
00724         if (diff == NULL) {
00725                 ERR(diff, "%s", strerror(EINVAL));
00726                 errno = EINVAL;
00727                 return -1;
00728         }
00729 
00730         role_trans_destroy(&diff->role_trans_diffs);
00731         diff->role_trans_diffs = role_trans_create();
00732         if (diff->role_trans_diffs == NULL) {
00733                 error = errno;
00734                 ERR(diff, "%s", strerror(error));
00735                 errno = error;
00736                 return -1;
00737         }
00738 
00739         return 0;
00740 }

apol_vector_t* role_trans_get_items poldiff_t diff,
const apol_policy_t policy
 

Get a vector of all role_transition rules from the given policy, sorted by source name.

Parameters:
diff Policy diff error handler.
policy The policy from which to get the items.
Returns:
A newly allocated vector of all role_transition rules (of type pseudo_role_trans_t). The caller is responsible for calling apol_vector_destroy() afterwards. On error, return NULL and set errno.

Definition at line 785 of file rbac_diff.c.

References apol_policy_get_qpol(), apol_policy_t, apol_vector_append(), apol_vector_create(), apol_vector_destroy(), apol_vector_sort_uniquify(), apol_vector_t, diff, ERR, poldiff::orig_pol, POLDIFF_POLICY_ORIG, poldiff_t, pseudo_role_trans_comp(), pseudo_role_trans_t, qpol_iterator_destroy(), qpol_iterator_end(), qpol_iterator_get_item(), qpol_iterator_next(), qpol_iterator_t, qpol_policy_get_role_trans_iter(), qpol_policy_t, qpol_role_get_name(), qpol_role_t, qpol_role_trans_get_default_role(), qpol_role_trans_get_source_role(), qpol_role_trans_get_target_type(), qpol_role_trans_t, qpol_type_get_isattr(), qpol_type_get_type_iter(), qpol_type_t, role_trans_free_item(), and type_map_lookup().

00786 {
00787         qpol_iterator_t *iter = NULL, *attr_types = NULL;
00788         apol_vector_t *v = NULL;
00789         const qpol_role_trans_t *qrt = NULL;
00790         pseudo_role_trans_t *tmp_prt = NULL;
00791         const char *tmp_name = NULL;
00792         const qpol_role_t *tmp_role = NULL;
00793         const qpol_type_t *tmp_type = NULL;
00794         qpol_policy_t *q = apol_policy_get_qpol(policy);
00795         int error = 0, which_pol;
00796         unsigned char isattr = 0;
00797 
00798         which_pol = (policy == diff->orig_pol ? POLDIFF_POLICY_ORIG : POLDIFF_POLICY_MOD);
00799         if (qpol_policy_get_role_trans_iter(q, &iter)) {
00800                 error = errno;
00801                 goto err;
00802         }
00803         v = apol_vector_create(role_trans_free_item);
00804         if (!v) {
00805                 error = errno;
00806                 ERR(diff, "%s", strerror(error));
00807                 goto err;
00808         }
00809         for (; !qpol_iterator_end(iter); qpol_iterator_next(iter)) {
00810                 isattr = 0;
00811                 if (qpol_iterator_get_item(iter, (void **)&qrt) < 0) {
00812                         error = errno;
00813                         ERR(diff, "%s", strerror(error));
00814                         goto err;
00815                 }
00816                 if (qpol_role_trans_get_target_type(q, qrt, &tmp_type) < 0) {
00817                         error = errno;
00818                         goto err;
00819                 }
00820                 qpol_type_get_isattr(q, tmp_type, &isattr);
00821                 if (isattr) {
00822                         qpol_type_get_type_iter(q, tmp_type, &attr_types);
00823                         for (; !qpol_iterator_end(attr_types); qpol_iterator_next(attr_types)) {
00824                                 qpol_iterator_get_item(attr_types, (void **)&tmp_type);
00825                                 if (!(tmp_prt = calloc(1, sizeof(*tmp_prt)))) {
00826                                         error = errno;
00827                                         ERR(diff, "%s", strerror(error));
00828                                         goto err;
00829                                 }
00830                                 tmp_prt->pseudo_target = type_map_lookup(diff, tmp_type, which_pol);
00831                                 qpol_role_trans_get_source_role(q, qrt, &tmp_role);
00832                                 qpol_role_get_name(q, tmp_role, &tmp_name);
00833                                 tmp_prt->source_role = tmp_name;
00834                                 qpol_role_trans_get_default_role(q, qrt, &tmp_role);
00835                                 qpol_role_get_name(q, tmp_role, &tmp_name);
00836                                 tmp_prt->default_role = tmp_name;
00837                                 if (apol_vector_append(v, tmp_prt)) {
00838                                         error = errno;
00839                                         ERR(diff, "%s", strerror(error));
00840                                         goto err;
00841                                 }
00842                                 tmp_prt = NULL;
00843                         }
00844                         qpol_iterator_destroy(&attr_types);
00845                 } else {
00846                         if (!(tmp_prt = calloc(1, sizeof(*tmp_prt)))) {
00847                                 error = errno;
00848                                 ERR(diff, "%s", strerror(error));
00849                                 goto err;
00850                         }
00851                         tmp_prt->pseudo_target = type_map_lookup(diff, tmp_type, which_pol);
00852                         qpol_role_trans_get_source_role(q, qrt, &tmp_role);
00853                         qpol_role_get_name(q, tmp_role, &tmp_name);
00854                         tmp_prt->source_role = tmp_name;
00855                         qpol_role_trans_get_default_role(q, qrt, &tmp_role);
00856                         qpol_role_get_name(q, tmp_role, &tmp_name);
00857                         tmp_prt->default_role = tmp_name;
00858                         if (apol_vector_append(v, tmp_prt)) {
00859                                 error = errno;
00860                                 ERR(diff, "%s", strerror(error));
00861                                 goto err;
00862                         }
00863                         tmp_prt = NULL;
00864                 }
00865         }
00866         qpol_iterator_destroy(&iter);
00867         apol_vector_sort_uniquify(v, pseudo_role_trans_comp, diff);
00868 
00869         return v;
00870 
00871       err:
00872         qpol_iterator_destroy(&iter);
00873         qpol_iterator_destroy(&attr_types);
00874         apol_vector_destroy(&v);
00875         free(tmp_prt);
00876         errno = error;
00877         return NULL;
00878 }

int role_trans_comp const void *  x,
const void *  y,
const poldiff_t diff
 

Compare two pseudo_role_trans_t objects, determining if they have the same source name and target or not.

Parameters:
x The role_transition from the original policy.
y The role_transition from the modified policy.
diff The policy difference structure associated with both policies.
Returns:
< 0, 0, or > 0 if source role of x is respectively less than, equal to, or greater than source role of y.

int role_trans_new_diff poldiff_t diff,
poldiff_form_e  form,
const void *  item
 

Create, initialize, and insert a new semantic difference entry for a role_transition rule.

Parameters:
diff The policy difference structure to which to add the entry.
form The form of the difference.
item Item for which the entry is being created.
Returns:
0 on success and < 0 on error; if the call fails, set errno and leave the policy difference structure unchanged.

Definition at line 920 of file rbac_diff.c.

References apol_vector_append(), pseudo_role_trans::default_role, diff, poldiff_role_trans_summary::diffs, ERR, make_rt_diff(), poldiff_role_trans::mod_default, poldiff_role_trans_summary::num_added, poldiff_role_trans_summary::num_added_type, poldiff_role_trans_summary::num_removed, poldiff_role_trans_summary::num_removed_type, poldiff_role_trans::orig_default, POLDIFF_FORM_ADD_TYPE, POLDIFF_FORM_ADDED, POLDIFF_FORM_MODIFIED, POLDIFF_FORM_NONE, POLDIFF_FORM_REMOVE_TYPE, POLDIFF_FORM_REMOVED, POLDIFF_POLICY_MOD, POLDIFF_POLICY_ORIG, poldiff_role_trans_t, poldiff_t, pseudo_role_trans_t, pseudo_role_trans::pseudo_target, poldiff::role_trans_diffs, role_trans_free(), pseudo_role_trans::source_role, and type_map_get_name().

00921 {
00922         const pseudo_role_trans_t *rt = item;
00923         poldiff_role_trans_t *prt = NULL;
00924         const char *tgt_name = NULL;
00925         int error = 0;
00926 
00927         /* get tgt_name from type_map */
00928         switch (form) {
00929         case POLDIFF_FORM_ADDED:
00930         {
00931                 tgt_name = type_map_get_name(diff, rt->pseudo_target, POLDIFF_POLICY_MOD);
00932                 if (type_map_get_name(diff, rt->pseudo_target, POLDIFF_POLICY_ORIG) == NULL) {
00933                         form = POLDIFF_FORM_ADD_TYPE;
00934                 }
00935                 break;
00936         }
00937         case POLDIFF_FORM_REMOVED:
00938         {
00939                 tgt_name = type_map_get_name(diff, rt->pseudo_target, POLDIFF_POLICY_ORIG);
00940                 if (type_map_get_name(diff, rt->pseudo_target, POLDIFF_POLICY_MOD) == NULL) {
00941                         form = POLDIFF_FORM_REMOVE_TYPE;
00942                 }
00943                 break;
00944         }
00945         case POLDIFF_FORM_MODIFIED:   /* not supported here */
00946         case POLDIFF_FORM_NONE:
00947         default:
00948         {
00949                 assert(0);
00950                 return -1;
00951         }
00952         }
00953         assert(tgt_name != NULL);
00954 
00955         /* create a new diff */
00956         prt = make_rt_diff(diff, form, rt->source_role, tgt_name);
00957         if (!prt)
00958                 return -1;
00959 
00960         /* set the appropriate default */
00961         switch (form) {
00962         case POLDIFF_FORM_ADDED:
00963         case POLDIFF_FORM_ADD_TYPE:
00964         {
00965                 prt->mod_default = rt->default_role;
00966                 break;
00967         }
00968         case POLDIFF_FORM_REMOVED:
00969         case POLDIFF_FORM_REMOVE_TYPE:
00970         {
00971                 prt->orig_default = rt->default_role;
00972                 break;
00973         }
00974         default:
00975         {
00976                 /* not reachable */
00977                 assert(0);
00978         }
00979         }
00980         if (apol_vector_append(diff->role_trans_diffs->diffs, prt)) {
00981                 error = errno;
00982                 ERR(diff, "%s", strerror(error));
00983                 role_trans_free(prt);
00984                 errno = error;
00985                 return -1;
00986         };
00987 
00988         /* increment appropriate counter */
00989         switch (form) {
00990         case POLDIFF_FORM_ADDED:
00991         {
00992                 diff->role_trans_diffs->num_added++;
00993                 break;
00994         }
00995         case POLDIFF_FORM_ADD_TYPE:
00996         {
00997                 diff->role_trans_diffs->num_added_type++;
00998                 break;
00999         }
01000         case POLDIFF_FORM_REMOVED:
01001         {
01002                 diff->role_trans_diffs->num_removed++;
01003                 break;
01004         }
01005         case POLDIFF_FORM_REMOVE_TYPE:
01006         {
01007                 diff->role_trans_diffs->num_removed_type++;
01008                 break;
01009         }
01010         default:
01011         {
01012                 /* not reachable */
01013                 assert(0);
01014         }
01015         }
01016 
01017         return 0;
01018 }

int role_trans_deep_diff poldiff_t diff,
const void *  x,
const void *  y
 

Compute the semantic difference of two role_transition rules for which the compare callback returns 0.

If a difference is found then allocate, initialize, and insert a new semantic difference entry for that role_transition rule.

Parameters:
diff The policy difference structure associated with both rules and to which to add an entry if needed.
x The role_transition rule from the original policy.
y The role_transition rule from the modified policy.
Returns:
0 on success and < 0 on error; if the call fails, set errno and leave the policy difference structure unchanged.

Definition at line 1020 of file rbac_diff.c.

References apol_vector_append(), pseudo_role_trans::default_role, diff, poldiff_role_trans_summary::diffs, ERR, make_rt_diff(), poldiff_role_trans::mod_default, poldiff_role_trans_summary::num_modified, poldiff_role_trans::orig_default, POLDIFF_FORM_MODIFIED, POLDIFF_POLICY_ORIG, poldiff_role_trans_t, poldiff_t, pseudo_role_trans_t, pseudo_role_trans::pseudo_target, poldiff::role_trans_diffs, role_trans_free(), pseudo_role_trans::source_role, and type_map_get_name().

01021 {
01022         const pseudo_role_trans_t *prt1 = x;
01023         const pseudo_role_trans_t *prt2 = y;
01024         const char *default1 = NULL, *default2 = NULL;
01025         poldiff_role_trans_t *rt = NULL;
01026         const char *tgt = NULL;
01027         int error = 0;
01028 
01029         default1 = prt1->default_role;
01030         default2 = prt2->default_role;
01031 
01032         if (!strcmp(default1, default2))
01033                 return 0;              /* no difference */
01034 
01035         tgt = type_map_get_name(diff, prt1->pseudo_target, POLDIFF_POLICY_ORIG);
01036         assert(tgt != NULL);
01037         rt = make_rt_diff(diff, POLDIFF_FORM_MODIFIED, prt1->source_role, tgt);
01038         if (!rt)
01039                 return -1;             /* errors already reported */
01040         rt->orig_default = default1;
01041         rt->mod_default = default2;
01042         if (apol_vector_append(diff->role_trans_diffs->diffs, rt)) {
01043                 error = errno;
01044                 ERR(diff, "%s", strerror(error));
01045                 role_trans_free(rt);
01046                 errno = error;
01047                 return -1;
01048         };
01049         diff->role_trans_diffs->num_modified++;
01050 
01051         return 0;
01052 }