[PATCH] Replace random() and related calls with generate_random_buffer()

Volker Lendecke Volker.Lendecke at SerNet.DE
Thu Jul 9 07:30:19 UTC 2015


On Tue, Jul 07, 2015 at 03:18:26PM +0100, Robin McCorkell wrote:
> This patch replaces my previous 'Seed random generator in main()' patch, by
> replacing all calls to random() with generate_random_buffer(). I hope I got
> the memory management with talloc right.
> 
> I found some whitespace issues in dfs_server_ad.c, with spaces being used
> instead of tabs for indentation. This is now fixed, sorry for the diff mumble
> 
> Robin McCorkell
> 
> ---
>  dfs_server/dfs_server_ad.c | 28 ++++++++++++++++++----------
>  source3/smbd/msdfs.c       | 11 +++++++++--
>  2 files changed, 27 insertions(+), 12 deletions(-)
> 
> diff --git a/dfs_server/dfs_server_ad.c b/dfs_server/dfs_server_ad.c
> index 3d93e19..ca88982 100644
> --- a/dfs_server/dfs_server_ad.c
> +++ b/dfs_server/dfs_server_ad.c
> @@ -40,20 +40,27 @@ struct dc_set {
>  
>  static void shuffle_dc_set(struct dc_set *list)
>  {
> -       uint32_t i;
> +	uint32_t i;
> +	uint8_t *random;
>  
> -       srandom(time(NULL));
> +	random = talloc_array(NULL, uint8_t, list->count + 1);

Can't you call generate_random() in every round? I doubt
that this will be noticable performance-wise.



> +	if (random == NULL) {
> +		return; /* No shuffling, oops */
> +	}
> +	generate_random_buffer(random, list->count + 1);
>  
> -       for (i = list->count; i > 1; i--) {
> -               uint32_t r;
> -               const char *tmp;
> +	for (i = list->count; i > 1; i--) {
> +		uint8_t r;
> +		const char *tmp;
>  
> -               r = random() % i;
> +		r = random[i] % i;
>  
> -               tmp = list->names[i - 1];
> -               list->names[i - 1] = list->names[r];
> -               list->names[r] = tmp;
> -       }
> +		tmp = list->names[i - 1];
> +		list->names[i - 1] = list->names[r];
> +		list->names[r] = tmp;
> +	}
> +
> +	talloc_free(random);
>  }
>  
>  /*
> @@ -945,3 +952,4 @@ NTSTATUS dfs_server_ad_get_referrals(struct loadparm_context *lp_ctx,
>  	/* By default until all the case are handled */
>  	return NT_STATUS_NOT_FOUND;
>  }
> +
> diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
> index a39efce..2a3fc83 100644
> --- a/source3/smbd/msdfs.c
> +++ b/source3/smbd/msdfs.c
> @@ -433,16 +433,23 @@ static void shuffle_strlist(char **list, int count)
>  {
>  	int i, r;
>  	char *tmp;
> +	uint8_t *random;
>  
> -	srandom(time(NULL));
> +	random = talloc_array(NULL, uint8_t, count + 1);
> +	if (random == NULL) {
> +		return; /* No shuffling, oops */
> +	}
> +	generate_random_buffer(random, count + 1);

Same here.

Thanks,

Volker

-- 
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de



More information about the samba-technical mailing list