From 7b0ec1230e5ef63cce1e43804cf7cdbda845bcc5 Mon Sep 17 00:00:00 2001 From: "John \"Elwin\" Edwards" Date: Fri, 28 Mar 2014 10:57:03 -0700 Subject: [PATCH] arogue5: fix some daemon-related pointer/int casting. Daemons and fuses take a single argument, nominally an int but either ignored or unsafely cast to a pointer. Its type has now been changed to void*. The save/restore code no longer tries to store this argument in the savefile. For doctor(), this is not a problem, because player is the only argument it is ever given as a daemon. However, alchemy() will fail to do anything when passed NULL. Fixing this would be complicated but possible. Summary: the code is slightly safer, but alchemy jugs are guaranteed to stop working after save and restore, instead of just extremely likely. --- arogue5/daemon.c | 10 ++++------ arogue5/rogue.h | 2 +- arogue5/state.c | 7 ++++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/arogue5/daemon.c b/arogue5/daemon.c index 3ac1220..8c02822 100644 --- a/arogue5/daemon.c +++ b/arogue5/daemon.c @@ -87,8 +87,7 @@ reg int (*func)(); * start_daemon: * Start a daemon, takes a function. */ -start_daemon(func, arg, type) -reg int arg, type, (*func)(); +start_daemon(int (*func)(), void *arg, int type) { reg struct delayed_action *dev; @@ -122,7 +121,7 @@ reg int (*func)(); * Take it out of the list */ dev->d_type = EMPTY; - dev->d_arg = 0; + dev->d_arg = NULL; dev->d_func = NULL; dev->d_time = 0; demoncnt -= 1; /* update count */ @@ -155,8 +154,7 @@ reg int flag; * fuse: * Start a fuse to go off in a certain number of turns */ -fuse(func, arg, time, type) -reg int (*func)(), arg, time, type; +fuse(int (*func)(), void *arg, int time, int type) { reg struct delayed_action *wire; @@ -199,7 +197,7 @@ reg int (*func)(); return; wire->d_type = EMPTY; wire->d_func = NULL; - wire->d_arg = 0; + wire->d_arg = NULL; wire->d_time = 0; fusecnt -= 1; } diff --git a/arogue5/rogue.h b/arogue5/rogue.h index 8c3154a..043f39b 100644 --- a/arogue5/rogue.h +++ b/arogue5/rogue.h @@ -725,7 +725,7 @@ struct delayed_action { int d_type; int (*d_func)(); - int d_arg; + void *d_arg; int d_time; }; diff --git a/arogue5/state.c b/arogue5/state.c index 648d65c..43fdb11 100644 --- a/arogue5/state.c +++ b/arogue5/state.c @@ -1420,7 +1420,8 @@ rs_write_daemons(FILE *savef, struct delayed_action *d_list, int count) rs_write_int(savef, d_list[i].d_type); rs_write_int(savef, func); - rs_write_int(savef, d_list[i].d_arg); + /* d_arg is a pointer and can't actually be saved and restored. */ + rs_write_int(savef, 0); rs_write_int(savef, d_list[i].d_time); } @@ -1517,7 +1518,8 @@ rs_read_daemons(int inf, struct delayed_action *d_list, int count) break; } - rs_read_int(inf, &d_list[i].d_arg); + rs_read_int(inf, &dummy); + d_list[i].d_arg = NULL; if (func == 2) d_list[i].d_arg = &player; rs_read_int(inf, &d_list[i].d_time); @@ -1525,7 +1527,6 @@ rs_read_daemons(int inf, struct delayed_action *d_list, int count) if (d_list[i].d_func == NULL) { d_list[i].d_time = 0; - d_list[i].d_arg = 0; d_list[i].d_type = 0; } }