mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-03-05 01:40:45 -05:00
module-protocol-native: Fix socket activation
Fix path comparison in is_socket_unix() and don't unset LISTEN_FDS since the function that uses it is called more than once and it was not unset when sd_listen_fds() was used. Fixes #5140
This commit is contained in:
parent
d206b06c70
commit
f4e174870e
3 changed files with 7 additions and 11 deletions
|
|
@ -907,7 +907,7 @@ static int add_socket(struct pw_protocol *protocol, struct server *s, struct soc
|
|||
bool activated = false;
|
||||
|
||||
{
|
||||
int i, n = listen_fd();
|
||||
int i, n = listen_fds();
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (is_socket_unix(LISTEN_FDS_START + i, SOCK_STREAM,
|
||||
s->addr.sun_path) > 0) {
|
||||
|
|
|
|||
|
|
@ -576,7 +576,7 @@ static bool is_stale_socket(int fd, const struct sockaddr_un *addr_un)
|
|||
|
||||
static int check_socket_activation(const char *path)
|
||||
{
|
||||
const int n = listen_fd();
|
||||
const int n = listen_fds();
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
const int fd = LISTEN_FDS_START + i;
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ static inline bool pw_net_addr_is_any(struct sockaddr_storage *addr)
|
|||
|
||||
/* Returns the number of file descriptors passed for socket activation.
|
||||
* Returns 0 if none, -1 on error. */
|
||||
static inline int listen_fd(void)
|
||||
static inline int listen_fds(void)
|
||||
{
|
||||
uint32_t n;
|
||||
int i, flags;
|
||||
|
|
@ -161,8 +161,6 @@ static inline int listen_fd(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
unsetenv("LISTEN_FDS");
|
||||
|
||||
return (int)n;
|
||||
}
|
||||
|
||||
|
|
@ -192,12 +190,10 @@ static inline int is_socket_unix(int fd, int type, const char *path)
|
|||
if (addr.sun_family != AF_UNIX)
|
||||
return 0;
|
||||
size_t length = strlen(path);
|
||||
if (length > 0) {
|
||||
if (len < offsetof(struct sockaddr_un, sun_path) + length)
|
||||
return 0;
|
||||
if (memcmp(addr.sun_path, path, length) != 0)
|
||||
return 0;
|
||||
}
|
||||
if (len < offsetof(struct sockaddr_un, sun_path) + length + 1)
|
||||
return 0;
|
||||
if (memcmp(addr.sun_path, path, length + 1) != 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue