Add sequence numbers to game state
This oopses on output dependency violations, e.g. two threads doing a read-modify-write without synchronization, or the one thread nesting several read-modify-writes. Such bugs are difficult to spot, and tend to be abusable. I figure we have quite a few of them. New struct emptypedstr member seqno. Make sure all members of unit empobj_storage share it. Initialize it in files: main() and file_sct_init(). Set it in ef_blank() and new ef_set_uid() by calling new get_seqno(). Use ef_set_uid() when copying objects: swaps(), doland(), doship(), doplane(), dounit(), delete_old_news(). Step it in ef_write() by calling new new_seqno(). Factor do_read() out of fillcache() to make it available for get_seqno().
This commit is contained in:
parent
087c0aae36
commit
536ef0b0a2
20 changed files with 134 additions and 19 deletions
|
@ -67,6 +67,7 @@ struct empfile {
|
|||
struct emptypedstr {
|
||||
short ef_type;
|
||||
short uid;
|
||||
unsigned seqno;
|
||||
time_t timestamp;
|
||||
};
|
||||
|
||||
|
@ -189,6 +190,7 @@ extern int ef_close(int);
|
|||
extern int ef_flush(int);
|
||||
extern void ef_blank(int, int, void *);
|
||||
extern int ef_write(int, int, void *);
|
||||
extern void ef_set_uid(int, void *, int);
|
||||
extern int ef_extend(int, int);
|
||||
extern int ef_ensure_space(int, int, int);
|
||||
extern int ef_truncate(int, int);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue