don't open urandom for hello

This commit is contained in:
hippoz 2023-01-17 23:04:48 +02:00
parent 9a9d001f04
commit 98a4bd2b9f
Signed by: hippoz
GPG key ID: 56C4E02A85F2FBED
2 changed files with 31 additions and 15 deletions

View file

@ -33,7 +33,8 @@ uint64_t hashmap_hash(const char *bytes, size_t bytes_n, size_t map_len)
void bus_free(bus_t *s) void bus_free(bus_t *s)
{ {
if (!s) return; if (!s) return;
if (s->sock_fd) close(s->sock_fd); if (s->sock_fd >= 0) close(s->sock_fd);
if (s->urandom_fd >= 0) close(s->urandom_fd);
// freeing all clients will also free all matches and names // freeing all clients will also free all matches and names
for (int i = 0; i < BUS_MAX_CLIENTS; i++) { for (int i = 0; i < BUS_MAX_CLIENTS; i++) {
bus_client_remove(s, i); bus_client_remove(s, i);
@ -48,10 +49,17 @@ bus_t *bus_create(const char *socket_path)
return NULL; return NULL;
} }
s->urandom_fd = -1;
s->sock_fd = -1;
s->urandom_fd = open("/dev/urandom", 0);
if (s->urandom_fd < 0) {
goto defer_fail;
}
s->sock_fd = socket(AF_UNIX, SOCK_STREAM, 0); s->sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (s->sock_fd == -1) { if (s->sock_fd == -1) {
free(s); goto defer_fail;
return NULL;
} }
struct sockaddr_un name; struct sockaddr_un name;
@ -61,15 +69,19 @@ bus_t *bus_create(const char *socket_path)
unlink(socket_path); unlink(socket_path);
int flags = fcntl(s->sock_fd, F_GETFL, 0);
if (flags < 0) {
goto defer_fail;
}
if (fcntl(s->sock_fd, F_SETFL, flags | O_NONBLOCK) < 0) {
goto defer_fail;
}
if (bind(s->sock_fd, (const struct sockaddr *)&name, sizeof(name)) == -1) { if (bind(s->sock_fd, (const struct sockaddr *)&name, sizeof(name)) == -1) {
close(s->sock_fd); goto defer_fail;
free(s);
return NULL;
} }
if (listen(s->sock_fd, BUS_BACKLOG) == -1) { if (listen(s->sock_fd, BUS_BACKLOG) == -1) {
close(s->sock_fd); goto defer_fail;
free(s);
return NULL;
} }
for (int i = 0; i < BUS_MAX_CLIENTS; i++) { for (int i = 0; i < BUS_MAX_CLIENTS; i++) {
@ -100,6 +112,13 @@ bus_t *bus_create(const char *socket_path)
s->fd_num = BUS_MAX_CLIENTS + 1; s->fd_num = BUS_MAX_CLIENTS + 1;
return s; return s;
defer_fail:
if (s) {
if (s->urandom_fd >= 0) close(s->urandom_fd);
if (s->sock_fd >= 0) close(s->sock_fd);
free(s);
}
return NULL;
} }
int bus_client_add(bus_t *s, int fd) int bus_client_add(bus_t *s, int fd)
@ -198,14 +217,10 @@ int bus_client_assign_unique_name(bus_t *s, int i)
return -1; return -1;
} }
uint32_t id = 0; uint32_t id = 0;
FILE *urandom_file = fopen("/dev/urandom", "rb");
if (!urandom_file) { if (read(s->urandom_fd, &id, sizeof(uint32_t)) != sizeof(uint32_t)) {
return -1; return -1;
} }
if (fread(&id, 1, sizeof(uint32_t), urandom_file) != sizeof(uint32_t)) {
return -1;
}
fclose(urandom_file);
char *name = malloc(sizeof(char) * 16); char *name = malloc(sizeof(char) * 16);
if (!name) { if (!name) {

View file

@ -49,6 +49,7 @@ typedef struct bus {
int fd_num; int fd_num;
int names_count; int names_count;
int clients_count; int clients_count;
int urandom_fd;
bus_client_t clients[BUS_MAX_CLIENTS]; bus_client_t clients[BUS_MAX_CLIENTS];
bus_name_t names[BUS_MAX_NAMES]; bus_name_t names[BUS_MAX_NAMES];
struct pollfd fds[BUS_MAX_CLIENTS + 1]; struct pollfd fds[BUS_MAX_CLIENTS + 1];