From faa55d8b19a269c2a1c5ada3098dfb775ba17419 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 2 Dec 2019 19:19:38 +0100 Subject: [PATCH] ipc: make sure userspace communication frees wgdevice Signed-off-by: Jason A. Donenfeld --- src/ipc.c | 23 +++++++++++++---------- src/setconf.c | 4 +++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/ipc.c b/src/ipc.c index 89484b1..7207efc 100644 --- a/src/ipc.c +++ b/src/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; diff --git a/src/setconf.c b/src/setconf.c index a244c07..f778f40 100644 --- a/src/setconf.c +++ b/src/setconf.c @@ -45,8 +45,10 @@ static bool sync_conf(struct wgdevice *file) return false; } - if (!runtime->first_peer) + if (!runtime->first_peer) { + free_wgdevice(runtime); return true; + } file->flags &= ~WGDEVICE_REPLACE_PEERS;