SF.net SVN: geany: [2092] trunk
eht16 at users.sourceforge.net
eht16 at xxxxx
Thu Dec 6 16:38:13 UTC 2007
Revision: 2092
http://geany.svn.sourceforge.net/geany/?rev=2092&view=rev
Author: eht16
Date: 2007-12-06 08:38:13 -0800 (Thu, 06 Dec 2007)
Log Message:
-----------
Prevent execution of commands by Geany if the VTE may contain any text on the prompt (thanks to "Jeff Pohlmeyer for reporting).
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/build.c
trunk/src/vte.c
trunk/src/vte.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-12-05 13:54:43 UTC (rev 2091)
+++ trunk/ChangeLog 2007-12-06 16:38:13 UTC (rev 2092)
@@ -1,3 +1,10 @@
+2007-12-06 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/build.c, src/vte.c, src/vte.h:
+ Prevent execution of commands by Geany if the VTE may contain any
+ text on the prompt (thanks to "Jeff Pohlmeyer for reporting).
+
+
2007-12-05 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/document.c: Add "b" flag to fopen when saving files to avoid
Modified: trunk/src/build.c
===================================================================
--- trunk/src/build.c 2007-12-05 13:54:43 UTC (rev 2091)
+++ trunk/src/build.c 2007-12-06 16:38:13 UTC (rev 2092)
@@ -770,7 +770,9 @@
gchar *vte_cmd = g_strconcat(RUN_SCRIPT_CMD, "\n", NULL);
// change into current directory if it is not done by default
if (! vc->follow_path) vte_cwd(doc_list[idx].file_name, TRUE);
- vte_send_cmd(vte_cmd);
+ if (! vte_send_cmd(vte_cmd))
+ ui_set_statusbar(FALSE,
+ _("Could not execute the file in the VTE because it probably contains a command."));
// show the VTE
gtk_notebook_set_current_page(GTK_NOTEBOOK(msgwindow.notebook), MSG_VTE);
Modified: trunk/src/vte.c
===================================================================
--- trunk/src/vte.c 2007-12-05 13:54:43 UTC (rev 2091)
+++ trunk/src/vte.c 2007-12-06 16:38:13 UTC (rev 2092)
@@ -47,6 +47,7 @@
extern gchar **environ;
static pid_t pid;
+static gboolean clean = TRUE;
static GModule *module = NULL;
static struct VteFunctions *vf;
static gboolean popup_menu_created = FALSE;
@@ -63,10 +64,12 @@
static void create_vte();
static void vte_start(GtkWidget *widget);
static gboolean vte_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
+static gboolean vte_keyrelease(GtkWidget *widget, GdkEventKey *event, gpointer data);
static gboolean vte_keypress(GtkWidget *widget, GdkEventKey *event, gpointer data);
static void vte_register_symbols(GModule *module);
static void vte_popup_menu_clicked(GtkMenuItem *menuitem, gpointer user_data);
static GtkWidget *vte_create_popup_menu(void);
+void vte_commit(VteTerminal *vte, gchar *arg1, guint arg2, gpointer user_data);
enum
@@ -213,6 +216,8 @@
g_signal_connect(G_OBJECT(vte), "button-press-event", G_CALLBACK(vte_button_pressed), NULL);
if (! vc->enable_bash_keys)
g_signal_connect(G_OBJECT(vte), "event", G_CALLBACK(vte_keypress), NULL);
+ g_signal_connect(G_OBJECT(vte), "key-release-event", G_CALLBACK(vte_keyrelease), NULL);
+ g_signal_connect(G_OBJECT(vte), "commit", G_CALLBACK(vte_commit), NULL);
g_signal_connect(G_OBJECT(vte), "motion-notify-event", G_CALLBACK(on_motion_event), NULL);
//g_signal_connect(G_OBJECT(vte), "drag-data-received", G_CALLBACK(vte_drag_data_received), NULL);
//g_signal_connect(G_OBJECT(vte), "drag-drop", G_CALLBACK(vte_drag_drop), NULL);
@@ -246,6 +251,18 @@
}
+static gboolean vte_keyrelease(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+ if (event->keyval == GDK_Return ||
+ event->keyval == GDK_ISO_Enter ||
+ event->keyval == GDK_KP_Enter)
+ {
+ clean = TRUE; // assume any text on the prompt has been executed when pressing Enter/Return
+ }
+ return FALSE;
+}
+
+
static gboolean vte_keypress(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
g_assert(!vc->enable_bash_keys);
@@ -276,6 +293,12 @@
}
+void vte_commit(VteTerminal *vte, gchar *arg1, guint arg2, gpointer user_data)
+{
+ clean = FALSE;
+}
+
+
static void vte_start(GtkWidget *widget)
{
VteTerminal *vte = VTE_TERMINAL(widget);
@@ -295,6 +318,8 @@
}
else
pid = 0; // use 0 as invalid pid
+
+ clean = TRUE;
}
@@ -469,9 +494,18 @@
}
-void vte_send_cmd(const gchar *cmd)
+/* if the command could be executed, TRUE is returned, FALSE otherwise (i.e. there was some text
+ * on the prompt). */
+gboolean vte_send_cmd(const gchar *cmd)
{
- vf->vte_terminal_feed_child(VTE_TERMINAL(vc->vte), cmd, strlen(cmd));
+ if (clean)
+ {
+ vf->vte_terminal_feed_child(VTE_TERMINAL(vc->vte), cmd, strlen(cmd));
+ clean = TRUE; // vte_terminal_feed_child() also marks the vte as not clean
+ return TRUE;
+ }
+ else
+ return FALSE;
}
@@ -530,7 +564,9 @@
// use g_shell_quote to avoid problems with spaces, '!' or something else in path
gchar *quoted_path = g_shell_quote(path);
gchar *cmd = g_strconcat("cd ", quoted_path, "\n", NULL);
- vte_send_cmd(cmd);
+ if (! vte_send_cmd(cmd))
+ ui_set_statusbar(FALSE,
+ _("Could not change the directory in the VTE because it probably contains a command."));
g_free(quoted_path);
g_free(cmd);
}
Modified: trunk/src/vte.h
===================================================================
--- trunk/src/vte.h 2007-12-05 13:54:43 UTC (rev 2091)
+++ trunk/src/vte.h 2007-12-06 16:38:13 UTC (rev 2092)
@@ -71,7 +71,7 @@
void vte_apply_user_settings(void);
-void vte_send_cmd(const gchar *cmd);
+gboolean vte_send_cmd(const gchar *cmd);
const gchar* vte_get_working_directory(void);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list