Message ID | 20220214131451.2397549-1-fontaine.fabrice@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [BlueZ] fix build with glibc < 2.25 | expand |
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
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=614113 ---Test result--- Test Summary: CheckPatch FAIL 1.52 seconds GitLint FAIL 1.09 seconds Prep - Setup ELL PASS 42.43 seconds Build - Prep PASS 0.70 seconds Build - Configure PASS 8.54 seconds Build - Make PASS 1374.98 seconds Make Check PASS 11.33 seconds Make Check w/Valgrind PASS 440.73 seconds Make Distcheck PASS 228.35 seconds Build w/ext ELL - Configure PASS 9.06 seconds Build w/ext ELL - Make PASS 1360.65 seconds Incremental Build with patchesPASS 0.00 seconds Details ############################## Test: CheckPatch - FAIL Desc: Run checkpatch.pl script with rule in .checkpatch.conf Output: [BlueZ] 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 ERROR:SPACING: space required before the open parenthesis '(' #276: FILE: profiles/health/hdp.c:1505: + for(i = 0; i < HDP_ECHO_LEN; i++) /github/workspace/src/12745617.patch total: 1 errors, 1 warnings, 201 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/12745617.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] fix build with glibc < 2.25 14: B1 Line exceeds max length (82>80): " - http://autobuild.buildroot.org/results/6b8870d12e0804d6154230a7322c49416c1dc0e2" --- Regards, Linux Bluetooth
Hi Marcel, Le lun. 14 févr. 2022 à 15:14, Marcel Holtmann <marcel@holtmann.org> a écrit : > > 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. OK, I'll send a v2. > > Regards > > Marcel > Best Regards, Fabrice
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);
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(+)