Skip to content

Commit

Permalink
build: Fix errors with glibc < 2.25
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ffontaine authored and Vudentz committed Feb 15, 2022
1 parent b5ff08b commit fb57ad9
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 16 deletions.
4 changes: 3 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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))
Expand Down
3 changes: 1 addition & 2 deletions emulator/le.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 1 addition & 2 deletions emulator/phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions peripheral/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions plugins/autopair.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/random.h>

#include <glib.h>

Expand All @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions profiles/health/hdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/random.h>

#include <glib.h>

Expand All @@ -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"
Expand Down Expand Up @@ -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;
}
Expand Down
6 changes: 3 additions & 3 deletions profiles/health/mcap.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <sys/random.h>

#include <glib.h>

Expand All @@ -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"

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
25 changes: 25 additions & 0 deletions src/shared/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#endif

#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
Expand All @@ -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)
Expand Down Expand Up @@ -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. */
Expand Down
2 changes: 2 additions & 0 deletions src/shared/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
3 changes: 1 addition & 2 deletions tools/btgatt-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit fb57ad9

Please sign in to comment.