diff mbox series

[BlueZ,v3] fix build with glibc < 2.25

Message ID 20220214201739.3996569-1-fontaine.fabrice@gmail.com (mailing list archive)
State Accepted
Commit fb57ad9b9d107856e5f1c8135da04ffa2f7a11ac
Headers show
Series [BlueZ,v3] fix build with glibc < 2.25 | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/checkpatch warning [BlueZ,v3] fix build with glibc < 2.25 WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line) #81: https://www.gnu.org/software/gnulib/manual/html_node/sys_002frandom_002eh.html /github/workspace/src/12746111.patch total: 0 errors, 1 warnings, 208 lines checked NOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace. /github/workspace/src/12746111.patch has style problems, please review. NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS.
tedd_an/gitlint fail [BlueZ,v3] fix build with glibc < 2.25 14: B1 Line exceeds max length (83>80): "https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/utils.c" 17: B1 Line exceeds max length (82>80): " - http://autobuild.buildroot.org/results/6b8870d12e0804d6154230a7322c49416c1dc0e2"
tedd_an/setupell success Setup ELL PASS
tedd_an/buildprep success Build Prep PASS
tedd_an/build success Build Configuration PASS
tedd_an/makecheck success Make Check PASS
tedd_an/makecheckvalgrind success Make Check PASS
tedd_an/makedistcheck success Make Distcheck PASS
tedd_an/build_extell success Build External ELL PASS
tedd_an/build_extell_make success Build Make with External ELL PASS

Commit Message

Fabrice Fontaine Feb. 14, 2022, 8:17 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:

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

To fix this build failure, add util_getrandom and a fallback (borrowed
from pipewire and licensed under MIT):
https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/utils.c

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

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
Changes v2 -> v3 (after review of Luiz Augusto von Dentz):
 - Move code to util_getrandom

Changes v1 -> v2 (after review of Marcel Holtmann):
 - Add a getrandom fallback in src/missing.h instead of adding ifdef

 configure.ac           |  4 +++-
 emulator/le.c          |  3 +--
 emulator/phy.c         |  3 +--
 peripheral/main.c      |  4 ++--
 plugins/autopair.c     |  4 ++--
 profiles/health/hdp.c  |  4 ++--
 profiles/health/mcap.c |  6 +++---
 src/shared/util.c      | 25 +++++++++++++++++++++++++
 src/shared/util.h      |  2 ++
 tools/btgatt-server.c  |  3 +--
 10 files changed, 42 insertions(+), 16 deletions(-)

Comments

bluez.test.bot@gmail.com Feb. 14, 2022, 10:48 p.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=614255

---Test result---

Test Summary:
CheckPatch                    FAIL      1.67 seconds
GitLint                       FAIL      1.09 seconds
Prep - Setup ELL              PASS      53.15 seconds
Build - Prep                  PASS      0.80 seconds
Build - Configure             PASS      10.64 seconds
Build - Make                  PASS      1517.59 seconds
Make Check                    PASS      13.23 seconds
Make Check w/Valgrind         PASS      538.52 seconds
Make Distcheck                PASS      282.86 seconds
Build w/ext ELL - Configure   PASS      10.65 seconds
Build w/ext ELL - Make        PASS      1494.26 seconds
Incremental Build with patchesPASS      0.00 seconds

Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script with rule in .checkpatch.conf
Output:
[BlueZ,v3] fix build with glibc < 2.25
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#81: 
https://www.gnu.org/software/gnulib/manual/html_node/sys_002frandom_002eh.html

/github/workspace/src/12746111.patch total: 0 errors, 1 warnings, 208 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12746111.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.


##############################
Test: GitLint - FAIL
Desc: Run gitlint with rule in .gitlint
Output:
[BlueZ,v3] fix build with glibc < 2.25
14: B1 Line exceeds max length (83>80): "https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/utils.c"
17: B1 Line exceeds max length (82>80): " - http://autobuild.buildroot.org/results/6b8870d12e0804d6154230a7322c49416c1dc0e2"




---
Regards,
Linux Bluetooth
diff mbox series

Patch

diff --git a/configure.ac b/configure.ac
index 07d068a4d..441bd5f29 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,
@@ -68,7 +70,7 @@  AC_CHECK_LIB(pthread, pthread_create, dummy=yes,
 AC_CHECK_LIB(dl, dlopen, dummy=yes,
 			AC_MSG_ERROR(dynamic linking loader is required))
 
-AC_CHECK_HEADERS(linux/types.h linux/if_alg.h linux/uinput.h linux/uhid.h)
+AC_CHECK_HEADERS(linux/types.h linux/if_alg.h linux/uinput.h linux/uhid.h sys/random.h)
 
 PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.28, dummy=yes,
 				AC_MSG_ERROR(GLib >= 2.28 is required))
diff --git a/emulator/le.c b/emulator/le.c
index f8f313f2c..7656a657c 100644
--- a/emulator/le.c
+++ b/emulator/le.c
@@ -20,7 +20,6 @@ 
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/uio.h>
-#include <sys/random.h>
 #include <time.h>
 
 #include "lib/bluetooth.h"
@@ -509,7 +508,7 @@  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.
 	 */
-	if (getrandom(&val, sizeof(val), 0) < 0) {
+	if (util_getrandom(&val, sizeof(val), 0) < 0) {
 		/* If it fails to get the random number, use a static value */
 		val = 5;
 	}
diff --git a/emulator/phy.c b/emulator/phy.c
index 44cace438..7de85fb05 100644
--- a/emulator/phy.c
+++ b/emulator/phy.c
@@ -19,7 +19,6 @@ 
 #include <stdlib.h>
 #include <string.h>
 #include <sys/socket.h>
-#include <sys/random.h>
 #include <netinet/in.h>
 #include <netinet/ip.h>
 #include <time.h>
@@ -174,7 +173,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))) {
-		if (getrandom(&phy->id, sizeof(phy->id), 0) < 0) {
+		if (util_getrandom(&phy->id, sizeof(phy->id), 0) < 0) {
 			mainloop_remove_fd(phy->rx_fd);
 			close(phy->tx_fd);
 			close(phy->rx_fd);
diff --git a/peripheral/main.c b/peripheral/main.c
index 91adb45fc..b82d7caf6 100644
--- a/peripheral/main.c
+++ b/peripheral/main.c
@@ -25,13 +25,13 @@ 
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/mount.h>
-#include <sys/random.h>
 
 #ifndef WAIT_ANY
 #define WAIT_ANY (-1)
 #endif
 
 #include "src/shared/mainloop.h"
+#include "src/shared/util.h"
 #include "peripheral/efivars.h"
 #include "peripheral/attach.h"
 #include "peripheral/gap.h"
@@ -192,7 +192,7 @@  int main(int argc, char *argv[])
 							addr, 6) < 0) {
 			printf("Generating new persistent static address\n");
 
-			if (getrandom(addr, sizeof(addr), 0) < 0) {
+			if (util_getrandom(addr, sizeof(addr), 0) < 0) {
 				perror("Failed to get random static address");
 				return EXIT_FAILURE;
 			}
diff --git a/plugins/autopair.c b/plugins/autopair.c
index a75ecebe4..0b09e893f 100644
--- a/plugins/autopair.c
+++ b/plugins/autopair.c
@@ -17,7 +17,6 @@ 
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
-#include <sys/random.h>
 
 #include <glib.h>
 
@@ -29,6 +28,7 @@ 
 #include "src/device.h"
 #include "src/log.h"
 #include "src/storage.h"
+#include "src/shared/util.h"
 
 /*
  * Plugin to handle automatic pairing of devices with reduced user
@@ -131,7 +131,7 @@  static ssize_t autopair_pincb(struct btd_adapter *adapter,
 			if (attempt >= 4)
 				return 0;
 
-			if (getrandom(&val, sizeof(val), 0) < 0) {
+			if (util_getrandom(&val, sizeof(val), 0) < 0) {
 				error("Failed to get a random pincode");
 				return 0;
 			}
diff --git a/profiles/health/hdp.c b/profiles/health/hdp.c
index 9d9d1e824..b6590cd3a 100644
--- a/profiles/health/hdp.c
+++ b/profiles/health/hdp.c
@@ -16,7 +16,6 @@ 
 #include <stdint.h>
 #include <stdbool.h>
 #include <unistd.h>
-#include <sys/random.h>
 
 #include <glib.h>
 
@@ -33,6 +32,7 @@ 
 #include "src/device.h"
 #include "src/sdpd.h"
 #include "src/shared/timeout.h"
+#include "src/shared/util.h"
 #include "btio/btio.h"
 
 #include "hdp_types.h"
@@ -1490,7 +1490,7 @@  static void *generate_echo_packet(void)
 	if (!buf)
 		return NULL;
 
-	if (getrandom(buf, HDP_ECHO_LEN, 0) < 0) {
+	if (util_getrandom(buf, HDP_ECHO_LEN, 0) < 0) {
 		g_free(buf);
 		return NULL;
 	}
diff --git a/profiles/health/mcap.c b/profiles/health/mcap.c
index aad0a08a3..5d2bac3d9 100644
--- a/profiles/health/mcap.c
+++ b/profiles/health/mcap.c
@@ -19,7 +19,6 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <time.h>
-#include <sys/random.h>
 
 #include <glib.h>
 
@@ -28,6 +27,7 @@ 
 #include "btio/btio.h"
 #include "src/log.h"
 #include "src/shared/timeout.h"
+#include "src/shared/util.h"
 
 #include "mcap.h"
 
@@ -1905,7 +1905,7 @@  gboolean mcap_create_mcl(struct mcap_instance *mi,
 		mcl->state = MCL_IDLE;
 		bacpy(&mcl->addr, addr);
 		set_default_cb(mcl);
-		if (getrandom(&val, sizeof(val), 0) < 0) {
+		if (util_getrandom(&val, sizeof(val), 0) < 0) {
 			mcap_instance_unref(mcl->mi);
 			g_free(mcl);
 			return FALSE;
@@ -2049,7 +2049,7 @@  static void connect_mcl_event_cb(GIOChannel *chan, GError *gerr,
 		mcl->mi = mcap_instance_ref(mi);
 		bacpy(&mcl->addr, &dst);
 		set_default_cb(mcl);
-		if (getrandom(&val, sizeof(val), 0) < 0) {
+		if (util_getrandom(&val, sizeof(val), 0) < 0) {
 			mcap_instance_unref(mcl->mi);
 			g_free(mcl);
 			goto drop;
diff --git a/src/shared/util.c b/src/shared/util.c
index 6e1c83057..33196bf8b 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -13,6 +13,7 @@ 
 #endif
 
 #define _GNU_SOURCE
+#include <fcntl.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <stdbool.h>
@@ -23,6 +24,10 @@ 
 #include <limits.h>
 #include <string.h>
 
+#ifdef HAVE_SYS_RANDOM_H
+#include <sys/random.h>
+#endif
+
 #include "src/shared/util.h"
 
 void *util_malloc(size_t size)
@@ -138,6 +143,26 @@  unsigned char util_get_dt(const char *parent, const char *name)
 	return DT_UNKNOWN;
 }
 
+/* Helper for getting a random in case getrandom unavailable (glibc < 2.25) */
+ssize_t util_getrandom(void *buf, size_t buflen, unsigned int flags)
+{
+#ifdef HAVE_GETRANDOM
+	return getrandom(buf, buflen, flags);
+#else
+	int fd;
+	ssize_t bytes;
+
+	fd = open("/dev/urandom", O_CLOEXEC);
+	if (fd < 0)
+		return -1;
+
+	bytes = read(fd, buf, buflen);
+	close(fd);
+
+	return bytes;
+#endif
+}
+
 /* Helpers for bitfield operations */
 
 /* Find unique id in range from 1 to max but no bigger than 64. */
diff --git a/src/shared/util.h b/src/shared/util.h
index 8ef6132c4..c01eccf8a 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -103,6 +103,8 @@  void util_hexdump(const char dir, const unsigned char *buf, size_t len,
 
 unsigned char util_get_dt(const char *parent, const char *name);
 
+ssize_t util_getrandom(void *buf, size_t buflen, unsigned int flags);
+
 uint8_t util_get_uid(uint64_t *bitmap, uint8_t max);
 void util_clear_uid(uint64_t *bitmap, uint8_t id);
 
diff --git a/tools/btgatt-server.c b/tools/btgatt-server.c
index 15d49a464..4a5d2b720 100644
--- a/tools/btgatt-server.c
+++ b/tools/btgatt-server.c
@@ -20,7 +20,6 @@ 
 #include <getopt.h>
 #include <unistd.h>
 #include <errno.h>
-#include <sys/random.h>
 
 #include "lib/bluetooth.h"
 #include "lib/hci.h"
@@ -287,7 +286,7 @@  static bool hr_msrmt_cb(void *user_data)
 	uint32_t cur_ee;
 	uint32_t val;
 
-	if (getrandom(&val, sizeof(val), 0) < 0)
+	if (util_getrandom(&val, sizeof(val), 0) < 0)
 		return false;
 
 	pdu[0] = 0x06;