From: PatR Date: Tue, 2 Aug 2022 22:07:20 +0000 (-0700) Subject: fix github issue #832 - "nethack --nethackrc=file" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7a467701f53cbeb39a5ca020ed5b4a4b6919923;p=nethack fix github issue #832 - "nethack --nethackrc=file" Issue reported by schauveau: when the command line specifies the '--nethackrc=file' option (Unix, including linux and OSX, only) the value of 'file' was set in pointer g.cmdline_rcfile and the options parsing made a copy of that pointer rather than of what it pointed to, then freed g.cmdline_rcfile before using the copy. So it ended up using a pointer to freed memory. Stick with copying the pointer but defer freeing the original until after its copy is no longer needed. Fixes #832 --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index c9e8c7ca4..b25261f1b 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1331,6 +1331,9 @@ when one monster swallowed/engulfed another and killed it, impossible "placing over itself ..." could be given by place_monster() if the game crashed or the process was killed, recovering a save file ended up with incorrect stairway connections between levels +when using --nethackrc=file on the command line (currently only implemented + for ports that use unixmain.c), options parsing freed the string + containing 'file' before using it as the RC file name curses: 'msg_window' option wasn't functional for curses unless the binary also included tty support diff --git a/src/options.c b/src/options.c index a5c038784..075def9ea 100644 --- a/src/options.c +++ b/src/options.c @@ -6233,7 +6233,6 @@ initoptions_finish(void) if (g.cmdline_rcfile) { namesrc = "command line"; nameval = g.cmdline_rcfile; - free((genericptr_t) g.cmdline_rcfile), g.cmdline_rcfile = 0; xtraopts = opts; if (opts && (*opts == '/' || *opts == '\\' || *opts == '@')) xtraopts = 0; /* NETHACKOPTIONS is a file name; ignore it */ @@ -6274,6 +6273,9 @@ initoptions_finish(void) (void) parseoptions(xtraopts, TRUE, FALSE); config_error_done(); } + + if (g.cmdline_rcfile) + free((genericptr_t) g.cmdline_rcfile), g.cmdline_rcfile = 0; /*[end of nethackrc handling]*/ (void) fruitadd(g.pl_fruit, (struct fruit *) 0);