Merge pull request #167 from keszybz/line-oriented-ima-setup

ima-setup: write policy one line at a time
This commit is contained in:
keszybz
2015-06-12 23:52:13 -04:00

View File

@@ -23,9 +23,6 @@
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include "ima-setup.h"
#include "util.h"
@@ -36,20 +33,19 @@
#define IMA_POLICY_PATH "/etc/ima/ima-policy"
int ima_setup(void) {
int r = 0;
#ifdef HAVE_IMA
_cleanup_close_ int policyfd = -1, imafd = -1;
struct stat st;
char *policy;
_cleanup_fclose_ FILE *input = NULL;
_cleanup_close_ int imafd = -1;
unsigned lineno = 0;
char line[page_size()];
if (access(IMA_SECFS_DIR, F_OK) < 0) {
log_debug("IMA support is disabled in the kernel, ignoring.");
return 0;
}
policyfd = open(IMA_POLICY_PATH, O_RDONLY|O_CLOEXEC);
if (policyfd < 0) {
input = fopen(IMA_POLICY_PATH, "re");
if (!input) {
log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_WARNING, errno,
"Failed to open the IMA custom policy file "IMA_POLICY_PATH", ignoring: %m");
return 0;
@@ -66,20 +62,19 @@ int ima_setup(void) {
return 0;
}
if (fstat(policyfd, &st) < 0)
return log_error_errno(errno, "Failed to fstat "IMA_POLICY_PATH": %m");
FOREACH_LINE(line, input,
return log_error_errno(errno, "Failed to read the IMA custom policy file "IMA_POLICY_PATH": %m")) {
size_t len;
policy = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, policyfd, 0);
if (policy == MAP_FAILED)
return log_error_errno(errno, "Failed to mmap "IMA_POLICY_PATH": %m");
len = strlen(line);
lineno++;
r = loop_write(imafd, policy, (size_t) st.st_size, false);
if (r < 0)
log_error_errno(r, "Failed to load the IMA custom policy file "IMA_POLICY_PATH": %m");
else
log_info("Successfully loaded the IMA custom policy "IMA_POLICY_PATH".");
if (len > 0 && write(imafd, line, len) < 0)
return log_error_errno(errno, "Failed to load the IMA custom policy file "IMA_POLICY_PATH"%u: %m",
lineno);
}
munmap(policy, st.st_size);
log_info("Successfully loaded the IMA custom policy "IMA_POLICY_PATH".");
#endif /* HAVE_IMA */
return r;
return 0;
}