Fix files utility not to set timestamps

Commit f33b96b1 (v4.3.12) made files again set timestamps.  That was
intentionally suppressed in commit 990eb46b (v4.3.10), because it
facilitates attacks against the PRNG.  Commit 8f98e53a (v4.3.0) had
added it as a feature.

Fix by making files's main() pass new flag EFF_NOTIME to ef_open().
Implement the flag in do_write().
This commit is contained in:
Markus Armbruster 2008-05-17 19:35:22 +02:00
parent 2a125c5463
commit 967122ae0b
3 changed files with 7 additions and 4 deletions

View file

@ -98,9 +98,11 @@ struct emptypedstr {
#define EFF_PRIVATE bit(9) #define EFF_PRIVATE bit(9)
/* Table is customized (configuration tables only) */ /* Table is customized (configuration tables only) */
#define EFF_CUSTOM bit(10) #define EFF_CUSTOM bit(10)
/* Don't update timestamps */
#define EFF_NOTIME bit(11)
/* Transient flags, only occur in argument of ef_open() */ /* Transient flags, only occur in argument of ef_open() */
/* Create table file, clobbering any existing file */ /* Create table file, clobbering any existing file */
#define EFF_CREATE bit(11) #define EFF_CREATE bit(16)
/* /*
* Empire `file types' * Empire `file types'

View file

@ -369,7 +369,7 @@ do_write(struct empfile *ep, void *buf, int id, int count)
return -1; return -1;
if (ep->flags & EFF_TYPED) { if (ep->flags & EFF_TYPED) {
now = time(NULL); now = ep->flags & EFF_NOTIME ? (time_t)-1 : time(NULL);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
/* /*
* TODO Oopses here could be due to bad data corruption. * TODO Oopses here could be due to bad data corruption.
@ -380,7 +380,8 @@ do_write(struct empfile *ep, void *buf, int id, int count)
elt->ef_type = ep->uid; elt->ef_type = ep->uid;
if (CANT_HAPPEN(elt->uid != id + i)) if (CANT_HAPPEN(elt->uid != id + i))
elt->uid = id + i; elt->uid = id + i;
elt->timestamp = now; if (now != (time_t)-1)
elt->timestamp = now;
} }
} }

View file

@ -131,7 +131,7 @@ main(int argc, char *argv[])
for (i = 0; i < EF_MAX; i++) { for (i = 0; i < EF_MAX; i++) {
if (!EF_IS_GAME_STATE(i)) if (!EF_IS_GAME_STATE(i))
continue; continue;
if (!ef_open(i, EFF_CREATE, -1)) { if (!ef_open(i, EFF_CREATE | EFF_NOTIME, -1)) {
perror("ef_open"); perror("ef_open");
exit(1); exit(1);
} }