From: Christian Heller Date: Mon, 25 Nov 2013 01:40:22 +0000 (+0100) Subject: Ensure not more WinConfs are read or saved than world.winconf_ids can stomach. X-Git-Tag: tce~913 X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/%7B%7Bprefix%7D%7D/process?a=commitdiff_plain;h=ab6bfe8653ea22262bd277874fd1e0073e17b647;p=plomrogue Ensure not more WinConfs are read or saved than world.winconf_ids can stomach. --- diff --git a/config/windows/toggle_order_and_active b/config/windows/toggle_order_and_active index 2ae7c2c..f188d83 100644 --- a/config/windows/toggle_order_and_active +++ b/config/windows/toggle_order_and_active @@ -1,2 +1,2 @@ kmicl -m +m \ No newline at end of file diff --git a/src/wincontrol.c b/src/wincontrol.c index ee547eb..6ce1f32 100644 --- a/src/wincontrol.c +++ b/src/wincontrol.c @@ -324,14 +324,15 @@ extern void init_winconfs() char * f_name = "init_winconfs()"; /* Fill world.winconf_ids with config/windows/Win_* filenames' end chars. */ + uint8_t max_wins = 255; /* Maximum number of window ids to store. */ DIR * dp = opendir("config/windows"); exit_trouble(NULL == dp, f_name, "opendir()"); struct dirent * fn; errno = 0; - char * winconf_ids = try_malloc(256, f_name); + char * winconf_ids = try_malloc(max_wins + 1, f_name); uint8_t i = 0; char id; - while (NULL != (fn = readdir(dp))) + while (NULL != (fn = readdir(dp)) && i < max_wins) { if (5 == strlen(fn->d_name) && fn->d_name == strstr(fn->d_name, "Win_")) { @@ -420,20 +421,22 @@ extern void save_win_configs() { char * f_name = "save_win_configs()"; + /* Save individual world.winconfs to their proper files. */ + uint8_t max_wins = 255; /* So many winconf ids fit into world.winconf_ids.*/ char id; while (0 != (id = get_next_winconf_id())) { save_win_config(id); } + /* Save order of windows to toggle on start / which to select as active. */ char * path = "config/windows/toggle_order_and_active"; char * path_tmp = "config/windows/toggle_order_and_active_tmp"; FILE * file = try_fopen(path_tmp, "w", f_name); - - char line[6]; + char line[max_wins + 2]; struct Win * w_p = world.wmeta->chain_start; uint8_t i = 0; - while (0 != w_p) + while (0 != w_p && i < max_wins) { struct WinConf * wc = get_winconf_by_win(w_p); line[i] = wc->id; @@ -441,13 +444,13 @@ extern void save_win_configs() i++; } line[i] = '\n'; + line[i + 1] = '\0'; try_fwrite(line, sizeof(char), strlen(line), file, f_name); if (0 != world.wmeta->active) { struct WinConf * wc = get_winconf_by_win(world.wmeta->active); write_uint8(wc->id, file); } - try_fclose_unlink_rename(file, path_tmp, path, f_name); }