[geany/geany] faeeaf: Check the VTE library we're loading actually have all symbols we need
Colomban Wendling
git-noreply at xxxxx
Thu Sep 13 14:34:18 UTC 2012
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Thu, 13 Sep 2012 14:34:18
Commit: faeeaf4bd2ab906441d266baf93b57a13864654a
https://github.com/geany/geany/commit/faeeaf4bd2ab906441d266baf93b57a13864654a
Log Message:
-----------
Check the VTE library we're loading actually have all symbols we need
This prevents a crash if the VTE library we happen to load lacks a
symbol we need, which can happen e.g. if the user passed an improper
library to the --vte-lib command-line option or if the VTE library is
loadable but broken.
Modified Paths:
--------------
src/vte.c
Modified: src/vte.c
85 files changed, 55 insertions(+), 30 deletions(-)
===================================================================
@@ -121,7 +121,7 @@ struct VteFunctions
static gboolean vte_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
static gboolean vte_keyrelease_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
static gboolean vte_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
-static void vte_register_symbols(GModule *module);
+static gboolean vte_register_symbols(GModule *module);
static void vte_popup_menu_clicked(GtkMenuItem *menuitem, gpointer user_data);
static GtkWidget *vte_create_popup_menu(void);
static void vte_commit_cb(VteTerminal *vte, gchar *arg1, guint arg2, gpointer user_data);
@@ -216,9 +216,18 @@ void vte_init(void)
}
else
{
- vte_info.have_vte = TRUE;
vf = g_new0(struct VteFunctions, 1);
- vte_register_symbols(module);
+ if (vte_register_symbols(module))
+ vte_info.have_vte = TRUE;
+ else
+ {
+ vte_info.have_vte = FALSE;
+ g_free(vf);
+ /* FIXME: is closing the module safe? see vte_close() and test on FreeBSD */
+ /*g_module_close(module);*/
+ module = NULL;
+ return;
+ }
}
create_vte();
@@ -406,35 +415,51 @@ static void vte_set_cursor_blink_mode(void)
}
-static void vte_register_symbols(GModule *mod)
-{
- g_module_symbol(mod, "vte_terminal_new", (void*)&vf->vte_terminal_new);
- g_module_symbol(mod, "vte_terminal_set_size", (void*)&vf->vte_terminal_set_size);
- g_module_symbol(mod, "vte_terminal_fork_command", (void*)&vf->vte_terminal_fork_command);
- g_module_symbol(mod, "vte_terminal_set_word_chars", (void*)&vf->vte_terminal_set_word_chars);
- g_module_symbol(mod, "vte_terminal_set_mouse_autohide", (void*)&vf->vte_terminal_set_mouse_autohide);
- g_module_symbol(mod, "vte_terminal_reset", (void*)&vf->vte_terminal_reset);
- g_module_symbol(mod, "vte_terminal_get_type", (void*)&vf->vte_terminal_get_type);
- g_module_symbol(mod, "vte_terminal_set_scroll_on_output", (void*)&vf->vte_terminal_set_scroll_on_output);
- g_module_symbol(mod, "vte_terminal_set_scroll_on_keystroke", (void*)&vf->vte_terminal_set_scroll_on_keystroke);
- g_module_symbol(mod, "vte_terminal_set_font_from_string", (void*)&vf->vte_terminal_set_font_from_string);
- g_module_symbol(mod, "vte_terminal_set_scrollback_lines", (void*)&vf->vte_terminal_set_scrollback_lines);
- g_module_symbol(mod, "vte_terminal_get_has_selection", (void*)&vf->vte_terminal_get_has_selection);
- g_module_symbol(mod, "vte_terminal_copy_clipboard", (void*)&vf->vte_terminal_copy_clipboard);
- g_module_symbol(mod, "vte_terminal_paste_clipboard", (void*)&vf->vte_terminal_paste_clipboard);
- g_module_symbol(mod, "vte_terminal_set_emulation", (void*)&vf->vte_terminal_set_emulation);
- g_module_symbol(mod, "vte_terminal_set_color_foreground", (void*)&vf->vte_terminal_set_color_foreground);
- g_module_symbol(mod, "vte_terminal_set_color_bold", (void*)&vf->vte_terminal_set_color_bold);
- g_module_symbol(mod, "vte_terminal_set_color_background", (void*)&vf->vte_terminal_set_color_background);
- g_module_symbol(mod, "vte_terminal_feed_child", (void*)&vf->vte_terminal_feed_child);
- g_module_symbol(mod, "vte_terminal_im_append_menuitems", (void*)&vf->vte_terminal_im_append_menuitems);
- g_module_symbol(mod, "vte_terminal_set_cursor_blink_mode", (void*)&vf->vte_terminal_set_cursor_blink_mode);
- if (vf->vte_terminal_set_cursor_blink_mode == NULL)
+static gboolean vte_register_symbols(GModule *mod)
+{
+ #define BIND_SYMBOL(field) \
+ g_module_symbol(mod, #field, (void*)&vf->field)
+ #define BIND_REQUIRED_SYMBOL(field) \
+ G_STMT_START { \
+ if (! BIND_SYMBOL(field)) \
+ { \
+ g_critical(_("invalid VTE library \"%s\": missing symbol \"%s\""), \
+ g_module_name(mod), #field); \
+ return FALSE; \
+ } \
+ } G_STMT_END
+
+ BIND_REQUIRED_SYMBOL(vte_terminal_new);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_size);
+ BIND_REQUIRED_SYMBOL(vte_terminal_fork_command);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_word_chars);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_mouse_autohide);
+ BIND_REQUIRED_SYMBOL(vte_terminal_reset);
+ BIND_REQUIRED_SYMBOL(vte_terminal_get_type);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_scroll_on_output);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_scroll_on_keystroke);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_font_from_string);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_scrollback_lines);
+ BIND_REQUIRED_SYMBOL(vte_terminal_get_has_selection);
+ BIND_REQUIRED_SYMBOL(vte_terminal_copy_clipboard);
+ BIND_REQUIRED_SYMBOL(vte_terminal_paste_clipboard);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_emulation);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_color_foreground);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_color_bold);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_color_background);
+ BIND_REQUIRED_SYMBOL(vte_terminal_feed_child);
+ BIND_REQUIRED_SYMBOL(vte_terminal_im_append_menuitems);
+ if (! BIND_SYMBOL(vte_terminal_set_cursor_blink_mode))
/* vte_terminal_set_cursor_blink_mode() is only available since 0.17.1, so if we don't find
* this symbol, we are probably on an older version and use the old API instead */
- g_module_symbol(mod, "vte_terminal_set_cursor_blinks", (void*)&vf->vte_terminal_set_cursor_blinks);
- g_module_symbol(mod, "vte_terminal_select_all", (void*)&vf->vte_terminal_select_all);
- g_module_symbol(mod, "vte_terminal_set_audible_bell", (void*)&vf->vte_terminal_set_audible_bell);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_cursor_blinks);
+ BIND_REQUIRED_SYMBOL(vte_terminal_select_all);
+ BIND_REQUIRED_SYMBOL(vte_terminal_set_audible_bell);
+
+ #undef BIND_REQUIRED_SYMBOL
+ #undef BIND_SYMBOL
+
+ return TRUE;
}
@@ Diff output truncated at 100000 characters. @@
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).
More information about the Commits
mailing list