diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2012-09-12 23:40:22 +0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-09-12 15:13:09 -0700 |
commit | 5dbf10a6d679e38b3e0a407bb6659f9bb4b8a6ce (patch) | |
tree | 591de9b46e27160910d2eb793e32937f91cd1311 | |
parent | 1ae4b80027a97e8fbe553b980dc17ea540000d88 (diff) | |
download | subsurface-5dbf10a6d679e38b3e0a407bb6659f9bb4b8a6ce.tar.gz |
various small fixes to the defaultfile model
1) For safety reasons we no longer remove the default directory after
creating it. This prevents an access error (on windows) and also a couple
of small exploits that could have been possible, resulting in undefined
behaviour.
2) Once "default_filename" is allocated keep it until the value has to change.
The value is finaly released once the program is ready to close.
3) When picking a new default file, grab the new string directly from the
GSList.
4) When storing the new default file from the preferences dialog, make sure
we also update "existing_filename" if needed.
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Fixed some whitespace issues, made commit message and one of the comments
in the code somewhat clearer.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | gtk-gui.c | 35 |
1 files changed, 17 insertions, 18 deletions
@@ -258,7 +258,6 @@ static void file_save(GtkWidget *w, gpointer data) g_mkdir(current_def_dir, S_IRWXU); } } - free((void *)current_default); save_dives(existing_filename); mark_divelist_changed(FALSE); } @@ -492,11 +491,10 @@ static void event_toggle(GtkWidget *w, gpointer _data) static void pick_default_file(GtkWidget *w, GtkButton *button) { GtkWidget *fs_dialog; - const char *current_default, *new_default = NULL; + const char *current_default; char *current_def_file, *current_def_dir; GtkFileFilter *filter; struct stat sb; - gboolean need_rmdir = FALSE; fs_dialog = gtk_file_chooser_dialog_new("Choose Default XML File", GTK_WINDOW(main_window), @@ -506,14 +504,12 @@ static void pick_default_file(GtkWidget *w, GtkButton *button) NULL); current_default = subsurface_default_filename(); current_def_dir = path_and_file(current_default, ¤t_def_file); - free((void *)current_default); + /* it's possible that the directory doesn't exist (especially for the default) - * For gtk's file select box to make sense we create it if needed and then remove - * it after the dialog has run */ - if (stat(current_def_dir, &sb) != 0) { - if (g_mkdir(current_def_dir, S_IRWXU) == 0) - need_rmdir = TRUE; - } + * For gtk's file select box to make sense we create it */ + if (stat(current_def_dir, &sb) != 0) + g_mkdir(current_def_dir, S_IRWXU); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fs_dialog), current_def_dir); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(fs_dialog), current_def_file); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(fs_dialog), FALSE); @@ -530,15 +526,11 @@ static void pick_default_file(GtkWidget *w, GtkButton *button) GSList *list; list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(fs_dialog)); - if (g_slist_length(list) == 1) { - new_default = strdup(list->data); - } + if (g_slist_length(list) == 1) + gtk_button_set_label(button, list->data); g_slist_free(list); - if (new_default) - gtk_button_set_label(button, new_default); } - if (need_rmdir) - rmdir(current_def_dir); + free(current_def_dir); free(current_def_file); gtk_widget_destroy(fs_dialog); @@ -687,6 +679,12 @@ static void preferences_dialog(GtkWidget *w, gpointer data) subsurface_set_conf("divelist_font", PREF_STRING, divelist_font); subsurface_set_conf("autogroup", PREF_BOOL, BOOL_TO_PTR(autogroup)); new_default = strdup(gtk_button_get_label(GTK_BUTTON(button))); + + /* if we opened the default file and are changing its name, + * update existing_filename */ + if (strcmp(current_default, existing_filename) == 0) + existing_filename = (char *)new_default; + if (strcmp(current_default, new_default)) { subsurface_set_conf("default_filename", PREF_STRING, new_default); free((void *)default_filename); @@ -697,7 +695,6 @@ static void preferences_dialog(GtkWidget *w, gpointer data) subsurface_flush_conf(); } gtk_widget_destroy(dialog); - free((void *)current_default); } static void create_toggle(const char* label, int *on, void *_data) @@ -1092,6 +1089,8 @@ void run_ui(void) void exit_ui(void) { subsurface_close_conf(); + if (default_filename) + free((char *)default_filename); } typedef struct { |