@@ -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,
@@ -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);
}
@@ -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);
@@ -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;
@@ -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;
@@ -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;
}
@@ -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;
}
@@ -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);
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 <fontaine.fabrice@gmail.com> --- 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(+)