Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright 2011 Tresys Technology, LLC. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are met:
      6  *
      7  *    1. Redistributions of source code must retain the above copyright notice,
      8  *       this list of conditions and the following disclaimer.
      9  *
     10  *    2. Redistributions in binary form must reproduce the above copyright notice,
     11  *       this list of conditions and the following disclaimer in the documentation
     12  *       and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
     15  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     16  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     17  * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     18  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     21  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     22  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  *
     25  * The views and conclusions contained in the software and documentation are those
     26  * of the authors and should not be interpreted as representing official policies,
     27  * either expressed or implied, of Tresys Technology, LLC.
     28  */
     29 
     30 #include <stdlib.h>
     31 #include <stdio.h>
     32 #include <string.h>
     33 
     34 #include "cil_internal.h"
     35 #include "cil_log.h"
     36 #include "cil_mem.h"
     37 #include "cil_tree.h"
     38 #include "cil_list.h"
     39 #include "cil_symtab.h"
     40 #include "cil_copy_ast.h"
     41 #include "cil_build_ast.h"
     42 #include "cil_strpool.h"
     43 
     44 struct cil_args_copy {
     45 	struct cil_tree_node *dest;
     46 	struct cil_db *db;
     47 };
     48 
     49 void cil_copy_list(struct cil_list *data, struct cil_list **copy)
     50 {
     51 	struct cil_list *new;
     52 	struct cil_list_item *orig_item;
     53 
     54 	cil_list_init(&new, data->flavor);
     55 
     56 	cil_list_for_each(orig_item, data) {
     57 		switch (orig_item->flavor) {
     58 		case CIL_STRING:
     59 			cil_list_append(new, CIL_STRING, orig_item->data);
     60 			break;
     61 		case CIL_LIST: {
     62 			struct cil_list *new_sub = NULL;
     63 			cil_copy_list((struct cil_list*)orig_item->data, &new_sub);
     64 			cil_list_append(new, CIL_LIST, new_sub);
     65 			break;
     66 		}
     67 		case CIL_PARAM: {
     68 			struct cil_param *po = orig_item->data;
     69 			struct cil_param *pn;
     70 			cil_param_init(&pn);
     71 			pn->str = po->str;
     72 			pn->flavor = po->flavor;
     73 			cil_list_append(new, CIL_PARAM, pn);
     74 		}
     75 			break;
     76 
     77 		default:
     78 			cil_list_append(new, orig_item->flavor, orig_item->data);
     79 			break;
     80 		}
     81 	}
     82 
     83 	*copy = new;
     84 }
     85 
     86 int cil_copy_node(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
     87 {
     88 	char *new = NULL;
     89 
     90 	if (data != NULL) {
     91 		new = data;
     92 	}
     93 	*copy = new;
     94 
     95 	return SEPOL_OK;
     96 }
     97 
     98 int cil_copy_block(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
     99 {
    100 	struct cil_block *orig = data;
    101 	char *key = orig->datum.name;
    102 	struct cil_symtab_datum *datum = NULL;
    103 
    104 	cil_symtab_get_datum(symtab, key, &datum);
    105 	if (datum == NULL) {
    106 		struct cil_block *new;
    107 		cil_block_init(&new);
    108 		*copy = new;
    109 	} else {
    110 		*copy = datum;;
    111 	}
    112 
    113 	return SEPOL_OK;
    114 }
    115 
    116 int cil_copy_blockabstract(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    117 {
    118 	struct cil_blockabstract *orig = data;
    119 	struct cil_blockabstract *new = NULL;
    120 
    121 	cil_blockabstract_init(&new);
    122 
    123 	new->block_str = orig->block_str;
    124 
    125 	*copy = new;
    126 
    127 	return SEPOL_OK;
    128 }
    129 
    130 int cil_copy_blockinherit(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    131 {
    132 	struct cil_blockinherit *orig = data;
    133 	struct cil_blockinherit *new = NULL;
    134 
    135 	cil_blockinherit_init(&new);
    136 
    137 	new->block_str = orig->block_str;
    138 	new->block = orig->block;
    139 
    140 	*copy = new;
    141 
    142 	return SEPOL_OK;
    143 }
    144 
    145 int cil_copy_policycap(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    146 {
    147 	struct cil_policycap *orig = data;
    148 	char *key = orig->datum.name;
    149 	struct cil_symtab_datum *datum = NULL;
    150 
    151 	cil_symtab_get_datum(symtab, key, &datum);
    152 	if (datum == NULL) {
    153 		struct cil_policycap *new;
    154 		cil_policycap_init(&new);
    155 		*copy = new;
    156 	} else {
    157 		*copy = datum;
    158 	}
    159 
    160 	return SEPOL_OK;
    161 }
    162 
    163 int cil_copy_perm(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    164 {
    165 	struct cil_perm *orig = data;
    166 	char *key = orig->datum.name;
    167 	struct cil_symtab_datum *datum = NULL;
    168 
    169 	cil_symtab_get_datum(symtab, key, &datum);
    170 	if (datum == NULL) {
    171 		struct cil_perm *new;
    172 		cil_perm_init(&new);
    173 		*copy = new;
    174 	} else {
    175 		*copy = datum;
    176 	}
    177 
    178 	return SEPOL_OK;
    179 }
    180 
    181 void cil_copy_classperms(struct cil_classperms *orig, struct cil_classperms **new)
    182 {
    183 	cil_classperms_init(new);
    184 	(*new)->class_str = orig->class_str;
    185 	cil_copy_list(orig->perm_strs, &((*new)->perm_strs));
    186 }
    187 
    188 void cil_copy_classperms_set(struct cil_classperms_set *orig, struct cil_classperms_set **new)
    189 {
    190 	cil_classperms_set_init(new);
    191 	(*new)->set_str = orig->set_str;
    192 }
    193 
    194 void cil_copy_classperms_list(struct cil_list *orig, struct cil_list **new)
    195 {
    196 	struct cil_list_item *orig_item;
    197 
    198 	if (orig == NULL) {
    199 		return;
    200 	}
    201 
    202 	cil_list_init(new, CIL_LIST_ITEM);
    203 	cil_list_for_each(orig_item, orig) {
    204 		if (orig_item->flavor == CIL_CLASSPERMS) {
    205 			struct cil_classperms *cp;
    206 			cil_copy_classperms(orig_item->data, &cp);
    207 			cil_list_append(*new, CIL_CLASSPERMS, cp);
    208 		} else {
    209 			struct cil_classperms_set *cp_set;
    210 			cil_copy_classperms_set(orig_item->data, &cp_set);
    211 			cil_list_append(*new, CIL_CLASSPERMS_SET, cp_set);
    212 		}
    213 	}
    214 }
    215 
    216 int cil_copy_classmapping(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    217 {
    218 	struct cil_classmapping *orig = data;
    219 	struct cil_classmapping *new = NULL;
    220 
    221 	cil_classmapping_init(&new);
    222 
    223 	new->map_class_str = orig->map_class_str;
    224 	new->map_perm_str = orig->map_perm_str;
    225 
    226 	cil_copy_classperms_list(orig->classperms, &new->classperms);
    227 
    228 	*copy = new;
    229 
    230 	return SEPOL_OK;
    231 }
    232 
    233 int cil_copy_class(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    234 {
    235 	struct cil_class *orig = data;
    236 	struct cil_class *new = NULL;
    237 	char *key = orig->datum.name;
    238 	struct cil_symtab_datum *datum = NULL;
    239 
    240 	cil_symtab_get_datum(symtab, key, &datum);
    241 	if (datum != NULL) {
    242 		cil_log(CIL_INFO, "cil_copy_class: class cannot be redefined\n");
    243 		return SEPOL_ERR;
    244 	}
    245 
    246 	cil_class_init(&new);
    247 
    248 	new->common = NULL;
    249 
    250 	*copy = new;
    251 
    252 	return SEPOL_OK;
    253 }
    254 
    255 int cil_copy_classorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    256 {
    257 	struct cil_classorder *orig = data;
    258 	struct cil_classorder *new = NULL;
    259 
    260 	cil_classorder_init(&new);
    261 	if (orig->class_list_str != NULL) {
    262 		cil_copy_list(orig->class_list_str, &new->class_list_str);
    263 	}
    264 
    265 	*copy = new;
    266 
    267 	return SEPOL_OK;
    268 }
    269 
    270 int cil_copy_classpermission(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    271 {
    272 	struct cil_classpermission *orig = data;
    273 	struct cil_classpermission *new = NULL;
    274 	char *key = orig->datum.name;
    275 	struct cil_symtab_datum *datum = NULL;
    276 
    277 	if (key != NULL) {
    278 		cil_symtab_get_datum(symtab, key, &datum);
    279 		if (datum != NULL) {
    280 			cil_log(CIL_INFO, "classpermission cannot be redefined\n");
    281 			return SEPOL_ERR;
    282 		}
    283 	}
    284 
    285 	cil_copy_classperms_list(orig->classperms, &new->classperms);
    286 
    287 	*copy = new;
    288 
    289 	return SEPOL_OK;
    290 }
    291 
    292 int cil_copy_classpermissionset(__attribute__((unused)) struct cil_db *db, void *data, void **copy,  __attribute__((unused)) symtab_t *symtab)
    293 {
    294 	struct cil_classpermissionset *orig = data;
    295 	struct cil_classpermissionset *new = NULL;
    296 
    297 	new->set_str = orig->set_str;
    298 
    299 	cil_copy_classperms_list(orig->classperms, &new->classperms);
    300 
    301 	*copy = new;
    302 
    303 	return SEPOL_OK;
    304 }
    305 
    306 int cil_copy_classcommon(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    307 {
    308 	struct cil_classcommon *orig = data;
    309 	struct cil_classcommon *new = NULL;
    310 
    311 	cil_classcommon_init(&new);
    312 
    313 	new->class_str = orig->class_str;
    314 	new->common_str = orig->common_str;
    315 
    316 	*copy = new;
    317 
    318 	return SEPOL_OK;
    319 }
    320 
    321 int cil_copy_sid(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    322 {
    323 	struct cil_sid *orig = data;
    324 	char *key = orig->datum.name;
    325 	struct cil_symtab_datum *datum = NULL;
    326 
    327 	cil_symtab_get_datum(symtab, key, &datum);
    328 	if (datum == NULL) {
    329 		struct cil_sid *new;
    330 		cil_sid_init(&new);
    331 		*copy = new;
    332 	} else {
    333 		*copy = datum;
    334 	}
    335 
    336 	return SEPOL_OK;
    337 }
    338 
    339 int cil_copy_sidcontext(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    340 {
    341 	struct cil_sidcontext *orig = data;
    342 	struct cil_sidcontext *new = NULL;
    343 
    344 	cil_sidcontext_init(&new);
    345 
    346 	if (orig->context_str != NULL) {
    347 		new->context_str = orig->context_str;
    348 	} else {
    349 		cil_context_init(&new->context);
    350 		cil_copy_fill_context(db, orig->context, new->context);
    351 	}
    352 
    353 	*copy = new;
    354 
    355 	return SEPOL_OK;
    356 }
    357 
    358 int cil_copy_sidorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    359 {
    360 	struct cil_sidorder *orig = data;
    361 	struct cil_sidorder *new = NULL;
    362 
    363 	cil_sidorder_init(&new);
    364 	if (orig->sid_list_str != NULL) {
    365 		cil_copy_list(orig->sid_list_str, &new->sid_list_str);
    366 	}
    367 
    368 	*copy = new;
    369 
    370 	return SEPOL_OK;
    371 }
    372 
    373 int cil_copy_user(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    374 {
    375 	struct cil_user *orig = data;
    376 	char *key = orig->datum.name;
    377 	struct cil_symtab_datum *datum = NULL;
    378 
    379 	cil_symtab_get_datum(symtab, key, &datum);
    380 	if (datum == NULL) {
    381 		struct cil_user *new;
    382 		cil_user_init(&new);
    383 		*copy = new;
    384 	} else {
    385 		*copy = datum;
    386 	}
    387 
    388 	return SEPOL_OK;
    389 }
    390 
    391 int cil_copy_userrole(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    392 {
    393 	struct cil_userrole *orig = data;
    394 	struct cil_userrole *new = NULL;
    395 
    396 	cil_userrole_init(&new);
    397 
    398 	new->user_str = orig->user_str;
    399 	new->role_str = orig->role_str;
    400 
    401 	*copy = new;
    402 
    403 	return SEPOL_OK;
    404 }
    405 
    406 int cil_copy_userlevel(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    407 {
    408 	struct cil_userlevel *orig = data;
    409 	struct cil_userlevel *new = NULL;
    410 
    411 	cil_userlevel_init(&new);
    412 
    413 	new->user_str = orig->user_str;
    414 
    415 	if (orig->level_str != NULL) {
    416 		new->level_str = orig->level_str;
    417 	} else {
    418 		cil_copy_fill_level(db, orig->level, &new->level);
    419 	}
    420 
    421 	*copy = new;
    422 
    423 	return SEPOL_OK;
    424 }
    425 
    426 int cil_copy_userrange(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    427 {
    428 	struct cil_userrange *orig = data;
    429 	struct cil_userrange *new = NULL;
    430 
    431 	cil_userrange_init(&new);
    432 
    433 	new->user_str = orig->user_str;
    434 
    435 	if (orig->range_str != NULL) {
    436 		new->range_str = orig->range_str;
    437 	} else {
    438 		cil_levelrange_init(&new->range);
    439 		cil_copy_fill_levelrange(db, orig->range, new->range);
    440 	}
    441 
    442 	*copy = new;
    443 
    444 	return SEPOL_OK;
    445 }
    446 
    447 int cil_copy_userprefix(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    448 {
    449 	struct cil_userprefix *orig = data;
    450 	struct cil_userprefix *new = NULL;
    451 
    452 	cil_userprefix_init(&new);
    453 
    454 	new->user_str = orig->user_str;
    455 	new->prefix_str = orig->prefix_str;
    456 
    457 	*copy = new;
    458 
    459 	return SEPOL_OK;
    460 }
    461 
    462 int cil_copy_role(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    463 {
    464 	struct cil_role *orig = data;
    465 	char *key = orig->datum.name;
    466 	struct cil_symtab_datum *datum = NULL;
    467 
    468 	cil_symtab_get_datum(symtab, key, &datum);
    469 	if (datum == NULL) {
    470 		struct cil_role *new;
    471 		cil_role_init(&new);
    472 		*copy = new;
    473 	} else {
    474 		*copy = datum;
    475 	}
    476 
    477 	return SEPOL_OK;
    478 }
    479 
    480 int cil_copy_roletype(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    481 {
    482 	struct cil_roletype *orig = data;
    483 	struct cil_roletype *new = NULL;
    484 
    485 	cil_roletype_init(&new);
    486 
    487 	new->role_str = orig->role_str;
    488 	new->type_str = orig->type_str;
    489 
    490 	*copy = new;
    491 
    492 	return SEPOL_OK;
    493 }
    494 
    495 int cil_copy_roleattribute(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    496 {
    497 	struct cil_roleattribute *orig = data;
    498 	char *key = orig->datum.name;
    499 	struct cil_symtab_datum *datum = NULL;
    500 
    501 	cil_symtab_get_datum(symtab, key, &datum);
    502 	if (datum == NULL) {
    503 		struct cil_roleattribute *new;
    504 		cil_roleattribute_init(&new);
    505 		*copy = new;
    506 	} else {
    507 		*copy = datum;
    508 	}
    509 
    510 	return SEPOL_OK;
    511 }
    512 
    513 int cil_copy_roleattributeset(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    514 {
    515 	struct cil_roleattributeset *orig = data;
    516 	struct cil_roleattributeset *new = NULL;
    517 
    518 	cil_roleattributeset_init(&new);
    519 
    520 	new->attr_str = orig->attr_str;
    521 
    522 	cil_copy_expr(db, orig->str_expr, &new->str_expr);
    523 	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
    524 
    525 	*copy = new;
    526 
    527 	return SEPOL_OK;
    528 }
    529 
    530 int cil_copy_roleallow(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    531 {
    532 	struct cil_roleallow *orig = data;
    533 	struct cil_roleallow *new = NULL;
    534 
    535 	cil_roleallow_init(&new);
    536 
    537 	new->src_str = orig->src_str;
    538 	new->tgt_str = orig->tgt_str;
    539 
    540 	*copy = new;
    541 
    542 	return SEPOL_OK;
    543 }
    544 
    545 int cil_copy_type(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    546 {
    547 	struct cil_type *orig = data;
    548 	char *key = orig->datum.name;
    549 	struct cil_symtab_datum *datum = NULL;
    550 
    551 	cil_symtab_get_datum(symtab, key, &datum);
    552 	if (datum == NULL) {
    553 		struct cil_type *new;
    554 		cil_type_init(&new);
    555 		*copy = new;
    556 	} else {
    557 		*copy = datum;
    558 	}
    559 
    560 	return SEPOL_OK;
    561 }
    562 
    563 int cil_copy_typepermissive(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    564 {
    565 	struct cil_typepermissive *orig = data;
    566 	struct cil_typepermissive *new = NULL;
    567 
    568 	cil_typepermissive_init(&new);
    569 
    570 	new->type_str = orig->type_str;
    571 
    572 	*copy = new;
    573 
    574 	return SEPOL_OK;
    575 }
    576 
    577 int cil_copy_typeattribute(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    578 {
    579 	struct cil_typeattribute *orig = data;
    580 	char *key = orig->datum.name;
    581 	struct cil_symtab_datum *datum = NULL;
    582 
    583 	cil_symtab_get_datum(symtab, key, &datum);
    584 	if (datum == NULL) {
    585 		struct cil_typeattribute *new;
    586 		cil_typeattribute_init(&new);
    587 		*copy = new;
    588 	} else {
    589 		*copy = datum;
    590 	}
    591 
    592 	return SEPOL_OK;
    593 }
    594 
    595 int cil_copy_typeattributeset(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    596 {
    597 	struct cil_typeattributeset *orig = data;
    598 	struct cil_typeattributeset *new = NULL;
    599 
    600 	cil_typeattributeset_init(&new);
    601 
    602 	new->attr_str = orig->attr_str;
    603 
    604 	cil_copy_expr(db, orig->str_expr, &new->str_expr);
    605 	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
    606 
    607 	*copy = new;
    608 
    609 	return SEPOL_OK;
    610 }
    611 
    612 int cil_copy_alias(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    613 {
    614 	struct cil_alias *orig = data;
    615 	struct cil_alias *new = NULL;
    616 	char *key = orig->datum.name;
    617 	struct cil_symtab_datum *datum = NULL;
    618 
    619 	cil_symtab_get_datum(symtab, key, &datum);
    620 	if (datum != NULL) {
    621 		cil_log(CIL_INFO, "cil_copy_alias: alias cannot be redefined\n");
    622 		return SEPOL_ERR;
    623 	}
    624 
    625 	cil_alias_init(&new);
    626 
    627 	*copy = new;
    628 
    629 	return SEPOL_OK;
    630 }
    631 
    632 int cil_copy_aliasactual(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused))symtab_t *symtab)
    633 {
    634 	struct cil_aliasactual *orig = data;
    635 	struct cil_aliasactual *new = NULL;
    636 
    637 	cil_aliasactual_init(&new);
    638 
    639 	new->alias_str = orig->alias_str;
    640 	new->actual_str = orig->actual_str;
    641 
    642 	*copy = new;
    643 
    644 	return SEPOL_OK;
    645 }
    646 
    647 int cil_copy_roletransition(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    648 {
    649 	struct cil_roletransition *orig = data;
    650 	struct cil_roletransition *new = NULL;
    651 
    652 	cil_roletransition_init(&new);
    653 
    654 	new->src_str = orig->src_str;
    655 	new->tgt_str = orig->tgt_str;
    656 	new->obj_str = orig->obj_str;
    657 	new->result_str = orig->result_str;
    658 
    659 	*copy = new;
    660 
    661 	return SEPOL_OK;
    662 }
    663 
    664 int cil_copy_nametypetransition(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    665 {
    666 	struct cil_nametypetransition *orig = data;
    667 	struct cil_nametypetransition *new = NULL;
    668 
    669 	cil_nametypetransition_init(&new);
    670 
    671 	new->src_str = orig->src_str;
    672 	new->tgt_str = orig->tgt_str;
    673 	new->obj_str = orig->obj_str;
    674 	new->name_str = orig->name_str;
    675 	new->result_str = orig->result_str;
    676 
    677 
    678 	*copy = new;
    679 
    680 	return SEPOL_OK;
    681 }
    682 
    683 int cil_copy_rangetransition(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    684 {
    685 	struct cil_rangetransition *orig = data;
    686 	struct cil_rangetransition *new = NULL;
    687 
    688 	cil_rangetransition_init(&new);
    689 
    690 	new->src_str = orig->src_str;
    691 	new->exec_str = orig->exec_str;
    692 	new->obj_str = orig->obj_str;
    693 
    694 	if (orig->range_str != NULL) {
    695 		new->range_str = orig->range_str;
    696 	} else {
    697 		cil_levelrange_init(&new->range);
    698 		cil_copy_fill_levelrange(db, orig->range, new->range);
    699 	}
    700 
    701 	*copy = new;
    702 
    703 	return SEPOL_OK;
    704 }
    705 
    706 int cil_copy_bool(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    707 {
    708 	struct cil_bool *orig = data;
    709 	struct cil_bool *new = NULL;
    710 	char *key = orig->datum.name;
    711 	struct cil_symtab_datum *datum = NULL;
    712 
    713 	cil_symtab_get_datum(symtab, key, &datum);
    714 	if (datum != NULL) {
    715 		cil_log(CIL_INFO, "cil_copy_bool: boolean cannot be redefined\n");
    716 		return SEPOL_ERR;
    717 	}
    718 
    719 	cil_bool_init(&new);
    720 	new->value = orig->value;
    721 	*copy = new;
    722 
    723 	return SEPOL_OK;
    724 }
    725 
    726 int cil_copy_tunable(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    727 {
    728 	struct cil_tunable *orig = data;
    729 	struct cil_tunable *new = NULL;
    730 	char *key = orig->datum.name;
    731 	struct cil_symtab_datum *datum = NULL;
    732 
    733 	cil_symtab_get_datum(symtab, key, &datum);
    734 	if (datum != NULL) {
    735 		cil_log(CIL_INFO, "cil_copy_tunable: tunable cannot be redefined\n");
    736 		return SEPOL_ERR;
    737 	}
    738 
    739 	cil_tunable_init(&new);
    740 	new->value = orig->value;
    741 	*copy = new;
    742 
    743 	return SEPOL_OK;
    744 }
    745 
    746 int cil_copy_avrule(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    747 {
    748 	struct cil_avrule *orig = data;
    749 	struct cil_avrule *new = NULL;
    750 
    751 	cil_avrule_init(&new);
    752 
    753 	new->rule_kind = orig->rule_kind;
    754 	new->src_str = orig->src_str;
    755 	new->tgt_str = orig->tgt_str;
    756 	cil_copy_classperms_list(orig->classperms, &new->classperms);
    757 
    758 	*copy = new;
    759 
    760 	return SEPOL_OK;
    761 }
    762 
    763 int cil_copy_type_rule(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    764 {
    765 	struct cil_type_rule  *orig = data;
    766 	struct cil_type_rule *new = NULL;
    767 
    768 	cil_type_rule_init(&new);
    769 
    770 	new->rule_kind = orig->rule_kind;
    771 	new->src_str = orig->src_str;
    772 	new->tgt_str = orig->tgt_str;
    773 	new->obj_str = orig->obj_str;
    774 	new->result_str = orig->result_str;
    775 
    776 	*copy = new;
    777 
    778 	return SEPOL_OK;
    779 }
    780 
    781 int cil_copy_sens(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    782 {
    783 	struct cil_sens *orig = data;
    784 	char *key = orig->datum.name;
    785 	struct cil_symtab_datum *datum = NULL;
    786 
    787 	cil_symtab_get_datum(symtab, key, &datum);
    788 	if (datum == NULL) {
    789 		struct cil_sens *new;
    790 		cil_sens_init(&new);
    791 		*copy = new;
    792 	} else {
    793 		*copy = datum;
    794 	}
    795 
    796 	return SEPOL_OK;
    797 }
    798 
    799 int cil_copy_cat(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    800 {
    801 	struct cil_cat *orig = data;
    802 	char *key = orig->datum.name;
    803 	struct cil_symtab_datum *datum = NULL;
    804 
    805 	cil_symtab_get_datum(symtab, key, &datum);
    806 	if (datum == NULL) {
    807 		struct cil_cat *new;
    808 		cil_cat_init(&new);
    809 		*copy = new;
    810 	} else {
    811 		*copy = datum;
    812 	}
    813 
    814 	return SEPOL_OK;
    815 }
    816 
    817 void cil_copy_cats(struct cil_db *db, struct cil_cats *orig, struct cil_cats **new)
    818 {
    819 	cil_cats_init(new);
    820 	cil_copy_expr(db, orig->str_expr, &(*new)->str_expr);
    821 	cil_copy_expr(db, orig->datum_expr, &(*new)->datum_expr);
    822 }
    823 
    824 int cil_copy_catset(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    825 {
    826 	struct cil_catset *orig = data;
    827 	struct cil_catset *new = NULL;
    828 	char *key = orig->datum.name;
    829 	struct cil_symtab_datum *datum = NULL;
    830 
    831 	cil_symtab_get_datum(symtab, key, &datum);
    832 	if (datum != NULL) {
    833 		cil_log(CIL_INFO, "cil_copy_catset: categoryset cannot be redefined\n");
    834 		return SEPOL_ERR;
    835 	}
    836 
    837 	cil_catset_init(&new);
    838 
    839 	cil_copy_cats(db, orig->cats, &new->cats);
    840 
    841 	*copy = new;
    842 
    843 	return SEPOL_OK;
    844 }
    845 
    846 int cil_copy_senscat(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    847 {
    848 	struct cil_senscat *orig = data;
    849 	struct cil_senscat *new = NULL;
    850 
    851 	cil_senscat_init(&new);
    852 
    853 	new->sens_str = orig->sens_str;
    854 
    855 	cil_copy_cats(db, orig->cats, &new->cats);
    856 
    857 	*copy = new;
    858 
    859 	return SEPOL_OK;
    860 }
    861 
    862 int cil_copy_catorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    863 {
    864 	struct cil_catorder *orig = data;
    865 	struct cil_catorder *new = NULL;
    866 
    867 	cil_catorder_init(&new);
    868 	if (orig->cat_list_str != NULL) {
    869 		cil_copy_list(orig->cat_list_str, &new->cat_list_str);
    870 	}
    871 
    872 	*copy = new;
    873 
    874 	return SEPOL_OK;
    875 }
    876 
    877 int cil_copy_sensitivityorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
    878 {
    879 	struct cil_sensorder *orig = data;
    880 	struct cil_sensorder *new = NULL;
    881 
    882 	cil_sensorder_init(&new);
    883 	if (orig->sens_list_str != NULL) {
    884 		cil_copy_list(orig->sens_list_str, &new->sens_list_str);
    885 	}
    886 
    887 	*copy = new;
    888 
    889 	return SEPOL_OK;
    890 }
    891 
    892 void cil_copy_fill_level(struct cil_db *db, struct cil_level *orig, struct cil_level **new)
    893 {
    894 	cil_level_init(new);
    895 
    896 	(*new)->sens_str = orig->sens_str;
    897 
    898 	if (orig->cats != NULL) {
    899 		cil_copy_cats(db, orig->cats, &(*new)->cats);
    900 	}
    901 }
    902 
    903 int cil_copy_level(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    904 {
    905 	struct cil_level *orig = data;
    906 	struct cil_level *new = NULL;
    907 	char *key = orig->datum.name;
    908 	struct cil_symtab_datum *datum = NULL;
    909 
    910 	if (key != NULL) {
    911 		cil_symtab_get_datum(symtab, key, &datum);
    912 		if (datum != NULL) {
    913 			cil_log(CIL_INFO, "cil_copy_level: level cannot be redefined\n");
    914 			return SEPOL_ERR;
    915 		}
    916 	}
    917 
    918 	cil_copy_fill_level(db, orig, &new);
    919 
    920 	*copy = new;
    921 
    922 	return SEPOL_OK;
    923 }
    924 
    925 void cil_copy_fill_levelrange(struct cil_db *db, struct cil_levelrange *data, struct cil_levelrange *new)
    926 {
    927 	if (data->low_str != NULL) {
    928 		new->low_str = data->low_str;
    929 	} else {
    930 		cil_copy_fill_level(db, data->low, &new->low);
    931 	}
    932 
    933 	if (data->high_str != NULL) {
    934 		new->high_str = data->high_str;
    935 	} else {
    936 		cil_copy_fill_level(db, data->high, &new->high);
    937 	}
    938 }
    939 
    940 int cil_copy_levelrange(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    941 {
    942 	struct cil_levelrange *orig = data;
    943 	struct cil_levelrange *new = NULL;
    944 	char *key = orig->datum.name;
    945 	struct cil_symtab_datum *datum = NULL;
    946 
    947 	if (key != NULL) {
    948 		cil_symtab_get_datum(symtab, key, &datum);
    949 		if (datum != NULL) {
    950 			cil_log(CIL_INFO, "cil_copy_levelrange: levelrange cannot be redefined\n");
    951 			return SEPOL_ERR;
    952 		}
    953 	}
    954 
    955 	cil_levelrange_init(&new);
    956 	cil_copy_fill_levelrange(db, orig, new);
    957 
    958 	*copy = new;
    959 
    960 	return SEPOL_OK;
    961 }
    962 
    963 void cil_copy_fill_context(struct cil_db *db, struct cil_context *data, struct cil_context *new)
    964 {
    965 	new->user_str = data->user_str;
    966 	new->role_str = data->role_str;
    967 	new->type_str = data->type_str;
    968 
    969 	if (data->range_str != NULL) {
    970 		new->range_str = data->range_str;
    971 	} else {
    972 		cil_levelrange_init(&new->range);
    973 		cil_copy_fill_levelrange(db, data->range, new->range);
    974 	}
    975 }
    976 
    977 int cil_copy_context(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
    978 {
    979 	struct cil_context *orig = data;
    980 	struct cil_context *new = NULL;
    981 	char *key = orig->datum.name;
    982 	struct cil_symtab_datum *datum = NULL;
    983 
    984 	if (key != NULL) {
    985 		cil_symtab_get_datum(symtab, key, &datum);
    986 		if (datum != NULL) {
    987 			cil_log(CIL_INFO, "cil_copy_context: context cannot be redefined\n");
    988 			return SEPOL_ERR;
    989 		}
    990 	}
    991 
    992 	cil_context_init(&new);
    993 	cil_copy_fill_context(db, orig, new);
    994 
    995 	*copy = new;
    996 
    997 	return SEPOL_OK;
    998 }
    999 
   1000 int cil_copy_netifcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1001 {
   1002 	struct cil_netifcon *orig = data;
   1003 	struct cil_netifcon *new = NULL;
   1004 
   1005 	cil_netifcon_init(&new);
   1006 
   1007 	new->interface_str = orig->interface_str;
   1008 
   1009 	if (orig->if_context_str != NULL) {
   1010 		new->if_context_str = orig->if_context_str;
   1011 	} else {
   1012 		cil_context_init(&new->if_context);
   1013 		cil_copy_fill_context(db, orig->if_context, new->if_context);
   1014 	}
   1015 
   1016 	if (orig->packet_context_str != NULL) {
   1017 		new->packet_context_str = orig->packet_context_str;
   1018 	} else {
   1019 		cil_context_init(&new->packet_context);
   1020 		cil_copy_fill_context(db, orig->packet_context, new->packet_context);
   1021 	}
   1022 
   1023 	*copy = new;
   1024 
   1025 	return SEPOL_OK;
   1026 }
   1027 
   1028 int cil_copy_genfscon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1029 {
   1030 	struct cil_genfscon *orig = data;
   1031 	struct cil_genfscon *new = NULL;
   1032 
   1033 	cil_genfscon_init(&new);
   1034 
   1035 	new->fs_str = orig->fs_str;
   1036 	new->path_str = orig->path_str;
   1037 
   1038 	if (orig->context_str != NULL) {
   1039 		new->context_str = orig->context_str;
   1040 	} else {
   1041 		cil_context_init(&new->context);
   1042 		cil_copy_fill_context(db, orig->context, new->context);
   1043 	}
   1044 
   1045 	*copy = new;
   1046 
   1047 	return SEPOL_OK;
   1048 }
   1049 
   1050 int cil_copy_filecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1051 {
   1052 	struct cil_filecon *orig = data;
   1053 	struct cil_filecon *new = NULL;
   1054 
   1055 	cil_filecon_init(&new);
   1056 
   1057 	new->path_str = orig->path_str;
   1058 	new->type = orig->type;
   1059 
   1060 	if (orig->context_str != NULL) {
   1061 		new->context_str = orig->context_str;
   1062 	} else if (orig->context != NULL) {
   1063 		cil_context_init(&new->context);
   1064 		cil_copy_fill_context(db, orig->context, new->context);
   1065 	}
   1066 
   1067 	*copy = new;
   1068 
   1069 	return SEPOL_OK;
   1070 }
   1071 
   1072 int cil_copy_nodecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1073 {
   1074 	struct cil_nodecon *orig = data;
   1075 	struct cil_nodecon *new = NULL;
   1076 
   1077 	cil_nodecon_init(&new);
   1078 
   1079 	if (orig->addr_str != NULL) {
   1080 		new->addr_str = orig->addr_str;
   1081 	} else {
   1082 		cil_ipaddr_init(&new->addr);
   1083 		cil_copy_fill_ipaddr(orig->addr, new->addr);
   1084 	}
   1085 
   1086 	if (orig->mask_str != NULL) {
   1087 		new->mask_str = orig->mask_str;
   1088 	} else {
   1089 		cil_ipaddr_init(&new->mask);
   1090 		cil_copy_fill_ipaddr(orig->mask, new->mask);
   1091 	}
   1092 
   1093 	if (orig->context_str != NULL) {
   1094 		new->context_str = orig->context_str;
   1095 	} else {
   1096 		cil_context_init(&new->context);
   1097 		cil_copy_fill_context(db, orig->context, new->context);
   1098 	}
   1099 
   1100 	*copy = new;
   1101 
   1102 	return SEPOL_OK;
   1103 }
   1104 
   1105 int cil_copy_portcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1106 {
   1107 	struct cil_portcon *orig = data;
   1108 	struct cil_portcon *new = NULL;
   1109 
   1110 	cil_portcon_init(&new);
   1111 
   1112 	new->proto = orig->proto;
   1113 	new->port_low = orig->port_low;
   1114 	new->port_high = orig->port_high;
   1115 
   1116 	if (orig->context_str != NULL) {
   1117 		new->context_str = orig->context_str;
   1118 	} else {
   1119 		cil_context_init(&new->context);
   1120 		cil_copy_fill_context(db, orig->context, new->context);
   1121 	}
   1122 
   1123 	*copy = new;
   1124 
   1125 	return SEPOL_OK;
   1126 }
   1127 
   1128 int cil_copy_pirqcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1129 {
   1130 	struct cil_pirqcon *orig = data;
   1131 	struct cil_pirqcon *new = NULL;
   1132 
   1133 	cil_pirqcon_init(&new);
   1134 
   1135 	new->pirq = orig->pirq;
   1136 
   1137 	if (orig->context_str != NULL) {
   1138 		new->context_str = orig->context_str;
   1139 	} else {
   1140 		cil_context_init(&new->context);
   1141 		cil_copy_fill_context(db, orig->context, new->context);
   1142 	}
   1143 
   1144 	*copy = new;
   1145 
   1146 	return SEPOL_OK;
   1147 }
   1148 
   1149 int cil_copy_iomemcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1150 {
   1151 	struct cil_iomemcon *orig = data;
   1152 	struct cil_iomemcon *new = NULL;
   1153 
   1154 	cil_iomemcon_init(&new);
   1155 
   1156 	new->iomem_low = orig->iomem_low;
   1157 	new->iomem_high = orig->iomem_high;
   1158 
   1159 	if (orig->context_str != NULL) {
   1160 		new->context_str = orig->context_str;
   1161 	} else {
   1162 		cil_context_init(&new->context);
   1163 		cil_copy_fill_context(db, orig->context, new->context);
   1164 	}
   1165 
   1166 	*copy = new;
   1167 
   1168 	return SEPOL_OK;
   1169 }
   1170 
   1171 int cil_copy_ioportcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1172 {
   1173 	struct cil_ioportcon *orig = data;
   1174 	struct cil_ioportcon *new = NULL;
   1175 
   1176 	cil_ioportcon_init(&new);
   1177 
   1178 	new->ioport_low = orig->ioport_low;
   1179 	new->ioport_high = orig->ioport_high;
   1180 
   1181 	if (orig->context_str != NULL) {
   1182 		new->context_str = orig->context_str;
   1183 	} else {
   1184 		cil_context_init(&new->context);
   1185 		cil_copy_fill_context(db, orig->context, new->context);
   1186 	}
   1187 
   1188 	*copy = new;
   1189 
   1190 	return SEPOL_OK;
   1191 }
   1192 
   1193 int cil_copy_pcidevicecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1194 {
   1195 	struct cil_pcidevicecon *orig = data;
   1196 	struct cil_pcidevicecon *new = NULL;
   1197 
   1198 	cil_pcidevicecon_init(&new);
   1199 
   1200 	new->dev = orig->dev;
   1201 
   1202 	if (orig->context_str != NULL) {
   1203 		new->context_str = orig->context_str;
   1204 	} else {
   1205 		cil_context_init(&new->context);
   1206 		cil_copy_fill_context(db, orig->context, new->context);
   1207 	}
   1208 
   1209 	*copy = new;
   1210 
   1211 	return SEPOL_OK;
   1212 }
   1213 
   1214 int cil_copy_devicetreecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1215 {
   1216 	struct cil_devicetreecon *orig = data;
   1217 	struct cil_devicetreecon *new = NULL;
   1218 
   1219 	cil_devicetreecon_init(&new);
   1220 
   1221 	new->path = orig->path;
   1222 
   1223 	if (orig->context_str != NULL) {
   1224 		new->context_str = orig->context_str;
   1225 	} else {
   1226 		cil_context_init(&new->context);
   1227 		cil_copy_fill_context(db, orig->context, new->context);
   1228 	}
   1229 
   1230 	*copy = new;
   1231 
   1232 	return SEPOL_OK;
   1233 }
   1234 
   1235 int cil_copy_fsuse(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1236 {
   1237 	struct cil_fsuse *orig = data;
   1238 	struct cil_fsuse *new = NULL;
   1239 
   1240 	cil_fsuse_init(&new);
   1241 
   1242 	new->type = orig->type;
   1243 	new->fs_str = orig->fs_str;
   1244 
   1245 	if (orig->context_str != NULL) {
   1246 		new->context_str = orig->context_str;
   1247 	} else {
   1248 		cil_context_init(&new->context);
   1249 		cil_copy_fill_context(db, orig->context, new->context);
   1250 	}
   1251 
   1252 	*copy = new;
   1253 
   1254 	return SEPOL_OK;
   1255 }
   1256 
   1257 int cil_copy_expr(struct cil_db *db, struct cil_list *orig, struct cil_list **new)
   1258 {
   1259 	struct cil_list_item *curr;
   1260 
   1261 	if (orig == NULL) {
   1262 		*new = NULL;
   1263 		return SEPOL_OK;
   1264 	}
   1265 
   1266 	cil_list_init(new, orig->flavor);
   1267 
   1268 	cil_list_for_each(curr, orig) {
   1269 		switch (curr->flavor) {
   1270 		case CIL_LIST: {
   1271 			struct cil_list *sub_list;
   1272 			cil_copy_expr(db, curr->data, &sub_list);
   1273 			cil_list_append(*new, CIL_LIST, sub_list);
   1274 			break;
   1275 		}
   1276 		case CIL_STRING:
   1277 			cil_list_append(*new, CIL_STRING, curr->data);
   1278 			break;
   1279 		case CIL_DATUM:
   1280 			cil_list_append(*new, curr->flavor, curr->data);
   1281 			break;
   1282 		case CIL_OP:
   1283 			cil_list_append(*new, curr->flavor, curr->data);
   1284 			break;
   1285 		case CIL_CONS_OPERAND:
   1286 			cil_list_append(*new, curr->flavor, curr->data);
   1287 			break;
   1288 		default:
   1289 			cil_log(CIL_INFO, "Unknown flavor %d in expression being copied\n",curr->flavor);
   1290 			cil_list_append(*new, curr->flavor, curr->data);
   1291 			break;
   1292 		}
   1293 	}
   1294 
   1295 	return SEPOL_OK;
   1296 }
   1297 
   1298 int cil_copy_constrain(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1299 {
   1300 	struct cil_constrain *orig = data;
   1301 	struct cil_constrain *new = NULL;
   1302 
   1303 	cil_constrain_init(&new);
   1304 	cil_copy_classperms_list(orig->classperms, &new->classperms);
   1305 
   1306 	cil_copy_expr(db, orig->str_expr, &new->str_expr);
   1307 	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
   1308 
   1309 	*copy = new;
   1310 
   1311 	return SEPOL_OK;
   1312 }
   1313 
   1314 int cil_copy_validatetrans(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1315 {
   1316 	struct cil_validatetrans *orig = data;
   1317 	struct cil_validatetrans *new = NULL;
   1318 
   1319 	cil_validatetrans_init(&new);
   1320 
   1321 	new->class_str = orig->class_str;
   1322 
   1323 	cil_copy_expr(db, orig->str_expr, &new->str_expr);
   1324 	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
   1325 
   1326 	*copy = new;
   1327 
   1328 	return SEPOL_OK;
   1329 }
   1330 
   1331 int cil_copy_call(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1332 {
   1333 	struct cil_call *orig = data;
   1334 	struct cil_call *new = NULL;
   1335 	int rc = SEPOL_ERR;
   1336 
   1337 	cil_call_init(&new);
   1338 
   1339 	new->macro_str = orig->macro_str;
   1340 	new->macro = orig->macro;
   1341 
   1342 	if (orig->args_tree != NULL) {
   1343 		cil_tree_init(&new->args_tree);
   1344 		rc = cil_copy_ast(db, orig->args_tree->root, new->args_tree->root);
   1345 		if (rc != SEPOL_OK) {
   1346 			goto exit;
   1347 		}
   1348 	}
   1349 
   1350 	new->copied = orig->copied;
   1351 
   1352 	*copy = new;
   1353 
   1354 	return SEPOL_OK;
   1355 
   1356 exit:
   1357 	cil_destroy_call(new);
   1358 	return rc;
   1359 }
   1360 
   1361 int cil_copy_macro(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
   1362 {
   1363 	struct cil_macro *orig = data;
   1364 	char *key = orig->datum.name;
   1365 	struct cil_symtab_datum *datum = NULL;
   1366 
   1367 	cil_symtab_get_datum(symtab, key, &datum);
   1368 	if (datum == NULL) {
   1369 		struct cil_macro *new;
   1370 		cil_macro_init(&new);
   1371 		if (orig->params != NULL) {
   1372 			cil_copy_list(orig->params, &new->params);
   1373 		}
   1374 
   1375 		*copy = new;
   1376 
   1377 	} else {
   1378 		struct cil_list_item *curr_orig = NULL;
   1379 		struct cil_list_item *curr_new = NULL;
   1380 		struct cil_param *param_orig = NULL;
   1381 		struct cil_param *param_new = NULL;
   1382 
   1383 		if (((struct cil_macro*)datum)->params != NULL) {
   1384 			curr_new = ((struct cil_macro*)datum)->params->head;
   1385 		}
   1386 
   1387 		if (orig->params != NULL) {
   1388 			curr_orig = orig->params->head;
   1389 		}
   1390 
   1391 		if (curr_orig != NULL && curr_new != NULL) {
   1392 			while (curr_orig != NULL) {
   1393 				if (curr_new == NULL) {
   1394 					goto exit;
   1395 				}
   1396 
   1397 				param_orig = (struct cil_param*)curr_orig->data;
   1398 				param_new = (struct cil_param*)curr_new->data;
   1399 				if (param_orig->str != param_new->str) {
   1400 					goto exit;
   1401 				} else if (param_orig->flavor != param_new->flavor) {
   1402 					goto exit;
   1403 				}
   1404 
   1405 				curr_orig = curr_orig->next;
   1406 				curr_new = curr_new->next;
   1407 			}
   1408 
   1409 			if (curr_new != NULL) {
   1410 				goto exit;
   1411 			}
   1412 		} else if (!(curr_orig == NULL && curr_new == NULL)) {
   1413 			goto exit;
   1414 		}
   1415 
   1416 		*copy = datum;
   1417 	}
   1418 
   1419 	return SEPOL_OK;
   1420 
   1421 exit:
   1422 	cil_log(CIL_INFO, "cil_copy_macro: macro cannot be redefined\n");
   1423 	return SEPOL_ERR;
   1424 }
   1425 
   1426 int cil_copy_optional(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
   1427 {
   1428 	struct cil_optional *orig = data;
   1429 	char *key = orig->datum.name;
   1430 	struct cil_symtab_datum *datum = NULL;
   1431 
   1432 	cil_symtab_get_datum(symtab, key, &datum);
   1433 	if (datum == NULL) {
   1434 		struct cil_optional *new;
   1435 		cil_optional_init(&new);
   1436 		*copy = new;
   1437 	} else {
   1438 		*copy = datum;
   1439 	}
   1440 
   1441 	return SEPOL_OK;
   1442 }
   1443 
   1444 void cil_copy_fill_ipaddr(struct cil_ipaddr *data, struct cil_ipaddr *new)
   1445 {
   1446 	new->family = data->family;
   1447 	memcpy(&new->ip, &data->ip, sizeof(data->ip));
   1448 }
   1449 
   1450 int cil_copy_ipaddr(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
   1451 {
   1452 	struct cil_ipaddr *orig = data;
   1453 	struct cil_ipaddr *new = NULL;
   1454 	char * key = orig->datum.name;
   1455 	struct cil_symtab_datum *datum = NULL;
   1456 
   1457 	cil_symtab_get_datum(symtab, key, &datum);
   1458 	if (datum != NULL) {
   1459 		cil_log(CIL_INFO, "cil_copy_ipaddr: ipaddress cannot be redefined\n");
   1460 		return SEPOL_ERR;
   1461 	}
   1462 
   1463 	cil_ipaddr_init(&new);
   1464 	cil_copy_fill_ipaddr(orig, new);
   1465 
   1466 	*copy = new;
   1467 
   1468 	return SEPOL_OK;
   1469 }
   1470 
   1471 int cil_copy_condblock(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1472 {
   1473 	struct cil_condblock *orig = data;
   1474 	struct cil_condblock *new = *copy;
   1475 	cil_condblock_init(&new);
   1476 	new->flavor = orig->flavor;
   1477 	*copy = new;
   1478 
   1479 	return SEPOL_OK;
   1480 }
   1481 
   1482 int cil_copy_boolif(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1483 {
   1484 	struct cil_booleanif *orig = data;
   1485 	struct cil_booleanif *new = NULL;
   1486 
   1487 	cil_boolif_init(&new);
   1488 
   1489 	cil_copy_expr(db, orig->str_expr, &new->str_expr);
   1490 	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
   1491 	new->preserved_tunable = orig->preserved_tunable;
   1492 
   1493 	*copy = new;
   1494 
   1495 	return SEPOL_OK;
   1496 }
   1497 
   1498 int cil_copy_tunif(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1499 {
   1500 	struct cil_tunableif *orig = data;
   1501 	struct cil_tunableif *new = NULL;
   1502 
   1503 	cil_tunif_init(&new);
   1504 
   1505 	cil_copy_expr(db, orig->str_expr, &new->str_expr);
   1506 	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
   1507 
   1508 	*copy = new;
   1509 
   1510 	return SEPOL_OK;
   1511 }
   1512 
   1513 int cil_copy_default(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1514 {
   1515 	struct cil_default *orig = data;
   1516 	struct cil_default *new = NULL;
   1517 
   1518 	cil_default_init(&new);
   1519 
   1520 	new->flavor = orig->flavor;
   1521 
   1522 	if (orig->class_strs != NULL) {
   1523 		cil_copy_list(orig->class_strs, &new->class_strs);
   1524 	}
   1525 
   1526 	new->object = orig->object;
   1527 
   1528 	*copy = new;
   1529 
   1530 	return SEPOL_OK;
   1531 }
   1532 
   1533 int cil_copy_defaultrange(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1534 {
   1535 	struct cil_defaultrange *orig = data;
   1536 	struct cil_defaultrange *new = NULL;
   1537 
   1538 	cil_defaultrange_init(&new);
   1539 
   1540 	if (orig->class_strs != NULL) {
   1541 		cil_copy_list(orig->class_strs, &new->class_strs);
   1542 	}
   1543 
   1544 	new->object_range = orig->object_range;
   1545 
   1546 	*copy = new;
   1547 
   1548 	return SEPOL_OK;
   1549 }
   1550 
   1551 int cil_copy_handleunknown(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1552 {
   1553 	struct cil_handleunknown *orig = data;
   1554 	struct cil_handleunknown *new = NULL;
   1555 
   1556 	cil_handleunknown_init(&new);
   1557 	new->handle_unknown = orig->handle_unknown;
   1558 	*copy = new;
   1559 
   1560 	return SEPOL_OK;
   1561 }
   1562 
   1563 int cil_copy_mls(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1564 {
   1565 	struct cil_mls *orig = data;
   1566 	struct cil_mls *new = NULL;
   1567 
   1568 	cil_mls_init(&new);
   1569 	new->value = orig->value;
   1570 	*copy = new;
   1571 
   1572 	return SEPOL_OK;
   1573 }
   1574 
   1575 int cil_copy_bounds(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
   1576 {
   1577 	struct cil_bounds *orig = data;
   1578 	struct cil_bounds *new = NULL;
   1579 
   1580 	cil_bounds_init(&new);
   1581 
   1582 	new->parent_str = orig->parent_str;
   1583 	new->child_str = orig->child_str;
   1584 
   1585 	*copy = new;
   1586 
   1587 	return SEPOL_OK;
   1588 }
   1589 
   1590 int __cil_copy_node_helper(struct cil_tree_node *orig, __attribute__((unused)) uint32_t *finished, void *extra_args)
   1591 {
   1592 	int rc = SEPOL_ERR;
   1593 	struct cil_tree_node *parent = NULL;
   1594 	struct cil_tree_node *new = NULL;
   1595 	struct cil_db *db = NULL;
   1596 	struct cil_args_copy *args = NULL;
   1597 	struct cil_tree_node *namespace = NULL;
   1598 	struct cil_param *param = NULL;
   1599 	enum cil_sym_index sym_index = CIL_SYM_UNKNOWN;
   1600 	symtab_t *symtab = NULL;
   1601 	void *data = NULL;
   1602 	int (*copy_func)(struct cil_db *db, void *data, void **copy, symtab_t *symtab) = NULL;
   1603 	struct cil_blockinherit *blockinherit = NULL;
   1604 
   1605 	if (orig == NULL || extra_args == NULL) {
   1606 		goto exit;
   1607 	}
   1608 
   1609 	args = extra_args;
   1610 	parent = args->dest;
   1611 	db = args->db;
   1612 
   1613 
   1614 	switch (orig->flavor) {
   1615 	case CIL_BLOCK:
   1616 		copy_func = &cil_copy_block;
   1617 		break;
   1618 	case CIL_BLOCKABSTRACT:
   1619 		copy_func = &cil_copy_blockabstract;
   1620 		break;
   1621 	case CIL_BLOCKINHERIT:
   1622 		copy_func = &cil_copy_blockinherit;
   1623 		break;
   1624 	case CIL_POLICYCAP:
   1625 		copy_func = &cil_copy_policycap;
   1626 		break;
   1627 	case CIL_PERM:
   1628 	case CIL_MAP_PERM:
   1629 		copy_func = &cil_copy_perm;
   1630 		break;
   1631 	case CIL_CLASSMAPPING:
   1632 		copy_func = &cil_copy_classmapping;
   1633 		break;
   1634 	case CIL_CLASS:
   1635 	case CIL_COMMON:
   1636 	case CIL_MAP_CLASS:
   1637 		copy_func = &cil_copy_class;
   1638 		break;
   1639 	case CIL_CLASSORDER:
   1640 		copy_func = &cil_copy_classorder;
   1641 		break;
   1642 	case CIL_CLASSPERMISSION:
   1643 		copy_func = &cil_copy_classpermission;
   1644 		break;
   1645 	case CIL_CLASSPERMISSIONSET:
   1646 		copy_func = &cil_copy_classpermissionset;
   1647 		break;
   1648 	case CIL_CLASSCOMMON:
   1649 		copy_func = &cil_copy_classcommon;
   1650 		break;
   1651 	case CIL_SID:
   1652 		copy_func = &cil_copy_sid;
   1653 		break;
   1654 	case CIL_SIDCONTEXT:
   1655 		copy_func = &cil_copy_sidcontext;
   1656 		break;
   1657 	case CIL_SIDORDER:
   1658 		copy_func = &cil_copy_sidorder;
   1659 		break;
   1660 	case CIL_USER:
   1661 		copy_func = &cil_copy_user;
   1662 		break;
   1663 	case CIL_USERROLE:
   1664 		copy_func = &cil_copy_userrole;
   1665 		break;
   1666 	case CIL_USERLEVEL:
   1667 		copy_func = &cil_copy_userlevel;
   1668 		break;
   1669 	case CIL_USERRANGE:
   1670 		copy_func = &cil_copy_userrange;
   1671 		break;
   1672 	case CIL_USERBOUNDS:
   1673 		copy_func = &cil_copy_bounds;
   1674 		break;
   1675 	case CIL_USERPREFIX:
   1676 		copy_func = &cil_copy_userprefix;
   1677 		break;
   1678 	case CIL_ROLE:
   1679 		copy_func = &cil_copy_role;
   1680 		break;
   1681 	case CIL_ROLETYPE:
   1682 		copy_func = &cil_copy_roletype;
   1683 		break;
   1684 	case CIL_ROLEBOUNDS:
   1685 		copy_func = &cil_copy_bounds;
   1686 		break;
   1687 	case CIL_ROLEATTRIBUTE:
   1688 		copy_func = &cil_copy_roleattribute;
   1689 		break;
   1690 	case CIL_ROLEATTRIBUTESET:
   1691 		copy_func = &cil_copy_roleattributeset;
   1692 		break;
   1693 	case CIL_ROLEALLOW:
   1694 		copy_func = &cil_copy_roleallow;
   1695 		break;
   1696 	case CIL_TYPE:
   1697 		copy_func = &cil_copy_type;
   1698 		break;
   1699 	case CIL_TYPEBOUNDS:
   1700 		copy_func = &cil_copy_bounds;
   1701 		break;
   1702 	case CIL_TYPEPERMISSIVE:
   1703 		copy_func = cil_copy_typepermissive;
   1704 		break;
   1705 	case CIL_TYPEATTRIBUTE:
   1706 		copy_func = &cil_copy_typeattribute;
   1707 		break;
   1708 	case CIL_TYPEATTRIBUTESET:
   1709 		copy_func = &cil_copy_typeattributeset;
   1710 		break;
   1711 	case CIL_TYPEALIAS:
   1712 		copy_func = &cil_copy_alias;
   1713 		break;
   1714 	case CIL_TYPEALIASACTUAL:
   1715 		copy_func = &cil_copy_aliasactual;
   1716 		break;
   1717 	case CIL_ROLETRANSITION:
   1718 		copy_func = &cil_copy_roletransition;
   1719 		break;
   1720 	case CIL_NAMETYPETRANSITION:
   1721 		copy_func = &cil_copy_nametypetransition;
   1722 		break;
   1723 	case CIL_RANGETRANSITION:
   1724 		copy_func = &cil_copy_rangetransition;
   1725 		break;
   1726 	case CIL_TUNABLE:
   1727 		copy_func = &cil_copy_tunable;
   1728 		break;
   1729 	case CIL_BOOL:
   1730 		copy_func = &cil_copy_bool;
   1731 		break;
   1732 	case CIL_AVRULE:
   1733 		copy_func = &cil_copy_avrule;
   1734 		break;
   1735 	case CIL_TYPE_RULE:
   1736 		copy_func = &cil_copy_type_rule;
   1737 		break;
   1738 	case CIL_SENS:
   1739 		copy_func = &cil_copy_sens;
   1740 		break;
   1741 	case CIL_SENSALIAS:
   1742 		copy_func = &cil_copy_alias;
   1743 		break;
   1744 	case CIL_SENSALIASACTUAL:
   1745 		copy_func = &cil_copy_aliasactual;
   1746 		break;
   1747 	case CIL_CAT:
   1748 		copy_func = &cil_copy_cat;
   1749 		break;
   1750 	case CIL_CATALIAS:
   1751 		copy_func = &cil_copy_alias;
   1752 		break;
   1753 	case CIL_CATALIASACTUAL:
   1754 		copy_func = &cil_copy_aliasactual;
   1755 		break;
   1756 	case CIL_CATSET:
   1757 		copy_func = &cil_copy_catset;
   1758 		break;
   1759 	case CIL_SENSCAT:
   1760 		copy_func = &cil_copy_senscat;
   1761 		break;
   1762 	case CIL_CATORDER:
   1763 		copy_func = &cil_copy_catorder;
   1764 		break;
   1765 	case CIL_SENSITIVITYORDER:
   1766 		copy_func = &cil_copy_sensitivityorder;
   1767 		break;
   1768 	case CIL_LEVEL:
   1769 		copy_func = &cil_copy_level;
   1770 		break;
   1771 	case CIL_LEVELRANGE:
   1772 		copy_func = &cil_copy_levelrange;
   1773 		break;
   1774 	case CIL_CONTEXT:
   1775 		copy_func = &cil_copy_context;
   1776 		break;
   1777 	case CIL_NETIFCON:
   1778 		copy_func = &cil_copy_netifcon;
   1779 		break;
   1780 	case CIL_GENFSCON:
   1781 		copy_func = &cil_copy_genfscon;
   1782 		break;
   1783 	case CIL_FILECON:
   1784 		copy_func = &cil_copy_filecon;
   1785 		break;
   1786 	case CIL_NODECON:
   1787 		copy_func = &cil_copy_nodecon;
   1788 		break;
   1789 	case CIL_PORTCON:
   1790 		copy_func = &cil_copy_portcon;
   1791 		break;
   1792 	case CIL_PIRQCON:
   1793 		copy_func = &cil_copy_pirqcon;
   1794 		break;
   1795 	case CIL_IOMEMCON:
   1796 		copy_func = &cil_copy_iomemcon;
   1797 		break;
   1798 	case CIL_IOPORTCON:
   1799 		copy_func = &cil_copy_ioportcon;
   1800 		break;
   1801 	case CIL_PCIDEVICECON:
   1802 		copy_func = &cil_copy_pcidevicecon;
   1803 		break;
   1804 	case CIL_DEVICETREECON:
   1805 		copy_func = &cil_copy_devicetreecon;
   1806 		break;
   1807 	case CIL_FSUSE:
   1808 		copy_func = &cil_copy_fsuse;
   1809 		break;
   1810 	case CIL_CONSTRAIN:
   1811 	case CIL_MLSCONSTRAIN:
   1812 		copy_func = &cil_copy_constrain;
   1813 		break;
   1814 	case CIL_VALIDATETRANS:
   1815 	case CIL_MLSVALIDATETRANS:
   1816 		copy_func = &cil_copy_validatetrans;
   1817 		break;
   1818 	case CIL_CALL:
   1819 		copy_func = &cil_copy_call;
   1820 		break;
   1821 	case CIL_MACRO:
   1822 		copy_func = &cil_copy_macro;
   1823 		break;
   1824 	case CIL_NODE:
   1825 		copy_func = &cil_copy_node;
   1826 		break;
   1827 	case CIL_OPTIONAL:
   1828 		copy_func = &cil_copy_optional;
   1829 		break;
   1830 	case CIL_IPADDR:
   1831 		copy_func = &cil_copy_ipaddr;
   1832 		break;
   1833 	case CIL_CONDBLOCK:
   1834 		copy_func = &cil_copy_condblock;
   1835 		break;
   1836 	case CIL_BOOLEANIF:
   1837 		copy_func = &cil_copy_boolif;
   1838 		break;
   1839 	case CIL_TUNABLEIF:
   1840 		copy_func = &cil_copy_tunif;
   1841 		break;
   1842 	case CIL_DEFAULTUSER:
   1843 	case CIL_DEFAULTROLE:
   1844 	case CIL_DEFAULTTYPE:
   1845 		copy_func = &cil_copy_default;
   1846 		break;
   1847 	case CIL_DEFAULTRANGE:
   1848 		copy_func = &cil_copy_defaultrange;
   1849 		break;
   1850 	case CIL_HANDLEUNKNOWN:
   1851 		copy_func = &cil_copy_handleunknown;
   1852 		break;
   1853 	case CIL_MLS:
   1854 		copy_func = &cil_copy_mls;
   1855 		break;
   1856 	default:
   1857 		goto exit;
   1858 	}
   1859 
   1860 	if (orig->flavor >= CIL_MIN_DECLARATIVE) {
   1861 		rc = cil_flavor_to_symtab_index(orig->flavor, &sym_index);
   1862 		if (rc != SEPOL_OK) {
   1863 			goto exit;
   1864 		}
   1865 
   1866 		rc = cil_get_symtab(parent, &symtab, sym_index);
   1867 		if (rc != SEPOL_OK) {
   1868 			goto exit;
   1869 		}
   1870 	}
   1871 
   1872 	rc = (*copy_func)(db, orig->data, &data, symtab);
   1873 	if (rc == SEPOL_OK) {
   1874 		cil_tree_node_init(&new);
   1875 
   1876 		new->parent = parent;
   1877 		new->line = orig->line;
   1878 		new->path = orig->path;
   1879 		new->flavor = orig->flavor;
   1880 		new->data = data;
   1881 
   1882 		if (orig->flavor >= CIL_MIN_DECLARATIVE) {
   1883 			rc = cil_symtab_insert(symtab, ((struct cil_symtab_datum*)orig->data)->name, ((struct cil_symtab_datum*)data), new);
   1884 
   1885 			namespace = new;
   1886 			while (namespace->flavor != CIL_MACRO && namespace->flavor != CIL_BLOCK && namespace->flavor != CIL_ROOT) {
   1887 				namespace = namespace->parent;
   1888 			}
   1889 
   1890 			if (namespace->flavor == CIL_MACRO) {
   1891 				struct cil_macro *macro = namespace->data;
   1892 				struct cil_list *param_list = macro->params;
   1893 				if (param_list != NULL) {
   1894 					struct cil_list_item *item;
   1895 					cil_list_for_each(item, param_list) {
   1896 						param = item->data;
   1897 						if (param->flavor == new->flavor) {
   1898 							if (param->str == ((struct cil_symtab_datum*)new->data)->name) {
   1899 								cil_log(CIL_ERR, "%s %s shadows a macro parameter (%s line:%d)\n", cil_node_to_string(new), ((struct cil_symtab_datum*)orig->data)->name, orig->path, orig->line);
   1900 								cil_log(CIL_ERR, "Note: macro declaration (%s line:%d)\n", namespace->path, namespace->line);
   1901 								rc = SEPOL_ERR;
   1902 								goto exit;
   1903 							}
   1904 						}
   1905 					}
   1906 				}
   1907 			}
   1908 		}
   1909 
   1910 		if (new->flavor == CIL_BLOCKINHERIT) {
   1911 			blockinherit = new->data;
   1912 			cil_list_append(blockinherit->block->bi_nodes, CIL_NODE, new);
   1913 		}
   1914 
   1915 		if (parent->cl_head == NULL) {
   1916 			parent->cl_head = new;
   1917 			parent->cl_tail = new;
   1918 		} else {
   1919 			parent->cl_tail->next = new;
   1920 			parent->cl_tail = new;
   1921 		}
   1922 
   1923 		if (orig->cl_head != NULL) {
   1924 			args->dest = new;
   1925 		}
   1926 	} else {
   1927 		goto exit;
   1928 	}
   1929 
   1930 	return SEPOL_OK;
   1931 
   1932 exit:
   1933 	cil_tree_node_destroy(&new);
   1934 	return rc;
   1935 }
   1936 
   1937 int __cil_copy_last_child_helper(__attribute__((unused)) struct cil_tree_node *orig, void *extra_args)
   1938 {
   1939 	struct cil_tree_node *node = NULL;
   1940 	struct cil_args_copy *args = NULL;
   1941 
   1942 	args = extra_args;
   1943 	node = args->dest;
   1944 
   1945 	if (node->flavor != CIL_ROOT) {
   1946 		args->dest = node->parent;
   1947 	}
   1948 
   1949 	return SEPOL_OK;
   1950 }
   1951 
   1952 // dest is the parent node to copy into
   1953 // if the copy is for a call to a macro, dest should be a pointer to the call
   1954 int cil_copy_ast(struct cil_db *db, struct cil_tree_node *orig, struct cil_tree_node *dest)
   1955 {
   1956 	int rc = SEPOL_ERR;
   1957 	struct cil_args_copy extra_args;
   1958 
   1959 	extra_args.dest = dest;
   1960 	extra_args.db = db;
   1961 
   1962 	rc = cil_tree_walk(orig, __cil_copy_node_helper, NULL,  __cil_copy_last_child_helper, &extra_args);
   1963 	if (rc != SEPOL_OK) {
   1964 		cil_log(CIL_INFO, "cil_tree_walk failed, rc: %d\n", rc);
   1965 		goto exit;
   1966 	}
   1967 
   1968 	return SEPOL_OK;
   1969 
   1970 exit:
   1971 	return rc;
   1972 }
   1973 
   1974