# HG changeset patch # User elwin # Date 1344702440 0 # Node ID c56f672244f470c02f642b47988022e361799f1d # Parent 7aff18a8d508d9f8bb76de125b19ade373e209ec arogue5: close security holes. Prevent whoami (player name), file_name, and score_file from being changed if the systemwide save location is being used. diff -r 7aff18a8d508 -r c56f672244f4 arogue5/main.c --- a/arogue5/main.c Fri Aug 10 21:17:14 2012 +0000 +++ b/arogue5/main.c Sat Aug 11 16:27:20 2012 +0000 @@ -92,7 +92,7 @@ if ((env = getenv("ROGUEOPTS")) != NULL) parse_opts(env); - if (whoami[0] == '\0') + if (!use_savedir && whoami[0] == '\0') strucpy(whoami, md_getusername(), strlen(md_getusername())); if (env == NULL || fruit[0] == '\0') { @@ -194,17 +194,20 @@ byebye(-1); } - if ((whoami == NULL) || (*whoami == '\0') || (strcmp(whoami,"dosuser")==0)) - { - echo(); - mvaddstr(23,2,"Rogue's Name? "); - wgetnstr(stdscr,whoami,LINELEN); - noecho(); + if (!use_savedir) { + if ((whoami == NULL) || (*whoami == '\0') || + (strcmp(whoami,"dosuser")==0)) + { + echo(); + mvaddstr(23,2,"Rogue's Name? "); + wgetnstr(stdscr,whoami,LINELEN); + noecho(); + } + + if ((whoami == NULL) || (*whoami == '\0')) + strcpy(whoami,"Rodney"); } - if ((whoami == NULL) || (*whoami == '\0')) - strcpy(whoami,"Rodney"); - setup(); /* * Set up windows diff -r 7aff18a8d508 -r c56f672244f4 arogue5/options.c --- a/arogue5/options.c Fri Aug 10 21:17:14 2012 +0000 +++ b/arogue5/options.c Sat Aug 11 16:27:20 2012 +0000 @@ -38,6 +38,7 @@ get_bool(), put_str(), get_str(), + get_restr(), put_abil(), get_abil(), get_quest(), @@ -57,19 +58,34 @@ {"pickup", "Pick things up automatically: ", (int *) &auto_pickup, put_bool, get_bool }, {"name", "Name: ", - (int *) whoami, put_str, get_str }, + (int *) whoami, put_str, get_restr }, {"fruit", "Fruit: ", (int *) fruit, put_str, get_str }, {"file", "Save file: ", - (int *) file_name, put_str, get_str }, + (int *) file_name, put_str, get_restr }, {"score", "Score file: ", - (int *) score_file, put_str, get_str }, + (int *) score_file, put_str, get_restr }, {"class", "Character class: ", (int *)&char_type, put_abil, get_abil }, {"quest", "Quest item: ", (int *) &quest_item, put_quest, get_quest } }; +/* For fields that would be restricted if use_savedir is set. */ +int get_restr(char *optstr, WINDOW *win) +{ + int oy, ox; + + if (use_savedir) + { + getyx(win, oy, ox); + put_str(optstr, win); + return get_ro(win, oy, ox); + } + else + return get_str(optstr, win); +} + /* * The ability field is read-only */ @@ -343,6 +359,11 @@ * Look it up and deal with it */ for (op = optlist; op <= &optlist[NUM_OPTS-1]; op++) + /* None of these can be changed if using system savefiles. */ + if (use_savedir && (!strcmp(op->o_name, "name") || + !strcmp(op->o_name, "file") || + !strcmp(op->o_name, "score") )) + continue; if (EQSTR(str, op->o_name, len)) { if (op->o_putfunc == put_bool) /* if option is a boolean */ diff -r 7aff18a8d508 -r c56f672244f4 arogue5/save.c --- a/arogue5/save.c Fri Aug 10 21:17:14 2012 +0000 +++ b/arogue5/save.c Sat Aug 11 16:27:20 2012 +0000 @@ -41,7 +41,10 @@ mpos = 0; if (file_name[0] != '\0') { - msg("Save file (%s)? ", file_name); + if (use_savedir) + msg("Save game? "); + else + msg("Save file (%s)? ", file_name); do { c = readchar(); @@ -53,6 +56,10 @@ msg("File name: %s", file_name); goto gotfile; } + if (use_savedir) { + msg(""); + return FALSE; + } } do @@ -69,7 +76,11 @@ strcpy(file_name, buf); gotfile: if ((savef = fopen(file_name, "w")) == NULL) + { msg(strerror(errno)); /* fake perror() */ + if (use_savedir) + return FALSE; + } } while (savef == NULL); /*