From 1bb714b95e298bc60a839b6daaac60179540b7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= Date: Mon, 3 Jul 2023 19:02:18 +0200 Subject: [PATCH] pipewire: utils: make_random(): do not use errno The function already returns `ssize_t`, so do not use `errno` to communicate the reason for failure, instead, return the negative errno. `pw_getrandom()` was inconsistent in this regard because sometimes it simply returned a negative errno without setting `errno`. This change fixes that as well. --- src/modules/module-raop-sink.c | 25 ++++++++++++++----------- src/pipewire/utils.c | 20 ++++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/modules/module-raop-sink.c b/src/modules/module-raop-sink.c index a54f6d5d6..be03e3726 100644 --- a/src/modules/module-raop-sink.c +++ b/src/modules/module-raop-sink.c @@ -972,6 +972,7 @@ static int rtsp_setup_reply(void *data, int status, const struct spa_dict *heade size_t len; uint64_t ntp; uint16_t control_port, timing_port; + int res; pw_log_info("reply %d", status); @@ -1003,9 +1004,9 @@ static int rtsp_setup_reply(void *data, int status, const struct spa_dict *heade return 0; } - if (pw_getrandom(&impl->seq, sizeof(impl->seq), 0) < 0 || - pw_getrandom(&impl->rtptime, sizeof(impl->rtptime), 0) < 0) { - pw_log_error("error generating random seq and rtptime: %m"); + if ((res = pw_getrandom(&impl->seq, sizeof(impl->seq), 0)) < 0 || + (res = pw_getrandom(&impl->rtptime, sizeof(impl->rtptime), 0)) < 0) { + pw_log_error("error generating random seq and rtptime: %s", spa_strerror(res)); return 0; } @@ -1258,9 +1259,9 @@ static int rtsp_do_announce(struct impl *impl) break; case CRYPTO_RSA: - if (pw_getrandom(impl->key, sizeof(impl->key), 0) < 0 || - pw_getrandom(impl->iv, sizeof(impl->iv), 0) < 0) - return -errno; + if ((res = pw_getrandom(impl->key, sizeof(impl->key), 0)) < 0 || + (res = pw_getrandom(impl->iv, sizeof(impl->iv), 0)) < 0) + return res; rsa_len = rsa_encrypt(impl->key, 16, rsakey); if (rsa_len < 0) @@ -1420,14 +1421,15 @@ static void rtsp_connected(void *data) uint32_t sci[2]; uint8_t rac[16]; char sac[16*4]; + int res; pw_log_info("connected"); impl->connected = true; - if (pw_getrandom(sci, sizeof(sci), 0) < 0 || - pw_getrandom(rac, sizeof(rac), 0) < 0) { - pw_log_error("error generating random data: %m"); + if ((res = pw_getrandom(sci, sizeof(sci), 0)) < 0 || + (res = pw_getrandom(rac, sizeof(rac), 0)) < 0) { + pw_log_error("error generating random data: %s", spa_strerror(res)); return; } @@ -1533,6 +1535,7 @@ static int rtsp_do_connect(struct impl *impl) { const char *hostname, *port; uint32_t session_id; + int res; if (impl->connected) { if (!impl->ready) @@ -1545,8 +1548,8 @@ static int rtsp_do_connect(struct impl *impl) if (hostname == NULL || port == NULL) return -EINVAL; - if (pw_getrandom(&session_id, sizeof(session_id), 0) < 0) - return -errno; + if ((res = pw_getrandom(&session_id, sizeof(session_id), 0)) < 0) + return res; spa_scnprintf(impl->session_id, sizeof(impl->session_id), "%u", session_id); diff --git a/src/pipewire/utils.c b/src/pipewire/utils.c index 93170e8c2..263cee1ad 100644 --- a/src/pipewire/utils.c +++ b/src/pipewire/utils.c @@ -158,21 +158,25 @@ char *pw_strip(char *str, const char *whitespace) static inline ssize_t make_random(void *buf, size_t buflen, unsigned int flags) { ssize_t bytes; - int read_errno; #ifdef HAVE_GETRANDOM bytes = getrandom(buf, buflen, flags); - if (!(bytes == -1 && errno == ENOSYS)) + if (bytes < 0) + bytes = -errno; + if (bytes != -ENOSYS) return bytes; #endif int fd = open("/dev/urandom", O_CLOEXEC); if (fd < 0) - return -1; + return -errno; + bytes = read(fd, buf, buflen); - read_errno = errno; + if (bytes < 0) + bytes = -errno; + close(fd); - errno = read_errno; + return bytes; } @@ -190,9 +194,9 @@ ssize_t pw_getrandom(void *buf, size_t buflen, unsigned int flags) ssize_t res; do { res = make_random(buf, buflen, flags); - } while ((res == -1) && (errno == EINTR)); - if (res == -1) - return -errno; + } while (res == -EINTR); + if (res < 0) + return res; if ((size_t)res != buflen) return -ENODATA; return res;