diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-12-02 19:19:38 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-12-05 11:48:25 +0100 |
commit | eed7ef0d84c09954291c1c88d08315646cf5c347 (patch) | |
tree | 56e461c04cb0d5bedc10a38bca95729e6f26f54e | |
parent | send: avoid touching skb->{next,prev} directly (diff) | |
download | wireguard-monolithic-historical-eed7ef0d84c09954291c1c88d08315646cf5c347.tar.xz wireguard-monolithic-historical-eed7ef0d84c09954291c1c88d08315646cf5c347.zip |
ipc: make sure userspace communication frees wgdevice
Diffstat (limited to '')
-rw-r--r-- | src/tools/ipc.c | 23 | ||||
-rw-r--r-- | src/tools/setconf.c | 4 |
2 files changed, 16 insertions, 11 deletions
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; diff --git a/src/tools/setconf.c b/src/tools/setconf.c index a244c07..f778f40 100644 --- a/src/tools/setconf.c +++ b/src/tools/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; |