Mercurial > hg > early-roguelike
comparison arogue5/options.c @ 66:c56f672244f4
arogue5: close security holes.
Prevent whoami (player name), file_name, and score_file from being
changed if the systemwide save location is being used.
| author | elwin |
|---|---|
| date | Sat, 11 Aug 2012 16:27:20 +0000 |
| parents | 0ed67132cf10 |
| children | c49f7927b0fa |
comparison
equal
deleted
inserted
replaced
| 65:7aff18a8d508 | 66:c56f672244f4 |
|---|---|
| 36 | 36 |
| 37 int put_bool(), | 37 int put_bool(), |
| 38 get_bool(), | 38 get_bool(), |
| 39 put_str(), | 39 put_str(), |
| 40 get_str(), | 40 get_str(), |
| 41 get_restr(), | |
| 41 put_abil(), | 42 put_abil(), |
| 42 get_abil(), | 43 get_abil(), |
| 43 get_quest(), | 44 get_quest(), |
| 44 put_quest(); | 45 put_quest(); |
| 45 | 46 |
| 55 {"askme", "Ask me about unidentified things: ", | 56 {"askme", "Ask me about unidentified things: ", |
| 56 (int *) &askme, put_bool, get_bool }, | 57 (int *) &askme, put_bool, get_bool }, |
| 57 {"pickup", "Pick things up automatically: ", | 58 {"pickup", "Pick things up automatically: ", |
| 58 (int *) &auto_pickup, put_bool, get_bool }, | 59 (int *) &auto_pickup, put_bool, get_bool }, |
| 59 {"name", "Name: ", | 60 {"name", "Name: ", |
| 60 (int *) whoami, put_str, get_str }, | 61 (int *) whoami, put_str, get_restr }, |
| 61 {"fruit", "Fruit: ", | 62 {"fruit", "Fruit: ", |
| 62 (int *) fruit, put_str, get_str }, | 63 (int *) fruit, put_str, get_str }, |
| 63 {"file", "Save file: ", | 64 {"file", "Save file: ", |
| 64 (int *) file_name, put_str, get_str }, | 65 (int *) file_name, put_str, get_restr }, |
| 65 {"score", "Score file: ", | 66 {"score", "Score file: ", |
| 66 (int *) score_file, put_str, get_str }, | 67 (int *) score_file, put_str, get_restr }, |
| 67 {"class", "Character class: ", | 68 {"class", "Character class: ", |
| 68 (int *)&char_type, put_abil, get_abil }, | 69 (int *)&char_type, put_abil, get_abil }, |
| 69 {"quest", "Quest item: ", | 70 {"quest", "Quest item: ", |
| 70 (int *) &quest_item, put_quest, get_quest } | 71 (int *) &quest_item, put_quest, get_quest } |
| 71 }; | 72 }; |
| 72 | 73 |
| 74 /* For fields that would be restricted if use_savedir is set. */ | |
| 75 int get_restr(char *optstr, WINDOW *win) | |
| 76 { | |
| 77 int oy, ox; | |
| 78 | |
| 79 if (use_savedir) | |
| 80 { | |
| 81 getyx(win, oy, ox); | |
| 82 put_str(optstr, win); | |
| 83 return get_ro(win, oy, ox); | |
| 84 } | |
| 85 else | |
| 86 return get_str(optstr, win); | |
| 87 } | |
| 88 | |
| 73 /* | 89 /* |
| 74 * The ability field is read-only | 90 * The ability field is read-only |
| 75 */ | 91 */ |
| 76 get_abil(abil, win) | 92 get_abil(abil, win) |
| 77 int *abil; | 93 int *abil; |
| 341 len = (int)(sp - str); | 357 len = (int)(sp - str); |
| 342 /* | 358 /* |
| 343 * Look it up and deal with it | 359 * Look it up and deal with it |
| 344 */ | 360 */ |
| 345 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++) | 361 for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++) |
| 362 /* None of these can be changed if using system savefiles. */ | |
| 363 if (use_savedir && (!strcmp(op->o_name, "name") || | |
| 364 !strcmp(op->o_name, "file") || | |
| 365 !strcmp(op->o_name, "score") )) | |
| 366 continue; | |
| 346 if (EQSTR(str, op->o_name, len)) | 367 if (EQSTR(str, op->o_name, len)) |
| 347 { | 368 { |
| 348 if (op->o_putfunc == put_bool) /* if option is a boolean */ | 369 if (op->o_putfunc == put_bool) /* if option is a boolean */ |
| 349 *(bool *)op->o_opt = TRUE; | 370 *(bool *)op->o_opt = TRUE; |
| 350 else /* string option */ | 371 else /* string option */ |
