diff mbox series

[BlueZ] fix build with glibc < 2.25

Message ID 20220214131451.2397549-1-fontaine.fabrice@gmail.com
State New
Headers show
Series [BlueZ] fix build with glibc < 2.25 | expand

Commit Message

Fabrice Fontaine Feb. 14, 2022, 1:14 p.m. UTC
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(+)

Comments

Marcel Holtmann Feb. 14, 2022, 2:14 p.m. UTC | #1
Hi Fabrice,

> 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(+)
> 
> 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

you need to introduce a src/missing.h and provide a getrandom fallback. I am not allowing to spread #ifdef around the code for some old glibc compatibility.

Regards

Marcel
diff mbox series

Patch

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);