Mercurial > hg > early-roguelike
view rogue4/extern.h @ 110:5f51f7d9805f
arogue5: fix some save/restore-related crashes.
The save/restore code took the pointer intended as an argument for the
doctor() daemon and wrote it to the savefile as an int. I don't know
why it took so long to fail horribly. The problem has been avoided by
replacing the value with &player when restoring. That seems to be the
only argument ever actually used.
The code also writes only four bytes for an unsigned long; if
sizeof(long) == 8, it casts to unsigned int first. It failed to do the
cast when reading back, with the result that four bytes were read and
the other half of the number was effectively uninitialized.
It apparently works now, but the save/restore code ought still to be
regarded as decidedly unfortunate.
author | John "Elwin" Edwards |
---|---|
date | Mon, 06 Jan 2014 15:57:17 -0500 |
parents | ea7372f5d314 |
children | 1b73a8641b37 |
line wrap: on
line source
/* * Defines for things used in mach_dep.c * * @(#)extern.h 4.3 (Berkeley) 4/2/82 * * Rogue: Exploring the Dungeons of Doom * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman * All rights reserved. * * See the file LICENSE.TXT for full copyright and licensing information. */ /* * Don't change the constants, since they are used for sizes in many * places in the program. */ #define MAXSTR 80 /* maximum length of strings */ #define MAXLINES 32 /* maximum number of screen lines used */ #define MAXCOLS 80 /* maximum number of screen columns used */ #define RN (((seed = seed*11109+13849) >> 16) & 0xffff) /* * Now all the global variables */ extern bool after, amulet, askme, door_stop, fight_flush, firstmove, in_shell, jump, noscore, p_know[], passgo, playing, r_know[], running, s_know[], save_msg, slow_invent, terse, use_savedir, wizard, ws_know[]; extern const char *p_colors[], *r_stones[], *w_names[], *a_names[], *ws_made[]; extern char _flags[], _level[], file_name[], fruit[], home[], huh[], outbuf[], *p_guess[], prbuf[], *r_guess[], *release, runch, *s_guess[], *s_names[], take, whoami[], *ws_guess[], *ws_type[]; extern int a_chances[], a_class[], count, dnum, food_left, fung_hit, fd, group, hungry_state, inpack, lastscore, level, lfd, max_level, mpos, no_command, no_food, no_move, ntraps, purse, quiet, total; extern long seed; extern WINDOW *hw; /* * Function types */ char *charge_str(), *ctime(), *getenv(), *inv_name(), *killname(), *nothing(), *num(), *ring_num(), *tr_name(), *unctrol(), *vowelstr(); void leave(int), quit(int), tstp(), auto_save(int), endit(int); int doctor(), nohaste(), rollwand(), runners(), sight(), stomach(), swander(), turn_see(), unconfuse(), unsee(); void checkout(); long lseek(); extern coord ch_ret; extern shint countch; extern shint direction; extern shint newcount; extern int between; extern int num_checks; extern char lvl_mons[27]; extern char wand_mons[27]; extern coord nh; extern bool got_genocide; #if defined(__GLIBC__) || defined(__INTERIX) /* O_BINARY flag not provided in Interix/SFU or some versions of Linux. It is the same as default behavior so we just zero define it here to make source code compatible. */ #define O_BINARY 0 #endif extern FILE *md_fdopen(int fd, char *mode); extern char *md_getusername(int uid); extern char *md_gethomedir();