[systemd-devel] [RFC 18/25] sd-ipv4all: fall back to random if no random_r

Umut Tezduyar Lindskog umut at tezduyar.com
Fri Sep 19 04:45:30 PDT 2014


As Tom stated this is changing the behaviour. Maybe not when you only
have 1 interface but if we are talking about multiple interfaces, then
they will share common entropy.

Umut

On Thu, Sep 18, 2014 at 5:43 PM, Tom Gundersen <teg at jklm.no> wrote:
> No, this actually breaks the behaviour, so we absolutely cannot do
> this. Again, I suggest adding the missing features to your libc.
>
> Cheers,
>
> Tom
>
> On Thu, Sep 18, 2014 at 3:24 PM, Emil Renner Berthing <systemd at esmil.dk> wrote:
>> ---
>>  configure.ac                       |  1 +
>>  src/libsystemd-network/sd-ipv4ll.c | 25 +++++++++++++++++++++----
>>  2 files changed, 22 insertions(+), 4 deletions(-)
>>
>> diff --git a/configure.ac b/configure.ac
>> index 397521e..9cd4c05 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -301,6 +301,7 @@ RT_LIBS="$LIBS"
>>  AC_SUBST(RT_LIBS)
>>  LIBS="$save_LIBS"
>>
>> +AC_CHECK_FUNCS([random_r])
>>  AC_CHECK_FUNCS([fanotify_init fanotify_mark])
>>  AC_CHECK_FUNCS([__secure_getenv secure_getenv])
>>  AC_CHECK_DECLS([gettid, pivot_root, canonicalize_file_name, strndupa, name_to_handle_at, setns, LO_FLAGS_PARTSCAN],
>> diff --git a/src/libsystemd-network/sd-ipv4ll.c b/src/libsystemd-network/sd-ipv4ll.c
>> index 8b24331..5712350 100644
>> --- a/src/libsystemd-network/sd-ipv4ll.c
>> +++ b/src/libsystemd-network/sd-ipv4ll.c
>> @@ -81,8 +81,10 @@ struct sd_ipv4ll {
>>          usec_t defend_window;
>>          int next_wakeup_valid;
>>          be32_t address;
>> +#ifdef HAVE_RANDOM_R
>>          struct random_data *random_data;
>>          char *random_data_state;
>> +#endif
>>          /* External */
>>          be32_t claimed_address;
>>          struct ether_addr mac_addr;
>> @@ -141,18 +143,24 @@ static sd_ipv4ll *ipv4ll_stop(sd_ipv4ll *ll, int event) {
>>
>>  static int ipv4ll_pick_address(sd_ipv4ll *ll, be32_t *address) {
>>          be32_t addr;
>> -        int r;
>> -        int32_t random;
>>
>>          assert(ll);
>>          assert(address);
>> +#ifdef HAVE_RANDOM_R
>>          assert(ll->random_data);
>> +#endif
>>
>>          do {
>> -                r = random_r(ll->random_data, &random);
>> +#ifdef HAVE_RANDOM_R
>> +                int32_t value;
>> +                int r = random_r(ll->random_data, &value);
>> +
>>                  if (r < 0)
>>                          return r;
>> -                addr = htonl((random & 0x0000FFFF) | IPV4LL_NETWORK);
>> +#else
>> +                long int value = random();
>> +#endif
>> +                addr = htonl((value & 0x0000FFFF) | IPV4LL_NETWORK);
>>          } while (addr == ll->address ||
>>                  (ntohl(addr) & IPV4LL_NETMASK) != IPV4LL_NETWORK ||
>>                  (ntohl(addr) & 0x0000FF00) == 0x0000 ||
>> @@ -481,6 +489,7 @@ int sd_ipv4ll_set_address_seed (sd_ipv4ll *ll, uint8_t seed[8]) {
>>
>>          entropy = *seed;
>>
>> +#ifdef HAVE_RANDOM_R
>>          free(ll->random_data);
>>          free(ll->random_data_state);
>>
>> @@ -503,6 +512,10 @@ error:
>>                  ll->random_data = NULL;
>>                  ll->random_data_state = NULL;
>>          }
>> +#else
>> +        srandom(entropy);
>> +        r = 0;
>> +#endif
>>          return r;
>>  }
>>
>> @@ -535,6 +548,7 @@ int sd_ipv4ll_start (sd_ipv4ll *ll) {
>>          ll->defend_window = 0;
>>          ll->claimed_address = 0;
>>
>> +#ifdef HAVE_RANDOM_R
>>          if (!ll->random_data) {
>>                  uint8_t seed[8];
>>
>> @@ -546,6 +560,7 @@ int sd_ipv4ll_start (sd_ipv4ll *ll) {
>>                  if (r < 0)
>>                          goto out;
>>          }
>> +#endif
>>
>>          if (ll->address == 0) {
>>                  r = ipv4ll_pick_address(ll, &ll->address);
>> @@ -614,8 +629,10 @@ sd_ipv4ll *sd_ipv4ll_unref(sd_ipv4ll *ll) {
>>
>>                  sd_ipv4ll_detach_event(ll);
>>
>> +#ifdef HAVE_RANDOM_R
>>                  free(ll->random_data);
>>                  free(ll->random_data_state);
>> +#endif
>>                  free(ll);
>>
>>                  return NULL;
>> --
>> 2.1.0
>>
>> _______________________________________________
>> systemd-devel mailing list
>> systemd-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


More information about the systemd-devel mailing list