aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-09-12 23:40:22 +0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-09-12 15:13:09 -0700
commit5dbf10a6d679e38b3e0a407bb6659f9bb4b8a6ce (patch)
tree591de9b46e27160910d2eb793e32937f91cd1311
parent1ae4b80027a97e8fbe553b980dc17ea540000d88 (diff)
downloadsubsurface-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.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/gtk-gui.c b/gtk-gui.c
index cd7ebe5cc..bfb40a7bc 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -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, &current_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 {