changeset 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 7aff18a8d508
children c49f7927b0fa
files arogue5/main.c arogue5/options.c arogue5/save.c
diffstat 3 files changed, 49 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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 */
--- 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);
 
     /*