From eed7ef0d84c09954291c1c88d08315646cf5c347 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 2 Dec 2019 19:19:38 +0100 Subject: ipc: make sure userspace communication frees wgdevice --- src/tools/ipc.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'src/tools/ipc.c') diff --git a/src/tools/ipc.c b/src/tools/ipc.c index 89484b1..7207efc 100644 --- a/src/tools/ipc.c +++ b/src/tools/ipc.c @@ -303,8 +303,12 @@ static int userspace_get_device(struct wgdevice **out, const char *iface) return -errno; f = userspace_interface_file(iface); - if (!f) - return -errno; + if (!f) { + ret = -errno; + free(dev); + *out = NULL; + return ret; + } fprintf(f, "get=1\n\n"); fflush(f); @@ -314,11 +318,8 @@ static int userspace_get_device(struct wgdevice **out, const char *iface) while (getline(&key, &line_buffer_len, f) > 0) { line_len = strlen(key); - if (line_len == 1 && key[0] == '\n') { - free(key); - fclose(f); - return ret; - } + if (line_len == 1 && key[0] == '\n') + goto err; value = strchr(key, '='); if (!value || line_len == 0 || key[line_len - 1] != '\n') break; @@ -382,7 +383,7 @@ static int userspace_get_device(struct wgdevice **out, const char *iface) *end++ = '\0'; } if (getaddrinfo(begin, end, &hints, &resolved) != 0) { - errno = ENETUNREACH; + ret = ENETUNREACH; goto err; } if ((resolved->ai_family == AF_INET && resolved->ai_addrlen == sizeof(struct sockaddr_in)) || @@ -437,8 +438,10 @@ static int userspace_get_device(struct wgdevice **out, const char *iface) ret = -EPROTO; err: free(key); - free_wgdevice(dev); - *out = NULL; + if (ret) { + free_wgdevice(dev); + *out = NULL; + } fclose(f); errno = -ret; return ret; -- cgit v1.2.3-59-g8ed1b