Mercurial > hg > early-roguelike
comparison xrogue/state.c @ 166:9b5f1e6aa35a
arogue7, xrogue: fix uninitialized variables when restoring.
The save and restore code assumed sizeof(long) == 4, which is not the
case on x64. Reading only 4 bytes from the savefile left the others
uninitialized, which led to problems like billions of experience points
or gold pieces.
author | John "Elwin" Edwards |
---|---|
date | Fri, 26 Jun 2015 11:42:02 -0400 |
parents | 1af259ac4ed2 |
children | 6e6fb0955095 |
comparison
equal
deleted
inserted
replaced
165:2d94c32a709e | 166:9b5f1e6aa35a |
---|---|
199 return(WRITESTAT); | 199 return(WRITESTAT); |
200 } | 200 } |
201 | 201 |
202 rs_write_ulong(FILE *savef, unsigned long c) | 202 rs_write_ulong(FILE *savef, unsigned long c) |
203 { | 203 { |
204 unsigned int c2; | |
204 char bytes[4]; | 205 char bytes[4]; |
205 char *buf = (char *)&c; | 206 char *buf = (char *)&c; |
206 | 207 |
208 if ( (sizeof(long) == 8) && (sizeof(int) == 4) ) | |
209 { | |
210 c2 = c; | |
211 buf = (char *) &c2; | |
212 } | |
213 | |
207 if (big_endian) | 214 if (big_endian) |
208 { | 215 { |
209 bytes[3] = buf[0]; | 216 bytes[3] = buf[0]; |
210 bytes[2] = buf[1]; | 217 bytes[2] = buf[1]; |
211 bytes[1] = buf[2]; | 218 bytes[1] = buf[2]; |
218 return(WRITESTAT); | 225 return(WRITESTAT); |
219 } | 226 } |
220 | 227 |
221 rs_write_long(FILE *savef, long c) | 228 rs_write_long(FILE *savef, long c) |
222 { | 229 { |
230 int c2; | |
223 char bytes[4]; | 231 char bytes[4]; |
224 char *buf = (char *)&c; | 232 char *buf = (char *)&c; |
225 | 233 |
234 if ( (sizeof(long) == 8) && (sizeof(int) == 4) ) | |
235 { | |
236 c2 = c; | |
237 buf = (char *) &c2; | |
238 } | |
239 | |
226 if (big_endian) | 240 if (big_endian) |
227 { | 241 { |
228 bytes[3] = buf[0]; | 242 bytes[3] = buf[0]; |
229 bytes[2] = buf[1]; | 243 bytes[2] = buf[1]; |
230 bytes[1] = buf[2]; | 244 bytes[1] = buf[2]; |
310 bytes[1] = buf[2]; | 324 bytes[1] = buf[2]; |
311 bytes[0] = buf[3]; | 325 bytes[0] = buf[3]; |
312 buf = bytes; | 326 buf = bytes; |
313 } | 327 } |
314 | 328 |
315 *i = *((unsigned long *) buf); | 329 if ( (sizeof(long) == 8) && (sizeof(int) == 4) ) |
330 *i = *((unsigned int *) buf); | |
331 else | |
332 *i = *((unsigned long *) buf); | |
316 return(READSTAT); | 333 return(READSTAT); |
317 } | 334 } |
318 | 335 |
319 rs_read_long(int inf, long *i) | 336 rs_read_long(int inf, long *i) |
320 { | 337 { |
331 bytes[1] = buf[2]; | 348 bytes[1] = buf[2]; |
332 bytes[0] = buf[3]; | 349 bytes[0] = buf[3]; |
333 buf = bytes; | 350 buf = bytes; |
334 } | 351 } |
335 | 352 |
336 *i = *((long *) buf); | 353 if ( (sizeof(long) == 8) && (sizeof(int) == 4) ) |
354 *i = *((int *) buf); | |
355 else | |
356 *i = *((long *) buf); | |
337 return(READSTAT); | 357 return(READSTAT); |
338 } | 358 } |
339 | 359 |
340 rs_read_boolean(int inf, bool *i) | 360 rs_read_boolean(int inf, bool *i) |
341 { | 361 { |