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));
> }
>