From: Ken Brown Date: Mon, 27 Nov 2017 18:14:15 +0000 (-0500) Subject: Fix the reading and writing of the "extrakeys" user setting X-Git-Tag: release_2.883~14 X-Git-Url: https://cygwin.com/git/?a=commitdiff_plain;h=e8c42399c8c0d2c2b25ddcb975635422968b1119;p=cygwin-apps%2Fsetup.git Fix the reading and writing of the "extrakeys" user setting ExtraKeysSetting::keybuffer is terminated by LF rather than NUL. So we have to replace NUL by LF after calling UserSettings::get("extrakeys") in the ExtraKeysSetting constructor. Otherwise the last saved key is discarded. Also, bufsize has to be set appropriately before the call to count_keys(), or else all saved keys are discarded. Similarly, the final LF in keybuffer has to be replaced by NUL in the ExtraKeysSetting destructor before the call to UserSettings::set("extrakeys", keybuffer). Otherwise we get garbage at the end of the "extrakeys" setting in setup.rc. --- diff --git a/KeysSetting.cc b/KeysSetting.cc index a21c3c4f..ec8e4f90 100644 --- a/KeysSetting.cc +++ b/KeysSetting.cc @@ -36,7 +36,10 @@ ExtraKeysSetting::ExtraKeysSetting (): const char *p = UserSettings::instance().get ("extrakeys"); if (p) { + bufsize = strlen (p) + 1; // Include final NUL. keybuffer = strdup (p); + // Replace final NUL by LF. + keybuffer[bufsize - 1] = 0x0a; // Calling count_keys gets the count but also sizes the buffer // correctly, discarding any trailing non-LF-terminated data. bufsize = count_keys (); @@ -46,7 +49,11 @@ ExtraKeysSetting::ExtraKeysSetting (): ExtraKeysSetting::~ExtraKeysSetting () { if (keybuffer) - UserSettings::instance().set ("extrakeys", keybuffer); + { + // Replace final LF by NUL. + keybuffer[bufsize - 1] = '\0'; + UserSettings::instance().set ("extrakeys", keybuffer); + } } void