From f1f23e70062c7a0eb350592426ac3fbdd4a4b8c3 Mon Sep 17 00:00:00 2001 From: Erki Date: Wed, 29 Apr 2020 11:27:00 +0300 Subject: [PATCH] fixes preferences not accepting flags > 1 << 16 (#8754) So while I was doing completely different things, I remembered discussing, with Geeves, that our preferences toggles only save 16 bit flags. Despite BYOND now supporting 24 of them. Lo and behold, sanitization is at fault. So I fixed it. Added a define BITFIELDMAX to indicate the max length of a BYOND bitfield. Replaced all relevant uses of 65535 with it. (Need to do a sweep for 0xffff as well, actually.) --- code/_helpers/lists.dm | 8 +++++--- code/datums/wires/wires.dm | 2 ++ .../modules/client/preference_setup/global/02_settings.dm | 6 +++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index 94edcc52092..ed758b8b56b 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -258,6 +258,8 @@ #define BITSET(bitfield,index) (bitfield) |= (1 << (index)) #define BITRESET(bitfield,index) (bitfield) &= ~(1 << (index)) #define BITFLIP(bitfield,index) (bitfield) ^= (1 << (index)) +#define BITFIELDMAX 0xFFFFFF +#define BITFIELDMAX_16 0xFFFF //Converts a bitfield to a list of numbers (or words if a wordlist is provided) /proc/bitfield2list(bitfield = 0, list/wordlist) @@ -270,7 +272,7 @@ r += wordlist[i] bit = bit << 1 else - for(var/bit=1, bit<=65535, bit = bit << 1) + for(var/bit=1, bit<=BITFIELDMAX, bit = bit << 1) if(bitfield & bit) r += bit @@ -704,9 +706,9 @@ group_list[key] = values values += value - + // Return a list of the values in an assoc list (including null) /proc/list_values(var/list/L) . = list() for(var/e in L) - . += L[e] \ No newline at end of file + . += L[e] diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index b43b44b532a..f02fa60180e 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -311,3 +311,5 @@ var/const/POWER = 8 /datum/wires/proc/Shuffle() wires_status = 0 GenerateWires() + +#undef MAX_FLAG diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index f6b67e53e3e..2bcd4f6486c 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -77,12 +77,12 @@ pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) pref.default_slot = sanitize_integer(text2num(pref.default_slot), 1, config.character_slots, initial(pref.default_slot)) - pref.toggles = sanitize_integer(text2num(pref.toggles), 0, 65535, initial(pref.toggles)) - pref.asfx_togs = sanitize_integer(text2num(pref.asfx_togs), 0, 65535, initial(pref.toggles)) + pref.toggles = sanitize_integer(text2num(pref.toggles), 0, BITFIELDMAX, initial(pref.toggles)) + pref.asfx_togs = sanitize_integer(text2num(pref.asfx_togs), 0, BITFIELDMAX, initial(pref.toggles)) pref.motd_hash = sanitize_text(pref.motd_hash, initial(pref.motd_hash)) pref.memo_hash = sanitize_text(pref.memo_hash, initial(pref.memo_hash)) pref.parallax_speed = sanitize_integer(text2num(pref.parallax_speed), 1, 10, initial(pref.parallax_speed)) - pref.toggles_secondary = sanitize_integer(text2num(pref.toggles_secondary), 0, 65535, initial(pref.toggles_secondary)) + pref.toggles_secondary = sanitize_integer(text2num(pref.toggles_secondary), 0, BITFIELDMAX, initial(pref.toggles_secondary)) /datum/category_item/player_setup_item/player_global/settings/content(mob/user) var/list/dat = list(