1
- /* $NetBSD: save.c,v 1.12 2012/01/07 22:23:16 dholland Exp $ */
1
+ /* $NetBSD: save.c,v 1.13 2012/01/08 18:16:00 dholland Exp $ */
2
2
3
3
/*-
4
4
* Copyright (c) 1991, 1993
39
39
#if 0
40
40
static char sccsid [] = "@(#)save.c 8.1 (Berkeley) 5/31/93" ;
41
41
#else
42
- __RCSID ("$NetBSD: save.c,v 1.12 2012/01/07 22:23:16 dholland Exp $" );
42
+ __RCSID ("$NetBSD: save.c,v 1.13 2012/01/08 18:16:00 dholland Exp $" );
43
43
#endif
44
44
#endif /* not lint */
45
45
@@ -60,13 +60,14 @@ struct savefile {
60
60
bool warned ;
61
61
unsigned bintextpos ;
62
62
uint32_t key ;
63
- uint32_t sum ;
63
+ struct crcstate crc ;
64
64
unsigned char pad [8 ];
65
65
unsigned padpos ;
66
66
};
67
67
68
68
#define BINTEXT_WIDTH 60
69
- #define FORMAT_VERSION 1
69
+ #define FORMAT_VERSION 2
70
+ #define FORMAT_VERSION_NOSUM 1
70
71
static const char header [] = "Adventure save file\n" ;
71
72
72
73
////////////////////////////////////////////////////////////
@@ -133,7 +134,7 @@ savefile_open(const char *name, bool forwrite)
133
134
sf -> warned = false;
134
135
sf -> bintextpos = 0 ;
135
136
sf -> key = 0 ;
136
- sf -> sum = 0 ;
137
+ crc_start ( & sf -> crc ) ;
137
138
memset (sf -> pad , 0 , sizeof (sf -> pad ));
138
139
sf -> padpos = 0 ;
139
140
return sf ;
@@ -362,7 +363,7 @@ static void
362
363
savefile_key (struct savefile * sf , uint32_t key )
363
364
{
364
365
sf -> key = 0 ;
365
- sf -> sum = 0 ;
366
+ crc_start ( & sf -> crc ) ;
366
367
hash (& sf -> key , sizeof (sf -> key ), sf -> pad , sizeof (sf -> pad ));
367
368
sf -> padpos = 0 ;
368
369
}
@@ -412,6 +413,7 @@ savefile_cread(struct savefile *sf, void *data, size_t len)
412
413
}
413
414
pos += amt ;
414
415
}
416
+ crc_add (& sf -> crc , data , len );
415
417
return 0 ;
416
418
}
417
419
@@ -443,6 +445,7 @@ savefile_cwrite(struct savefile *sf, const void *data, size_t len)
443
445
}
444
446
pos += amt ;
445
447
}
448
+ crc_add (& sf -> crc , data , len );
446
449
return 0 ;
447
450
}
448
451
@@ -528,6 +531,7 @@ compat_restore(const char *infile)
528
531
char * s ;
529
532
long sum , cksum = 0 ;
530
533
int i ;
534
+ struct crcstate crc ;
531
535
532
536
if ((in = fopen (infile , "rb" )) == NULL ) {
533
537
fprintf (stderr ,
@@ -544,9 +548,10 @@ compat_restore(const char *infile)
544
548
}
545
549
fclose (in );
546
550
547
- crc_start (); /* See if she cheated */
551
+ crc_start (& crc ); /* See if she cheated */
548
552
for (p = compat_savearray ; p -> address != NULL ; p ++ )
549
- cksum = crc (p -> address , p -> width );
553
+ crc_add (& crc , p -> address , p -> width );
554
+ cksum = crc_get (& crc );
550
555
if (sum != cksum ) /* Tsk tsk */
551
556
return 2 ; /* Altered the file */
552
557
/* We successfully restored, so this really was a save file */
@@ -661,7 +666,7 @@ save(const char *outfile)
661
666
uint32_t key , writeable_key ;
662
667
uint32_t version ;
663
668
unsigned i , j , n ;
664
- uint32_t val ;
669
+ uint32_t val , sum ;
665
670
666
671
sf = savefile_open (outfile , true);
667
672
if (sf == NULL ) {
@@ -732,8 +737,8 @@ save(const char *outfile)
732
737
}
733
738
#endif
734
739
735
- sf -> sum = htonl (sf -> sum );
736
- if (savefile_binwrite (sf , & sf -> sum , sizeof (& sf -> sum ))) {
740
+ sum = htonl (crc_get ( & sf -> crc ) );
741
+ if (savefile_binwrite (sf , & sum , sizeof (& sum ))) {
737
742
savefile_close (sf );
738
743
return 1 ;
739
744
}
@@ -753,6 +758,7 @@ restore(const char *infile)
753
758
uint32_t version , key , sum ;
754
759
unsigned i , j , n ;
755
760
uint32_t val ;
761
+ bool skipsum = false;
756
762
757
763
sf = savefile_open (infile , false);
758
764
if (sf == NULL ) {
@@ -777,7 +783,13 @@ restore(const char *infile)
777
783
return 1 ;
778
784
}
779
785
version = ntohl (version );
780
- if (version != FORMAT_VERSION ) {
786
+ switch (version ) {
787
+ case FORMAT_VERSION :
788
+ break ;
789
+ case FORMAT_VERSION_NOSUM :
790
+ skipsum = true;
791
+ break ;
792
+ default :
781
793
savefile_close (sf );
782
794
fprintf (stderr ,
783
795
"Oh dear, that file must be from the future. I don't know"
@@ -840,7 +852,7 @@ restore(const char *infile)
840
852
}
841
853
sum = ntohl (sum );
842
854
/* See if she cheated */
843
- if (sum != sf -> sum ) {
855
+ if (! skipsum && sum != crc_get ( & sf -> crc ) ) {
844
856
/* Tsk tsk, altered the file */
845
857
savefile_close (sf );
846
858
return 2 ;
0 commit comments