On Wed, Dec 31, 2014, at 04:16 PM, Theo Buehler wrote:
> The adventure game is currently broken.  When it's started without
> any arguments, it spits a pile of garbage to stdout before eventually
> dumping its core.
> 
Confirmed true for i386 running a snapshot from 27-Dec-2014.
With your patch (obtained from CVS) the game starts up properly
and I'm able to quit without breaking the terminal.

> The game data of adventure(6) is obfuscated at compile time with a
> scheme relying on deterministic random() and deobfuscated at runtime.
> This is done ``to prevent casual snooping of the executable'' (cf.
> status.c).  Thus the program must use the deterministic random generator
> for that elaborate scheme.
> 
> Randomness during game play comes exclusively from the ran() function in
> wizard.c -- which currently suffers from modulo bias -- better use
> arc4random_uniform() there.
> 
> Index: init.c
> ===================================================================
> RCS file: /cvs/src/games/adventure/init.c,v
> retrieving revision 1.12
> diff -u -p -r1.12 init.c
> --- init.c      8 Dec 2014 21:56:27 -0000       1.12
> +++ init.c      31 Dec 2014 15:11:34 -0000
> @@ -56,6 +56,11 @@ int     setbit[16] = {1, 2, 4, 010, 020,
>  void
>  init(void)                      /* everything for 1st time run */
>  {
> +       /*
> +        * We need deterministic randomness for the obfuscation schemes
> +        * in io.c and setup.c.
> +        */
> +       srandom_deterministic(1);
>       rdata();                /* read data from orig. file */
>       linkdata();
>       poof();
> Index: setup.c
> ===================================================================
> RCS file: /cvs/src/games/adventure/setup.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 setup.c
> --- setup.c     8 Dec 2014 21:56:27 -0000       1.11
> +++ setup.c     31 Dec 2014 15:11:34 -0000
> @@ -78,6 +78,8 @@ main(int argc, char *argv[])
>       count = 0;
>       linestart = YES;
>  
> +       srandom_deterministic(1);
> +
>       while ((c = getc(infile)) != EOF) {
>               if (count++ % LINE == 0)
>                       printf("\n\t");
> Index: wizard.c
> ===================================================================
> RCS file: /cvs/src/games/adventure/wizard.c,v
> retrieving revision 1.16
> diff -u -p -r1.16 wizard.c
> --- wizard.c    16 Nov 2014 04:49:48 -0000      1.16
> +++ wizard.c    31 Dec 2014 15:11:34 -0000
> @@ -141,8 +141,5 @@ ciao(void)
>  int
>  ran(int range)
>  {
> -       long    i;
> -
> -       i = random() % range;
> -       return (i);
> +       return (arc4random_uniform(range));
>  }
> 

Reply via email to