da8e3c7d36
In order for argv[3] to be used, argc needs to be at least 4, not 3.
This bug was found using lgtm.com analyzer:
8c1b2658f8/files/semodule-utils/semodule_package/semodule_unpackage.c (xb1ce80b43260d34c)
:1
Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
103 lines
2.3 KiB
C
103 lines
2.3 KiB
C
#include <sepol/module.h>
|
|
#include <getopt.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
|
|
char *progname = NULL;
|
|
extern char *optarg;
|
|
|
|
static __attribute__((__noreturn__)) void usage(void)
|
|
{
|
|
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)
|
|
{
|
|
struct sepol_module_package *pkg;
|
|
struct sepol_policy_file *in, *out;
|
|
FILE *fp;
|
|
size_t len;
|
|
char *ppfile, *modfile, *fcfile = NULL, *fcdata;
|
|
|
|
progname = argv[0];
|
|
|
|
if (argc < 3) {
|
|
usage();
|
|
exit(1);
|
|
}
|
|
|
|
ppfile = argv[1];
|
|
modfile = argv[2];
|
|
if (argc >= 4)
|
|
fcfile = argv[3];
|
|
|
|
if (file_to_policy_file(ppfile, &in, "r"))
|
|
exit(1);
|
|
|
|
if (sepol_module_package_create(&pkg)) {
|
|
fprintf(stderr, "%s: Out of memory\n", progname);
|
|
exit(1);
|
|
}
|
|
|
|
if (sepol_module_package_read(pkg, in, 0) == -1) {
|
|
fprintf(stderr, "%s: Error while reading policy module from %s\n",
|
|
progname, ppfile);
|
|
exit(1);
|
|
}
|
|
|
|
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(out);
|
|
|
|
len = sepol_module_package_get_file_contexts_len(pkg);
|
|
if (fcfile && len) {
|
|
fp = fopen(fcfile, "w");
|
|
if (!fp) {
|
|
fprintf(stderr, "%s: Could not open file %s: %s\n", progname, strerror(errno), fcfile);
|
|
exit(1);
|
|
}
|
|
fcdata = sepol_module_package_get_file_contexts(pkg);
|
|
if (fwrite(fcdata, 1, len, fp) != len) {
|
|
fprintf(stderr, "%s: Could not write file %s: %s\n", progname, strerror(errno), fcfile);
|
|
exit(1);
|
|
}
|
|
fclose(fp);
|
|
}
|
|
|
|
sepol_module_package_free(pkg);
|
|
exit(0);
|
|
}
|