libseat: Use SOCK_CLOEXEC and SOCK_NONBLOCK
This both simplifies our code and fixes an exec fd leak when using builtin or noop backends.
This commit is contained in:
parent
96a5de8859
commit
b47c79d731
2 changed files with 3 additions and 19 deletions
|
@ -109,7 +109,7 @@ static struct libseat *noop_open_seat(const struct libseat_seat_listener *listen
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (socketpair(AF_UNIX, SOCK_STREAM, 0, backend->sockets) != 0) {
|
if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, backend->sockets) != 0) {
|
||||||
log_errorf("socketpair() failed: %s", strerror(errno));
|
log_errorf("socketpair() failed: %s", strerror(errno));
|
||||||
free(backend);
|
free(backend);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -42,32 +42,16 @@ struct backend_seatd {
|
||||||
char seat_name[MAX_SEAT_LEN];
|
char seat_name[MAX_SEAT_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
static int set_nonblock(int fd) {
|
|
||||||
int flags;
|
|
||||||
if ((flags = fcntl(fd, F_GETFD)) == -1 || fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if ((flags = fcntl(fd, F_GETFL)) == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int seatd_connect(void) {
|
static int seatd_connect(void) {
|
||||||
union {
|
union {
|
||||||
struct sockaddr_un unix;
|
struct sockaddr_un unix;
|
||||||
struct sockaddr generic;
|
struct sockaddr generic;
|
||||||
} addr = {{0}};
|
} addr = {{0}};
|
||||||
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
log_errorf("Could not create socket: %s", strerror(errno));
|
log_errorf("Could not create socket: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (set_nonblock(fd) == -1) {
|
|
||||||
log_errorf("Could not make socket non-blocking: %s", strerror(errno));
|
|
||||||
close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
const char *path = getenv("SEATD_SOCK");
|
const char *path = getenv("SEATD_SOCK");
|
||||||
if (path == NULL) {
|
if (path == NULL) {
|
||||||
path = SEATD_DEFAULTPATH;
|
path = SEATD_DEFAULTPATH;
|
||||||
|
@ -638,7 +622,7 @@ static int set_deathsig(int signal) {
|
||||||
|
|
||||||
static struct libseat *builtin_open_seat(const struct libseat_seat_listener *listener, void *data) {
|
static struct libseat *builtin_open_seat(const struct libseat_seat_listener *listener, void *data) {
|
||||||
int fds[2];
|
int fds[2];
|
||||||
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
|
if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0, fds) == -1) {
|
||||||
log_errorf("Could not create socket pair: %s", strerror(errno));
|
log_errorf("Could not create socket pair: %s", strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue