]> git.ipfire.org Git - thirdparty/wireguard-tools.git/commitdiff
ipc: make sure userspace communication frees wgdevice
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 2 Dec 2019 18:19:38 +0000 (19:19 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 5 Dec 2019 10:48:25 +0000 (11:48 +0100)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
src/ipc.c
src/setconf.c

index 89484b1fdf75147a650cac8b30a2bab29015c29f..7207efc699a16d235a45b68346e22609ba6d85ae 100644 (file)
--- 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;
index a244c07d3ff90ad2ba43cd3626280ecdad90ddb1..f778f40f536b602d2f27ab2df15fbb34bab66aff 100644 (file)
@@ -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;