X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=qemu-bridge-helper.c;h=88b26747fc866116637716264dea3ce4631a4b11;hb=807e2b6fce022707418bc8f61c069d91c613b3d2;hp=95624bc30055b9b5628e6cf495989b0f2ebb66d3;hpb=c204e342e861c83143c150ec9e7430bef29eebe4;p=thirdparty%2Fqemu.git diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c index 95624bc3005..88b26747fc8 100644 --- a/qemu-bridge-helper.c +++ b/qemu-bridge-helper.c @@ -43,7 +43,7 @@ #include "net/tap-linux.h" -#ifdef CONFIG_LIBCAP +#ifdef CONFIG_LIBCAP_NG #include #endif @@ -102,9 +102,7 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) if (arg == NULL) { fprintf(stderr, "Invalid config line:\n %s\n", line); - fclose(f); - errno = EINVAL; - return -1; + goto err; } *arg = 0; @@ -119,6 +117,11 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) } *argend = 0; + if (!g_str_equal(cmd, "include") && strlen(arg) >= IFNAMSIZ) { + fprintf(stderr, "name `%s' too long: %zu\n", arg, strlen(arg)); + goto err; + } + if (strcmp(cmd, "deny") == 0) { acl_rule = g_malloc(sizeof(*acl_rule)); if (strcmp(arg, "all") == 0) { @@ -142,15 +145,18 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) parse_acl_file(arg, acl_list); } else { fprintf(stderr, "Unknown command `%s'\n", cmd); - fclose(f); - errno = EINVAL; - return -1; + goto err; } } fclose(f); - return 0; + +err: + fclose(f); + errno = EINVAL; + return -1; + } static bool has_vnet_hdr(int fd) @@ -201,7 +207,7 @@ static int send_fd(int c, int fd) return sendmsg(c, &msg, 0); } -#ifdef CONFIG_LIBCAP +#ifdef CONFIG_LIBCAP_NG static int drop_privileges(void) { /* clear all capabilities */ @@ -240,7 +246,7 @@ int main(int argc, char **argv) int access_allowed, access_denied; int ret = EXIT_SUCCESS; -#ifdef CONFIG_LIBCAP +#ifdef CONFIG_LIBCAP_NG /* if we're run from an suid binary, immediately drop privileges preserving * cap_net_admin */ if (geteuid() == 0 && getuid() != geteuid()) { @@ -269,6 +275,10 @@ int main(int argc, char **argv) usage(); return EXIT_FAILURE; } + if (strlen(bridge) >= IFNAMSIZ) { + fprintf(stderr, "name `%s' too long: %zu\n", bridge, strlen(bridge)); + return EXIT_FAILURE; + } /* parse default acl file */ QSIMPLEQ_INIT(&acl_list);