Handle allocation failures in security code

Note that such errors are generally going to be fatal
This commit is contained in:
Drew DeVault 2016-12-15 18:10:29 -05:00
parent 31b002b6d5
commit 7784f1a905
3 changed files with 24 additions and 2 deletions

View file

@ -575,6 +575,9 @@ struct cmd_results *config_commands_command(char *exec) {
} }
if (!policy) { if (!policy) {
policy = alloc_command_policy(cmd); policy = alloc_command_policy(cmd);
if (!policy) {
sway_abort("Unable to allocate security policy");
}
list_add(config->command_policies, policy); list_add(config->command_policies, policy);
} }
policy->context = context; policy->context = context;

View file

@ -50,6 +50,9 @@ static struct feature_policy *get_policy(const char *name) {
} }
if (!policy) { if (!policy) {
policy = alloc_feature_policy(name); policy = alloc_feature_policy(name);
if (!policy) {
sway_abort("Unable to allocate security policy");
}
list_add(config->feature_policies, policy); list_add(config->feature_policies, policy);
} }
return policy; return policy;

View file

@ -15,14 +15,28 @@ struct feature_policy *alloc_feature_policy(const char *program) {
} }
struct feature_policy *policy = malloc(sizeof(struct feature_policy)); struct feature_policy *policy = malloc(sizeof(struct feature_policy));
if (!policy) {
return NULL;
}
policy->program = strdup(program); policy->program = strdup(program);
if (!policy->program) {
free(policy);
return NULL;
}
policy->features = default_policy; policy->features = default_policy;
return policy; return policy;
} }
struct command_policy *alloc_command_policy(const char *command) { struct command_policy *alloc_command_policy(const char *command) {
struct command_policy *policy = malloc(sizeof(struct command_policy)); struct command_policy *policy = malloc(sizeof(struct command_policy));
if (!policy) {
return NULL;
}
policy->command = strdup(command); policy->command = strdup(command);
if (!policy->command) {
free(policy);
return NULL;
}
policy->context = 0; policy->context = 0;
return policy; return policy;
} }
@ -35,12 +49,14 @@ enum secure_feature get_feature_policy(pid_t pid) {
#endif #endif
int pathlen = snprintf(NULL, 0, fmt, pid); int pathlen = snprintf(NULL, 0, fmt, pid);
char *path = malloc(pathlen + 1); char *path = malloc(pathlen + 1);
if (path) {
snprintf(path, pathlen + 1, fmt, pid); snprintf(path, pathlen + 1, fmt, pid);
}
static char link[2048]; static char link[2048];
uint32_t default_policy = 0; uint32_t default_policy = 0;
ssize_t len = readlink(path, link, sizeof(link)); ssize_t len = !path ? -1 : readlink(path, link, sizeof(link));
if (len < 0) { if (len < 0) {
sway_log(L_INFO, sway_log(L_INFO,
"WARNING: unable to read %s for security check. Using default policy.", "WARNING: unable to read %s for security check. Using default policy.",