From: PatR Date: Fri, 25 Dec 2015 00:00:50 +0000 (-0800) Subject: fix "Patch for dos mode nethackrc file on linux" X-Git-Tag: NetHack-3.6.1_RC01~1121 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9df552543bc2491e235047d1c86ccab2566e34ff;p=nethack fix "Patch for dos mode nethackrc file on linux" Reported directly to devteam (12 Dec), user had a config file originally from MSDOS or Windows and used it on a linux system. That works as-is except when it contained an invalid option line. Feedback was "ad option line: "whatever-the-line-was because of the carriage return character staying in the option buffer after linefeed was stripped off from CR+LF line end. He included a patch which replaced this existing fixup after fgets() if ((p = index(buf, '\n')) != 0) *p = '\0'; with a loop over the whole string changing either '\n' or '\r' to '\0'. This uses if ((p = index(buf, '\n')) != 0) { if (p > buf && *(p - 1) == '\r') --p; *p = '\0'; } instead. Ordinarily I would have just cloned the original line and then substituted \r for \n in the copy, but the report mentioned "I couldn't get index to work with carriage return". I don't know what he tried to do or why simple index(buf,'\r') might not work as intended on his platform, so I went with something that will work even if index() behaves as strangely as the report suggested. (We already have a couple of index(string,'\r') calls in use, but I'm not going to change those unless someone complains about a problem.) --- diff --git a/doc/fixes36.1 b/doc/fixes36.1 index a2e3933f8..84c2a161f 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -68,6 +68,9 @@ tty: specifying all four of role, race, gender, and alignment still prompted unix/X11: in top level Makefile, some commented out definitions of VARDATND misspelled pilemark.xbm (as pilemark.xpm) unix/tty: fix compile warning about 'has_colors' for some configurations +unix: options file with CR+LF line ends and an invalid option line resulted in + "ad option line: "whatever-the-line-was + because embedded carriage return character changed cursor's position win32gui: getversionstring() was overflowing the provided Help About buffer win32gui: guard against buffer overflow in in mswin_getlin() MacOSX: initial binary release was built from out of date source code that diff --git a/src/files.c b/src/files.c index 9e4f1d21e..18481a5f4 100644 --- a/src/files.c +++ b/src/files.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 files.c $NHDT-Date: 1449830204 2015/12/11 10:36:44 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.194 $ */ +/* NetHack 3.6 files.c $NHDT-Date: 1451001643 2015/12/25 00:00:43 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.197 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2581,8 +2581,12 @@ line at this level. OR: Forbid multiline stuff for alternate config sources. */ #endif - if ((p = index(buf, '\n')) != 0) - *p = '\0'; + if ((p = index(buf, '\n')) != 0) { + /* in case file has CR+LF format on non-CR+LF platform */ + if (p > buf && *(p - 1) == '\r') + --p; + *p = '\0'; /* strip newline */ + } if (!parse_config_line(fp, buf, src)) { static const char badoptionline[] = "Bad option line: \"%s\"";