/* Tests the semanage_get_lock functions in semanage_store.c */ void test_semanage_get_lock(void) { int err; /* attempt to get an active lock */ err = semanage_get_active_lock(sh); CU_ASSERT(err == 0); /* attempt to get the lock again */ err = semanage_get_active_lock(sh); CU_ASSERT(err == 0); /* attempt to release the active lock */ semanage_release_active_lock(sh); /* attempt to get an active lock */ err = semanage_get_active_lock(sh); CU_ASSERT(err == 0); /* attempt to release the active lock */ semanage_release_active_lock(sh); /* attempt to get a trans lock */ err = semanage_get_trans_lock(sh); CU_ASSERT(err == 0); /* attempt to get the lock again */ err = semanage_get_trans_lock(sh); CU_ASSERT(err == 0); /* attempt to release the trans lock */ semanage_release_trans_lock(sh); /* attempt to get a trans lock */ err = semanage_get_trans_lock(sh); CU_ASSERT(err == 0); /* attempt to release the trans lock */ semanage_release_trans_lock(sh); /* remove the lock files */ err = remove(readlockpath); CU_ASSERT(err == 0); err = remove(translockpath); CU_ASSERT(err == 0); }
/* Allocate an array of module_info structures for each readable * module within the store. Note that if the calling program has * already begun a transaction then this function will get a list of * modules within the sandbox. The caller is responsible for calling * semanage_module_info_datum_destroy() on each element of the array * as well as free()ing the entire list. */ static int semanage_direct_list(semanage_handle_t *sh, semanage_module_info_t **modinfo, int *num_modules) { struct sepol_policy_file *pf = NULL; int i, retval = -1; char **module_filenames = NULL; int num_mod_files; *modinfo = NULL; *num_modules = 0; /* get the read lock when reading from the active (non-transaction) directory */ if (!sh->is_in_transaction) if (semanage_get_active_lock(sh) < 0) return -1; if (semanage_get_modules_names(sh, &module_filenames, &num_mod_files) == -1) { goto cleanup; } if (num_mod_files == 0) { retval = semanage_get_commit_number(sh); goto cleanup; } if (sepol_policy_file_create(&pf)) { ERR(sh, "Out of memory!"); goto cleanup; } sepol_policy_file_set_handle(pf, sh->sepolh); if ((*modinfo = calloc(num_mod_files, sizeof(**modinfo))) == NULL) { ERR(sh, "Out of memory!"); goto cleanup; } for (i = 0; i < num_mod_files; i++) { FILE *fp; char *name = NULL, *version = NULL; int type; if ((fp = fopen(module_filenames[i], "rb")) == NULL) { /* could not open this module file, so don't * report it */ continue; } sepol_policy_file_set_fp(pf, fp); if (sepol_module_package_info(pf, &type, &name, &version)) { fclose(fp); free(name); free(version); continue; } fclose(fp); if (type == SEPOL_POLICY_MOD) { (*modinfo)[*num_modules].name = name; (*modinfo)[*num_modules].version = version; (*num_modules)++; } else { /* file was not a module, so don't report it */ free(name); free(version); } } retval = semanage_get_commit_number(sh); cleanup: sepol_policy_file_free(pf); for (i = 0; module_filenames != NULL && i < num_mod_files; i++) { free(module_filenames[i]); } free(module_filenames); if (!sh->is_in_transaction) { semanage_release_active_lock(sh); } return retval; }