2022-02-14 21:16:11

by Fabrice Fontaine

[permalink] [raw]
Subject: [PATCH BlueZ] fix build with glibc < 2.25

getrandom and sys/random.h are only available since glibc 2.25:
https://www.gnu.org/software/gnulib/manual/html_node/sys_002frandom_002eh.html
resulting in the following build failures since version 5.63 and
https://git.kernel.org/pub/scm/bluetooth/bluez.git/log/?qt=grep&q=getrandom
so put back rand() as a fallback:

plugins/autopair.c:20:24: fatal error: sys/random.h: No such file or directory
#include <sys/random.h>
^

Fixes:
- http://autobuild.buildroot.org/results/6b8870d12e0804d6154230a7322c49416c1dc0e2

Signed-off-by: Fabrice Fontaine <[email protected]>
---
configure.ac | 2 ++
emulator/le.c | 7 +++++++
emulator/phy.c | 7 +++++++
peripheral/main.c | 10 ++++++++++
plugins/autopair.c | 6 ++++++
profiles/health/hdp.c | 11 +++++++++++
profiles/health/mcap.c | 10 ++++++++++
tools/btgatt-server.c | 6 ++++++
8 files changed, 59 insertions(+)

diff --git a/configure.ac b/configure.ac
index 07d068a4d..cdd693da3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -54,6 +54,8 @@ AC_ARG_ENABLE(threads, AS_HELP_STRING([--enable-threads],

AC_CHECK_FUNCS(explicit_bzero)

+AC_CHECK_FUNCS(getrandom)
+
AC_CHECK_FUNCS(rawmemchr)

AC_CHECK_FUNC(signalfd, dummy=yes,
diff --git a/emulator/le.c b/emulator/le.c
index f8f313f2c..9ef0636d0 100644
--- a/emulator/le.c
+++ b/emulator/le.c
@@ -20,7 +20,9 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/uio.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif
#include <time.h>

#include "lib/bluetooth.h"
@@ -509,10 +511,15 @@ static unsigned int get_adv_delay(void)
/* The advertising delay is a pseudo-random value with a range
* of 0 ms to 10 ms generated for each advertising event.
*/
+#ifdef HAVE_GETRANDOM
if (getrandom(&val, sizeof(val), 0) < 0) {
/* If it fails to get the random number, use a static value */
val = 5;
}
+#else
+ srand(time(NULL));
+ val = rand();
+#endif

return (val % 11);
}
diff --git a/emulator/phy.c b/emulator/phy.c
index 44cace438..e41aaf9c2 100644
--- a/emulator/phy.c
+++ b/emulator/phy.c
@@ -19,7 +19,9 @@
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif
#include <netinet/in.h>
#include <netinet/ip.h>
#include <time.h>
@@ -174,6 +176,7 @@ struct bt_phy *bt_phy_new(void)
mainloop_add_fd(phy->rx_fd, EPOLLIN, phy_rx_callback, phy, NULL);

if (!get_random_bytes(&phy->id, sizeof(phy->id))) {
+#ifdef GAVE_GETRANDOM
if (getrandom(&phy->id, sizeof(phy->id), 0) < 0) {
mainloop_remove_fd(phy->rx_fd);
close(phy->tx_fd);
@@ -181,6 +184,10 @@ struct bt_phy *bt_phy_new(void)
free(phy);
return NULL;
}
+#else
+ srandom(time(NULL));
+ phy->id = random();
+#endif
}

bt_phy_send(phy, BT_PHY_PKT_NULL, NULL, 0);
diff --git a/peripheral/main.c b/peripheral/main.c
index 91adb45fc..542adc330 100644
--- a/peripheral/main.c
+++ b/peripheral/main.c
@@ -25,7 +25,9 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mount.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif

#ifndef WAIT_ANY
#define WAIT_ANY (-1)
@@ -192,10 +194,18 @@ int main(int argc, char *argv[])
addr, 6) < 0) {
printf("Generating new persistent static address\n");

+#ifdef HAVE_GETRANDOM
if (getrandom(addr, sizeof(addr), 0) < 0) {
perror("Failed to get random static address");
return EXIT_FAILURE;
}
+#else
+ addr[0] = rand();
+ addr[1] = rand();
+ addr[2] = rand();
+ addr[3] = 0x34;
+ addr[4] = 0x12;
+#endif
/* Overwrite the MSB to make it a static address */
addr[5] = 0xc0;

diff --git a/plugins/autopair.c b/plugins/autopair.c
index a75ecebe4..59d65807c 100644
--- a/plugins/autopair.c
+++ b/plugins/autopair.c
@@ -17,7 +17,9 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif

#include <glib.h>

@@ -131,10 +133,14 @@ static ssize_t autopair_pincb(struct btd_adapter *adapter,
if (attempt >= 4)
return 0;

+#ifdef HAVE_GETRANDOM
if (getrandom(&val, sizeof(val), 0) < 0) {
error("Failed to get a random pincode");
return 0;
}
+#else
+ val = rand();
+#endif
snprintf(pinstr, sizeof(pinstr), "%06u",
val % 1000000);
*display = true;
diff --git a/profiles/health/hdp.c b/profiles/health/hdp.c
index 9d9d1e824..ca59be3e8 100644
--- a/profiles/health/hdp.c
+++ b/profiles/health/hdp.c
@@ -16,7 +16,9 @@
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif

#include <glib.h>

@@ -1485,15 +1487,24 @@ static void destroy_create_dc_data(gpointer data)
static void *generate_echo_packet(void)
{
uint8_t *buf;
+#ifndef HAVE_GETRANDOM
+ int i;
+#endif

buf = g_malloc(HDP_ECHO_LEN);
if (!buf)
return NULL;

+#ifdef HAVE_GETRANDOM
if (getrandom(buf, HDP_ECHO_LEN, 0) < 0) {
g_free(buf);
return NULL;
}
+#else
+ srand(time(NULL));
+ for(i = 0; i < HDP_ECHO_LEN; i++)
+ buf[i] = rand() % UINT8_MAX;
+#endif

return buf;
}
diff --git a/profiles/health/mcap.c b/profiles/health/mcap.c
index aad0a08a3..9bd994fda 100644
--- a/profiles/health/mcap.c
+++ b/profiles/health/mcap.c
@@ -19,7 +19,9 @@
#include <errno.h>
#include <unistd.h>
#include <time.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif

#include <glib.h>

@@ -1905,11 +1907,15 @@ gboolean mcap_create_mcl(struct mcap_instance *mi,
mcl->state = MCL_IDLE;
bacpy(&mcl->addr, addr);
set_default_cb(mcl);
+#ifdef HAVE_GETRANDOM
if (getrandom(&val, sizeof(val), 0) < 0) {
mcap_instance_unref(mcl->mi);
g_free(mcl);
return FALSE;
}
+#else
+ val = rand();
+#endif
mcl->next_mdl = (val % MCAP_MDLID_FINAL) + 1;
}

@@ -2049,11 +2055,15 @@ static void connect_mcl_event_cb(GIOChannel *chan, GError *gerr,
mcl->mi = mcap_instance_ref(mi);
bacpy(&mcl->addr, &dst);
set_default_cb(mcl);
+#ifdef HAVE_GETRANDOM
if (getrandom(&val, sizeof(val), 0) < 0) {
mcap_instance_unref(mcl->mi);
g_free(mcl);
goto drop;
}
+#else
+ val = rand();
+#endif
mcl->next_mdl = (val % MCAP_MDLID_FINAL) + 1;
}

diff --git a/tools/btgatt-server.c b/tools/btgatt-server.c
index 15d49a464..6367ccd9d 100644
--- a/tools/btgatt-server.c
+++ b/tools/btgatt-server.c
@@ -20,7 +20,9 @@
#include <getopt.h>
#include <unistd.h>
#include <errno.h>
+#ifdef HAVE_GETRANDOM
#include <sys/random.h>
+#endif

#include "lib/bluetooth.h"
#include "lib/hci.h"
@@ -287,8 +289,12 @@ static bool hr_msrmt_cb(void *user_data)
uint32_t cur_ee;
uint32_t val;

+#ifdef HAVE_GETRANDOM
if (getrandom(&val, sizeof(val), 0) < 0)
return false;
+#else
+ val = rand();
+#endif

pdu[0] = 0x06;
pdu[1] = 90 + (val % 40);
--
2.34.1