ipc: make sure userspace communication frees wgdevice
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
207aeed010
commit
faa55d8b19
19
src/ipc.c
19
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);
|
||||
if (ret) {
|
||||
free_wgdevice(dev);
|
||||
*out = NULL;
|
||||
}
|
||||
fclose(f);
|
||||
errno = -ret;
|
||||
return ret;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue