mirror of
https://github.com/SELinuxProject/selinux
synced 2024-12-22 05:59:58 +00:00
semodule_unpackage: update
Drop unnecessary declarations. Check closing file for incomplete write. Rework resource cleanup, so that all files and allocated memory are released in all branches, useful to minimize reports while debugging libsepol under valgrind(8) or sanitizers. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
parent
f40d4f3dda
commit
a7e975285c
@ -11,46 +11,23 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
char *progname = NULL;
|
static void usage(const char *progname)
|
||||||
extern char *optarg;
|
|
||||||
|
|
||||||
static __attribute__((__noreturn__)) void usage(void)
|
|
||||||
{
|
{
|
||||||
printf("usage: %s ppfile modfile [fcfile]\n", progname);
|
printf("usage: %s ppfile modfile [fcfile]\n", progname);
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int file_to_policy_file(const char *filename, struct sepol_policy_file **pf, const char *mode)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if (sepol_policy_file_create(pf)) {
|
|
||||||
fprintf(stderr, "%s: Out of memory\n", progname);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
f = fopen(filename, mode);
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "%s: Could not open file %s: %s\n", progname, strerror(errno), filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
sepol_policy_file_set_fp(*pf, f);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct sepol_module_package *pkg;
|
struct sepol_module_package *pkg = NULL;
|
||||||
struct sepol_policy_file *in, *out;
|
struct sepol_policy_file *in = NULL, *out = NULL;
|
||||||
FILE *fp;
|
FILE *fp = NULL;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *ppfile, *modfile, *fcfile = NULL, *fcdata;
|
const char *ppfile, *modfile, *fcfile = NULL, *fcdata;
|
||||||
|
int ret;
|
||||||
progname = argv[0];
|
|
||||||
|
|
||||||
if (argc < 3) {
|
if (argc < 3) {
|
||||||
usage();
|
usage(argv[0]);
|
||||||
exit(1);
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ppfile = argv[1];
|
ppfile = argv[1];
|
||||||
@ -58,46 +35,94 @@ int main(int argc, char **argv)
|
|||||||
if (argc >= 4)
|
if (argc >= 4)
|
||||||
fcfile = argv[3];
|
fcfile = argv[3];
|
||||||
|
|
||||||
if (file_to_policy_file(ppfile, &in, "r"))
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
if (sepol_module_package_create(&pkg)) {
|
if (sepol_module_package_create(&pkg)) {
|
||||||
fprintf(stderr, "%s: Out of memory\n", progname);
|
fprintf(stderr, "%s: Out of memory\n", argv[0]);
|
||||||
exit(1);
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sepol_policy_file_create(&in)) {
|
||||||
|
fprintf(stderr, "%s: Out of memory\n", argv[0]);
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(ppfile, "r");
|
||||||
|
if (!fp) {
|
||||||
|
fprintf(stderr, "%s: Could not open file %s: %s\n", argv[0], ppfile, strerror(errno));
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
sepol_policy_file_set_fp(in, fp);
|
||||||
|
|
||||||
if (sepol_module_package_read(pkg, in, 0) == -1) {
|
if (sepol_module_package_read(pkg, in, 0) == -1) {
|
||||||
fprintf(stderr, "%s: Error while reading policy module from %s\n",
|
fprintf(stderr, "%s: Error while reading policy module from %s\n",
|
||||||
progname, ppfile);
|
argv[0], ppfile);
|
||||||
exit(1);
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_to_policy_file(modfile, &out, "w"))
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
if (sepol_policydb_write(sepol_module_package_get_policy(pkg), out)) {
|
|
||||||
fprintf(stderr, "%s: Error while writing module to %s\n", progname, modfile);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
sepol_policy_file_free(in);
|
sepol_policy_file_free(in);
|
||||||
|
in = NULL;
|
||||||
|
fclose(fp);
|
||||||
|
fp = NULL;
|
||||||
|
|
||||||
|
if (sepol_policy_file_create(&out)) {
|
||||||
|
fprintf(stderr, "%s: Out of memory\n", argv[0]);
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(modfile, "w");
|
||||||
|
if (!fp) {
|
||||||
|
fprintf(stderr, "%s: Could not open file %s: %s\n", argv[0], modfile, strerror(errno));
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
sepol_policy_file_set_fp(out, fp);
|
||||||
|
|
||||||
|
if (sepol_policydb_write(sepol_module_package_get_policy(pkg), out)) {
|
||||||
|
fprintf(stderr, "%s: Error while writing module to %s\n", argv[0], modfile);
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fclose(fp);
|
||||||
|
fp = NULL;
|
||||||
|
if (ret) {
|
||||||
|
fprintf(stderr, "%s: Error while closing file %s: %s\n", argv[0], modfile, strerror(errno));
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
sepol_policy_file_free(out);
|
sepol_policy_file_free(out);
|
||||||
|
out = NULL;
|
||||||
|
|
||||||
len = sepol_module_package_get_file_contexts_len(pkg);
|
len = sepol_module_package_get_file_contexts_len(pkg);
|
||||||
if (fcfile && len) {
|
if (fcfile && len) {
|
||||||
fp = fopen(fcfile, "w");
|
fp = fopen(fcfile, "w");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
fprintf(stderr, "%s: Could not open file %s: %s\n", progname, strerror(errno), fcfile);
|
fprintf(stderr, "%s: Could not open file %s: %s\n", argv[0], fcfile, strerror(errno));
|
||||||
exit(1);
|
goto failure;
|
||||||
}
|
}
|
||||||
fcdata = sepol_module_package_get_file_contexts(pkg);
|
fcdata = sepol_module_package_get_file_contexts(pkg);
|
||||||
if (fwrite(fcdata, 1, len, fp) != len) {
|
if (fwrite(fcdata, 1, len, fp) != len) {
|
||||||
fprintf(stderr, "%s: Could not write file %s: %s\n", progname, strerror(errno), fcfile);
|
fprintf(stderr, "%s: Could not write file %s: %s\n", argv[0], fcfile, strerror(errno));
|
||||||
exit(1);
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fclose(fp);
|
||||||
|
fp = NULL;
|
||||||
|
if (ret) {
|
||||||
|
fprintf(stderr, "%s: Could not close file %s: %s\n", argv[0], fcfile, strerror(errno));
|
||||||
|
goto failure;
|
||||||
}
|
}
|
||||||
fclose(fp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = EXIT_SUCCESS;
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
failure:
|
||||||
|
ret = EXIT_FAILURE;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (fp)
|
||||||
|
fclose(fp);
|
||||||
|
sepol_policy_file_free(out);
|
||||||
sepol_module_package_free(pkg);
|
sepol_module_package_free(pkg);
|
||||||
exit(0);
|
sepol_policy_file_free(in);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user