Skip to content

Commit

Permalink
Add defensive checks for function receiving a GeanyDocument argument
Browse files Browse the repository at this point in the history
Always check the passed-in GeanyDocument argument is a valid one, not
to possibly work on an invalid document.
  • Loading branch information
b4n committed Jan 22, 2014
1 parent c4549b1 commit 7473e4b
Show file tree
Hide file tree
Showing 13 changed files with 58 additions and 18 deletions.
12 changes: 11 additions & 1 deletion src/build.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -338,6 +338,8 @@ static GeanyBuildCommand *get_next_build_cmd(GeanyDocument *doc, guint cmdgrp, g
GeanyFiletype *ft = NULL; GeanyFiletype *ft = NULL;
guint sink, *fr = &sink; guint sink, *fr = &sink;


g_return_val_if_fail(doc == NULL || doc->is_valid, NULL);

if (printbuildcmds) if (printbuildcmds)
printfcmds(); printfcmds();
if (cmdgrp >= GEANY_GBG_COUNT) if (cmdgrp >= GEANY_GBG_COUNT)
Expand Down Expand Up @@ -716,6 +718,8 @@ static gchar *build_replace_placeholder(const GeanyDocument *doc, const gchar *s
gchar *executable = NULL; gchar *executable = NULL;
gchar *ret_str; /* to be freed when not in use anymore */ gchar *ret_str; /* to be freed when not in use anymore */


g_return_val_if_fail(doc == NULL || doc->is_valid, NULL);

stack = g_string_new(src); stack = g_string_new(src);
if (doc != NULL && doc->file_name != NULL) if (doc != NULL && doc->file_name != NULL)
{ {
Expand Down Expand Up @@ -780,6 +784,8 @@ static GPid build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *d
gint stderr_fd; gint stderr_fd;
#endif #endif


g_return_val_if_fail(doc == NULL || doc->is_valid, (GPid) -1);

if (!((doc != NULL && !EMPTY(doc->file_name)) || !EMPTY(dir))) if (!((doc != NULL && !EMPTY(doc->file_name)) || !EMPTY(dir)))
{ {
geany_debug("Failed to run command with no working directory"); geany_debug("Failed to run command with no working directory");
Expand Down Expand Up @@ -942,7 +948,7 @@ static GPid build_run_cmd(GeanyDocument *doc, guint cmdindex)
gchar *vte_cmd_nonscript = NULL; gchar *vte_cmd_nonscript = NULL;
GError *error = NULL; GError *error = NULL;


if (doc == NULL || doc->file_name == NULL) if (! DOC_VALID(doc) || doc->file_name == NULL)
return (GPid) 0; return (GPid) 0;


working_dir = prepare_run_script(doc, &vte_cmd_nonscript, cmdindex); working_dir = prepare_run_script(doc, &vte_cmd_nonscript, cmdindex);
Expand Down Expand Up @@ -1583,6 +1589,8 @@ void build_menu_update(GeanyDocument *doc)
gboolean can_compile, can_build, can_make, run_sensitivity = FALSE, run_running = FALSE; gboolean can_compile, can_build, can_make, run_sensitivity = FALSE, run_running = FALSE;
GeanyBuildCommand *bc; GeanyBuildCommand *bc;


g_return_if_fail(doc == NULL || doc->is_valid);

if (menu_items.menu == NULL) if (menu_items.menu == NULL)
create_build_menu(&menu_items); create_build_menu(&menu_items);
if (doc == NULL) if (doc == NULL)
Expand Down Expand Up @@ -1977,6 +1985,8 @@ static RowWidgets *build_add_dialog_row(GeanyDocument *doc, GtkTable *table, gui
guint column = 0; guint column = 0;
gchar *text; gchar *text;


g_return_val_if_fail(doc == NULL || doc->is_valid, NULL);

text = g_strdup_printf("%d.", cmd + 1); text = g_strdup_printf("%d.", cmd + 1);
label = gtk_label_new(text); label = gtk_label_new(text);
g_free(text); g_free(text);
Expand Down
4 changes: 3 additions & 1 deletion src/dialogs.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ static gboolean show_save_as_gtk(GeanyDocument *doc)
GtkWidget *dialog; GtkWidget *dialog;
gint resp; gint resp;


g_return_val_if_fail(doc != NULL, FALSE); g_return_val_if_fail(DOC_VALID(doc), FALSE);


dialog = create_save_file_dialog(doc); dialog = create_save_file_dialog(doc);


Expand Down Expand Up @@ -1172,6 +1172,8 @@ void dialogs_show_file_properties(GeanyDocument *doc)
# define S_IXOTH 0 # define S_IXOTH 0
#endif #endif


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL || doc->file_name == NULL) if (doc == NULL || doc->file_name == NULL)
{ {
dialogs_show_msgbox(GTK_MESSAGE_ERROR, dialogs_show_msgbox(GTK_MESSAGE_ERROR,
Expand Down
2 changes: 2 additions & 0 deletions src/document.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1099,6 +1099,8 @@ GeanyDocument *document_open_file_full(GeanyDocument *doc, const gchar *filename
GeanyFiletype *use_ft; GeanyFiletype *use_ft;
FileData filedata; FileData filedata;


g_return_val_if_fail(doc == NULL || doc->is_valid, NULL);

if (reload) if (reload)
{ {
utf8_filename = g_strdup(doc->file_name); utf8_filename = g_strdup(doc->file_name);
Expand Down
2 changes: 2 additions & 0 deletions src/filetypes.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1056,6 +1056,8 @@ GeanyFiletype *filetypes_detect_from_document(GeanyDocument *doc)
gchar *lines[GEANY_FILETYPE_SEARCH_LINES + 1]; gchar *lines[GEANY_FILETYPE_SEARCH_LINES + 1];
gint i; gint i;


g_return_val_if_fail(doc == NULL || doc->is_valid, filetypes[GEANY_FILETYPES_NONE]);

if (doc == NULL) if (doc == NULL)
return filetypes[GEANY_FILETYPES_NONE]; return filetypes[GEANY_FILETYPES_NONE];


Expand Down
8 changes: 4 additions & 4 deletions src/keybindings.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1041,6 +1041,8 @@ static void trigger_button_event(GtkWidget *widget, guint32 event_time)
* notebook tab list. */ * notebook tab list. */
static gboolean check_menu_key(GeanyDocument *doc, guint keyval, guint state, guint32 event_time) static gboolean check_menu_key(GeanyDocument *doc, guint keyval, guint state, guint32 event_time)
{ {
g_return_val_if_fail(doc == NULL || doc->is_valid, FALSE);

if ((keyval == GDK_Menu && state == 0) || (keyval == GDK_F10 && state == GDK_SHIFT_MASK)) if ((keyval == GDK_Menu && state == 0) || (keyval == GDK_F10 && state == GDK_SHIFT_MASK))
{ {
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window)); GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
Expand Down Expand Up @@ -1585,8 +1587,7 @@ static gboolean cb_func_build_action(guint key_id)


static gboolean read_current_word(GeanyDocument *doc, gboolean sci_word) static gboolean read_current_word(GeanyDocument *doc, gboolean sci_word)
{ {
if (doc == NULL) g_return_val_if_fail(DOC_VALID(doc), FALSE);
return FALSE;


if (sci_word) if (sci_word)
{ {
Expand Down Expand Up @@ -1820,8 +1821,7 @@ static void goto_matching_brace(GeanyDocument *doc)
gint pos, new_pos; gint pos, new_pos;
gint after_brace; gint after_brace;


if (doc == NULL) g_return_if_fail(DOC_VALID(doc));
return;


pos = sci_get_current_position(doc->editor->sci); pos = sci_get_current_position(doc->editor->sci);
after_brace = pos > 0 && utils_isbrace(sci_get_char_at(doc->editor->sci, pos - 1), TRUE); after_brace = pos > 0 && utils_isbrace(sci_get_char_at(doc->editor->sci, pos - 1), TRUE);
Expand Down
3 changes: 2 additions & 1 deletion src/navqueue.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ gboolean navqueue_goto_line(GeanyDocument *old_doc, GeanyDocument *new_doc, gint
{ {
gint pos; gint pos;


g_return_val_if_fail(new_doc != NULL, FALSE); g_return_val_if_fail(old_doc == NULL || old_doc->is_valid, FALSE);
g_return_val_if_fail(DOC_VALID(new_doc), FALSE);
g_return_val_if_fail(line >= 1, FALSE); g_return_val_if_fail(line >= 1, FALSE);


pos = sci_get_position_from_line(new_doc->editor->sci, line - 1); pos = sci_get_position_from_line(new_doc->editor->sci, line - 1);
Expand Down
3 changes: 1 addition & 2 deletions src/printing.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -624,8 +624,7 @@ static void print_external(GeanyDocument *doc)


void printing_print_doc(GeanyDocument *doc) void printing_print_doc(GeanyDocument *doc)
{ {
if (doc == NULL) g_return_if_fail(DOC_VALID(doc));
return;


if (printing_prefs.use_gtk_printing) if (printing_prefs.use_gtk_printing)
printing_print_gtk(doc); printing_print_gtk(doc);
Expand Down
6 changes: 3 additions & 3 deletions src/search.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -394,7 +394,7 @@ void search_find_selection(GeanyDocument *doc, gboolean search_backwards)
{ {
gchar *s = NULL; gchar *s = NULL;


g_return_if_fail(doc != NULL); g_return_if_fail(DOC_VALID(doc));


#ifdef G_OS_UNIX #ifdef G_OS_UNIX
if (search_prefs.find_selection_type == GEANY_FIND_SEL_X) if (search_prefs.find_selection_type == GEANY_FIND_SEL_X)
Expand Down Expand Up @@ -1225,7 +1225,7 @@ gint search_mark_all(GeanyDocument *doc, const gchar *search_text, gint flags)
struct Sci_TextToFind ttf; struct Sci_TextToFind ttf;
GSList *match, *matches; GSList *match, *matches;


g_return_val_if_fail(doc != NULL, 0); g_return_val_if_fail(DOC_VALID(doc), 0);


/* clear previous search indicators */ /* clear previous search indicators */
editor_indicator_clear(doc->editor, GEANY_INDICATOR_SEARCH); editor_indicator_clear(doc->editor, GEANY_INDICATOR_SEARCH);
Expand Down Expand Up @@ -2134,7 +2134,7 @@ static gint find_document_usage(GeanyDocument *doc, const gchar *search_text, gi
gint prev_line = -1; gint prev_line = -1;
GSList *match, *matches; GSList *match, *matches;


g_return_val_if_fail(doc != NULL, 0); g_return_val_if_fail(DOC_VALID(doc), 0);


short_file_name = g_path_get_basename(DOC_FILENAME(doc)); short_file_name = g_path_get_basename(DOC_FILENAME(doc));


Expand Down
2 changes: 2 additions & 0 deletions src/sidebar.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ void sidebar_update_tag_list(GeanyDocument *doc, gboolean update)
{ {
GtkWidget *child = gtk_bin_get_child(GTK_BIN(tag_window)); GtkWidget *child = gtk_bin_get_child(GTK_BIN(tag_window));


g_return_if_fail(doc == NULL || doc->is_valid);

/* changes the tree view to the given one, trying not to do useless changes */ /* changes the tree view to the given one, trying not to do useless changes */
#define CHANGE_TREE(new_child) \ #define CHANGE_TREE(new_child) \
G_STMT_START { \ G_STMT_START { \
Expand Down
4 changes: 3 additions & 1 deletion src/symbols.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1715,7 +1715,7 @@ gboolean symbols_recreate_tag_list(GeanyDocument *doc, gint sort_mode)
{ {
GList *tags; GList *tags;


g_return_val_if_fail(doc != NULL, FALSE); g_return_val_if_fail(DOC_VALID(doc), FALSE);


tags = get_tag_list(doc, tm_tag_max_t); tags = get_tag_list(doc, tm_tag_max_t);
if (tags == NULL) if (tags == NULL)
Expand Down Expand Up @@ -2226,6 +2226,8 @@ static gint get_current_tag_name_cached(GeanyDocument *doc, const gchar **tagnam
static gint tag_line = -1; static gint tag_line = -1;
static gchar *cur_tag = NULL; static gchar *cur_tag = NULL;


g_return_val_if_fail(doc == NULL || doc->is_valid, -1);

if (doc == NULL) /* reset current function */ if (doc == NULL) /* reset current function */
{ {
current_tag_changed(NULL, -1, -1, 0); current_tag_changed(NULL, -1, -1, 0);
Expand Down
12 changes: 9 additions & 3 deletions src/templates.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ static void convert_eol_characters(GString *template, GeanyDocument *doc)
{ {
gint doc_eol_mode; gint doc_eol_mode;


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL) if (doc == NULL)
doc = document_get_current(); doc = document_get_current();


Expand Down Expand Up @@ -436,7 +438,7 @@ gchar *templates_get_template_licence(GeanyDocument *doc, gint licence_type)
{ {
GString *template; GString *template;


g_return_val_if_fail(doc != NULL, NULL); g_return_val_if_fail(DOC_VALID(doc), NULL);
g_return_val_if_fail(licence_type == GEANY_TEMPLATE_GPL || licence_type == GEANY_TEMPLATE_BSD, NULL); g_return_val_if_fail(licence_type == GEANY_TEMPLATE_GPL || licence_type == GEANY_TEMPLATE_BSD, NULL);


template = g_string_new(templates[licence_type]); template = g_string_new(templates[licence_type]);
Expand Down Expand Up @@ -502,9 +504,13 @@ gchar *templates_get_template_function(GeanyDocument *doc, const gchar *func_nam


gchar *templates_get_template_changelog(GeanyDocument *doc) gchar *templates_get_template_changelog(GeanyDocument *doc)
{ {
GString *result = g_string_new(templates[GEANY_TEMPLATE_CHANGELOG]); GString *result;
const gchar *file_type_name = (doc != NULL) ? doc->file_type->name : ""; const gchar *file_type_name;

g_return_val_if_fail(DOC_VALID(doc), NULL);


result = g_string_new(templates[GEANY_TEMPLATE_CHANGELOG]);
file_type_name = (doc->file_type != NULL) ? doc->file_type->name : "";
replace_static_values(result); replace_static_values(result);
templates_replace_default_dates(result); templates_replace_default_dates(result);
templates_replace_command(result, DOC_FILENAME(doc), file_type_name, NULL); templates_replace_command(result, DOC_FILENAME(doc), file_type_name, NULL);
Expand Down
4 changes: 2 additions & 2 deletions src/tools.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ void tools_execute_custom_command(GeanyDocument *doc, const gchar *command)
gint stdout_fd; gint stdout_fd;
gint stderr_fd; gint stderr_fd;


g_return_if_fail(doc != NULL && command != NULL); g_return_if_fail(DOC_VALID(doc) && command != NULL);


if (! sci_has_selection(doc->editor->sci)) if (! sci_has_selection(doc->editor->sci))
editor_select_lines(doc->editor, FALSE); editor_select_lines(doc->editor, FALSE);
Expand Down Expand Up @@ -697,7 +697,7 @@ static void cc_on_custom_command_activate(GtkMenuItem *menuitem, gpointer user_d
GeanyDocument *doc = document_get_current(); GeanyDocument *doc = document_get_current();
gint command_idx; gint command_idx;


g_return_if_fail(doc != NULL); g_return_if_fail(DOC_VALID(doc));


command_idx = GPOINTER_TO_INT(user_data); command_idx = GPOINTER_TO_INT(user_data);


Expand Down
14 changes: 14 additions & 0 deletions src/ui_utils.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ static gchar *create_statusbar_statistics(GeanyDocument *doc,
/* updates the status bar document statistics */ /* updates the status bar document statistics */
void ui_update_statusbar(GeanyDocument *doc, gint pos) void ui_update_statusbar(GeanyDocument *doc, gint pos)
{ {
g_return_if_fail(doc == NULL || doc->is_valid);

if (! interface_prefs.statusbar_visible) if (! interface_prefs.statusbar_visible)
return; /* just do nothing if statusbar is not visible */ return; /* just do nothing if statusbar is not visible */


Expand Down Expand Up @@ -359,6 +361,8 @@ void ui_set_window_title(GeanyDocument *doc)
GString *str; GString *str;
GeanyProject *project = app->project; GeanyProject *project = app->project;


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL) if (doc == NULL)
doc = document_get_current(); doc = document_get_current();


Expand Down Expand Up @@ -445,6 +449,8 @@ void ui_update_popup_reundo_items(GeanyDocument *doc)
gboolean enable_redo; gboolean enable_redo;
guint i, len; guint i, len;


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL) if (doc == NULL)
{ {
enable_undo = FALSE; enable_undo = FALSE;
Expand Down Expand Up @@ -475,6 +481,8 @@ void ui_update_popup_copy_items(GeanyDocument *doc)
gboolean enable; gboolean enable;
guint i, len; guint i, len;


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL) if (doc == NULL)
enable = FALSE; enable = FALSE;
else else
Expand All @@ -501,6 +509,8 @@ void ui_update_menu_copy_items(GeanyDocument *doc)
guint i, len; guint i, len;
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window)); GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));


g_return_if_fail(doc == NULL || doc->is_valid);

if (IS_SCINTILLA(focusw)) if (IS_SCINTILLA(focusw))
enable = (doc == NULL) ? FALSE : sci_has_selection(doc->editor->sci); enable = (doc == NULL) ? FALSE : sci_has_selection(doc->editor->sci);
else else
Expand All @@ -524,6 +534,8 @@ void ui_update_insert_include_item(GeanyDocument *doc, gint item)
{ {
gboolean enable = FALSE; gboolean enable = FALSE;


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL || doc->file_type == NULL) if (doc == NULL || doc->file_type == NULL)
enable = FALSE; enable = FALSE;
else if (doc->file_type->id == GEANY_FILETYPES_C || doc->file_type->id == GEANY_FILETYPES_CPP) else if (doc->file_type->id == GEANY_FILETYPES_C || doc->file_type->id == GEANY_FILETYPES_CPP)
Expand Down Expand Up @@ -892,6 +904,8 @@ void ui_document_show_hide(GeanyDocument *doc)
GtkWidget *item; GtkWidget *item;
const GeanyIndentPrefs *iprefs; const GeanyIndentPrefs *iprefs;


g_return_if_fail(doc == NULL || doc->is_valid);

if (doc == NULL) if (doc == NULL)
doc = document_get_current(); doc = document_get_current();


Expand Down

0 comments on commit 7473e4b

Please sign in to comment.