[PATCH] Use arc4random instead of rand where available

Tiago Vignatti vignatti at freedesktop.org
Mon Mar 22 13:51:39 PDT 2010


Jeremy Huddleston wrote:
> Mainly to shut up clang.  These are not security-sensitive uses of rand()
> 
> Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>
> ---
>  configure.ac            |    2 +-
>  dix/window.c            |   18 ++++++++++++++++++
>  exa/exa_glyphs.c        |    8 ++++++++
>  include/dix-config.h.in |    3 +++
>  4 files changed, 30 insertions(+), 1 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index d379b3a..361f380 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -206,7 +206,7 @@ dnl Checks for library functions.
>  AC_FUNC_VPRINTF
>  AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
>  		strtol getopt getopt_long vsnprintf walkcontext backtrace \
> -		getisax getzoneid shmctl64 strcasestr ffs])
> +		getisax getzoneid shmctl64 strcasestr ffs arc4random])
>  AC_FUNC_ALLOCA
>  dnl Old HAS_* names used in os/*.c.
>  AC_CHECK_FUNC([getdtablesize],
> diff --git a/dix/window.c b/dix/window.c
> index c7201df..303cf4d 100644
> --- a/dix/window.c
> +++ b/dix/window.c
> @@ -3189,10 +3189,17 @@ dixSaveScreens(ClientPtr client, int on, int mode)
>  		if (logoScreenSaver)
>  		    (*pWin->drawable.pScreen->ClearToBackground)(pWin, 0, 0, 0, 0, FALSE);
>  #endif
> +#ifdef HAVE_ARC4RANDOM
> +		(*pWin->drawable.pScreen->MoveWindow)(pWin,
> +			   (short)(-(arc4random() % RANDOM_WIDTH)),
> +			   (short)(-(arc4random() % RANDOM_WIDTH)),
> +			   pWin->nextSib, VTMove);
> +#else
>  		(*pWin->drawable.pScreen->MoveWindow)(pWin,
>  			   (short)(-(rand() % RANDOM_WIDTH)),
>  			   (short)(-(rand() % RANDOM_WIDTH)),
>  			   pWin->nextSib, VTMove);
> +#endif
>  #ifndef NOLOGOHACK
>  		if (logoScreenSaver)
>  		    DrawLogo(pWin);
> @@ -3732,7 +3739,11 @@ DrawLogo(WindowPtr pWin)
>      if (!pGC)
>  	return;
>  
> +#ifdef HAVE_ARC4RANDOM 
> +    if ((arc4random() % 100) <= 17) /* make the probability for white fairly low */
> +#else
>      if ((rand() % 100) <= 17) /* make the probability for white fairly low */
> +#endif
>  	fore[0].val = pScreen->whitePixel;
>      else
>  	fore[0].val = pScreen->blackPixel;
> @@ -3776,10 +3787,17 @@ DrawLogo(WindowPtr pWin)
>      size = width;
>      if (height < width)
>  	 size = height;
> +#ifdef HAVE_ARC4RANDOM
> +    size = RANDOM_WIDTH + arc4random() % (size - RANDOM_WIDTH);
> +    size &= ~1;
> +    x += arc4random() % (width - size);
> +    y += arc4random() % (height - size);
> +#else
>      size = RANDOM_WIDTH + rand() % (size - RANDOM_WIDTH);
>      size &= ~1;
>      x += rand() % (width - size);
>      y += rand() % (height - size);
> +#endif
>  
>  /*
>   * Draw what will be the thin strokes.
> diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
> index fd14e9b..8c9e591 100644
> --- a/exa/exa_glyphs.c
> +++ b/exa/exa_glyphs.c
> @@ -223,7 +223,11 @@ exaRealizeGlyphCaches(ScreenPtr    pScreen,
>  	for (j = 0; j < cache->hashSize; j++)
>  	    cache->hashEntries[j] = -1;
>  	
> +#ifdef HAVE_ARC4RANDOM 
> +	cache->evictionPosition = arc4random() % cache->size;
> +#else
>  	cache->evictionPosition = rand() % cache->size;
> +#endif
>      }
>  
>      /* Each cache references the picture individually */
> @@ -504,7 +508,11 @@ exaGlyphCacheBufferGlyph(ScreenPtr         pScreen,
>  	    exaGlyphCacheHashInsert(cache, pGlyph, pos);
>  
>  	    /* And pick a new eviction position */
> +#ifdef HAVE_ARC4RANDOM 
> +	    cache->evictionPosition = arc4random() % cache->size;
> +#else
>  	    cache->evictionPosition = rand() % cache->size;
> +#endif
>  	}
>  
>  	exaGlyphCacheUploadGlyph(pScreen, cache, x, y, pGlyph);
> diff --git a/include/dix-config.h.in b/include/dix-config.h.in
> index 058c8fd..2ded353 100644
> --- a/include/dix-config.h.in
> +++ b/include/dix-config.h.in
> @@ -54,6 +54,9 @@
>  /* Support XDM-AUTH*-1 */
>  #undef HASXDMAUTH
>  
> +/* Define to 1 if you have the `arc4random' function. */
> +#undef HAVE_ARC4RANDOM
> +
>  /* Define to 1 if you have the `getdtablesize' function. */
>  #undef HAS_GETDTABLESIZE
>  

a macro on some internal header file would be much nicer, isn't Jeremy?

                                   Tiago


More information about the xorg-devel mailing list