ipc: make sure userspace communication frees wgdevice

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2019-12-02 19:19:38 +01:00
parent 207aeed010
commit faa55d8b19
2 changed files with 16 additions and 11 deletions

View file

@ -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);
if (ret) {
free_wgdevice(dev);
*out = NULL;
}
fclose(f);
errno = -ret;
return ret;

View 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;