summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Rogers <brogers@suse.com>2016-08-02 11:36:02 -0600
committerhyokeun <hyokeun.jeon@samsung.com>2016-09-06 15:55:36 +0900
commitf2794a10f8226c8f69ffeffbdb1d0f13bfd95e9d (patch)
treefc9652dc14f38bac6f0b50fa805c04427a980eaf
parent22311604e5b034de4fb73bcf97a52eb59859e4f9 (diff)
downloadqemu-f2794a10f8226c8f69ffeffbdb1d0f13bfd95e9d.tar.gz
qemu-f2794a10f8226c8f69ffeffbdb1d0f13bfd95e9d.tar.bz2
qemu-f2794a10f8226c8f69ffeffbdb1d0f13bfd95e9d.zip
qemu-bridge-helper: reduce security profile
Change from using glib alloc and free routines to those from libc. Also perform safety measure of dropping privs to user if configured no-caps. [BR: BOO#988279] Signed-off-by: Bruce Rogers <brogers@suse.com> [AF: Rebased for v2.7.0-rc2] Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r--qemu-bridge-helper.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c
index 5396fbfbb..f3710b80a 100644
--- a/qemu-bridge-helper.c
+++ b/qemu-bridge-helper.c
@@ -110,7 +110,12 @@ static int parse_acl_file(const char *filename, ACLList *acl_list)
*argend = 0;
if (strcmp(cmd, "deny") == 0) {
- acl_rule = g_malloc(sizeof(*acl_rule));
+ acl_rule = calloc(1, sizeof(*acl_rule));
+ if (!acl_rule) {
+ fclose(f);
+ errno = ENOMEM;
+ return -1;
+ }
if (strcmp(arg, "all") == 0) {
acl_rule->type = ACL_DENY_ALL;
} else {
@@ -119,7 +124,12 @@ static int parse_acl_file(const char *filename, ACLList *acl_list)
}
QSIMPLEQ_INSERT_TAIL(acl_list, acl_rule, entry);
} else if (strcmp(cmd, "allow") == 0) {
- acl_rule = g_malloc(sizeof(*acl_rule));
+ acl_rule = calloc(1, sizeof(*acl_rule));
+ if (!acl_rule) {
+ fclose(f);
+ errno = ENOMEM;
+ return -1;
+ }
if (strcmp(arg, "all") == 0) {
acl_rule->type = ACL_ALLOW_ALL;
} else {
@@ -413,6 +423,17 @@ int main(int argc, char **argv)
goto cleanup;
}
+#ifndef CONFIG_LIBCAP
+ /* avoid sending the fd as root user if running suid to not fool
+ * peer credentials to daemons that dont expect that
+ */
+ if (setuid(getuid()) < 0) {
+ fprintf(stderr, "Failed to drop privileges.\n");
+ ret = EXIT_FAILURE;
+ goto cleanup;
+ }
+#endif
+
/* write fd to the domain socket */
if (send_fd(unixfd, fd) == -1) {
fprintf(stderr, "failed to write fd to unix socket: %s\n",
@@ -434,7 +455,7 @@ cleanup:
}
while ((acl_rule = QSIMPLEQ_FIRST(&acl_list)) != NULL) {
QSIMPLEQ_REMOVE_HEAD(&acl_list, entry);
- g_free(acl_rule);
+ free(acl_rule);
}
return ret;