Merge upstream's fix for vte crash.
ok jasper@
This commit is contained in:
parent
dc2719b7c5
commit
85110fec51
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: Makefile,v 1.47 2014/07/30 14:30:54 naddy Exp $
|
||||
# $OpenBSD: Makefile,v 1.48 2014/08/10 08:05:35 ajacoutot Exp $
|
||||
|
||||
SHARED_ONLY= Yes
|
||||
|
||||
@ -6,7 +6,7 @@ COMMENT= terminal emulation library
|
||||
|
||||
GNOME_PROJECT= vte
|
||||
GNOME_VERSION= 0.36.3
|
||||
REVISION= 0
|
||||
REVISION= 1
|
||||
|
||||
PKGNAME= vte3-${GNOME_VERSION}
|
||||
|
||||
|
@ -1,15 +1,189 @@
|
||||
$OpenBSD: patch-src_vteaccess_c,v 1.1 2014/07/30 14:30:54 naddy Exp $
|
||||
$OpenBSD: patch-src_vteaccess_c,v 1.2 2014/08/10 08:05:35 ajacoutot Exp $
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=727587
|
||||
From 4664d7c24eb16cddf8546e5049537af12a5cb348 Mon Sep 17 00:00:00 2001
|
||||
From: Egmont Koblinger <egmont@gmail.com>
|
||||
Date: Mon, 4 Aug 2014 15:09:39 +0200
|
||||
Subject: a11y: Fix a crash at text deletion
|
||||
|
||||
--- src/vteaccess.c.orig Wed Jul 30 10:44:12 2014
|
||||
+++ src/vteaccess.c Wed Jul 30 10:44:31 2014
|
||||
@@ -1067,6 +1067,8 @@ vte_terminal_accessible_get_text(AtkText *text,
|
||||
} else {
|
||||
/* Map the stopping point. */
|
||||
end = g_array_index(priv->snapshot_characters, int, end_offset);
|
||||
+ if (end > priv->snapshot_text->len)
|
||||
+ end = priv->snapshot_text->len;
|
||||
--- src/vteaccess.c.orig Mon Jun 23 19:26:54 2014
|
||||
+++ src/vteaccess.c Wed Aug 6 11:32:09 2014
|
||||
@@ -236,7 +236,8 @@ emit_text_changed_delete(GObject *object,
|
||||
|
||||
static void
|
||||
vte_terminal_accessible_update_private_data_if_needed(AtkObject *text,
|
||||
- char **old, glong *olen)
|
||||
+ GString **old_text,
|
||||
+ GArray **old_characters)
|
||||
{
|
||||
VteTerminal *terminal;
|
||||
VteTerminalAccessiblePrivate *priv;
|
||||
@@ -256,25 +257,23 @@ vte_terminal_accessible_update_private_data_if_needed(
|
||||
/* If nothing's changed, just return immediately. */
|
||||
if ((priv->snapshot_contents_invalid == FALSE) &&
|
||||
(priv->snapshot_caret_invalid == FALSE)) {
|
||||
- if (old) {
|
||||
+ if (old_text) {
|
||||
if (priv->snapshot_text) {
|
||||
- *old = g_malloc(priv->snapshot_text->len + 1);
|
||||
- memcpy(*old,
|
||||
- priv->snapshot_text->str,
|
||||
- priv->snapshot_text->len);
|
||||
- (*old)[priv->snapshot_text->len] = '\0';
|
||||
- if (olen) {
|
||||
- *olen = priv->snapshot_text->len;
|
||||
- }
|
||||
+ *old_text = g_string_new_len(priv->snapshot_text->str,
|
||||
+ priv->snapshot_text->len);
|
||||
} else {
|
||||
- *old = g_strdup("");
|
||||
- if (olen) {
|
||||
- *olen = 0;
|
||||
- }
|
||||
+ *old_text = g_string_new("");
|
||||
}
|
||||
- } else {
|
||||
- if (olen) {
|
||||
- g_assert_not_reached();
|
||||
+ }
|
||||
+ if (old_characters) {
|
||||
+ if (priv->snapshot_characters) {
|
||||
+ *old_characters = g_array_sized_new(FALSE, FALSE, sizeof(int),
|
||||
+ priv->snapshot_characters->len);
|
||||
+ g_array_append_vals(*old_characters,
|
||||
+ priv->snapshot_characters->data,
|
||||
+ priv->snapshot_characters->len);
|
||||
+ } else {
|
||||
+ *old_characters = g_array_new(FALSE, FALSE, sizeof(int));
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -285,33 +284,31 @@ vte_terminal_accessible_update_private_data_if_needed(
|
||||
if (priv->snapshot_contents_invalid) {
|
||||
/* Free the outdated snapshot data, unless the caller
|
||||
* wants it. */
|
||||
- if (old) {
|
||||
+ if (old_text) {
|
||||
if (priv->snapshot_text != NULL) {
|
||||
- *old = priv->snapshot_text->str;
|
||||
- if (olen) {
|
||||
- *olen = priv->snapshot_text->len;
|
||||
- }
|
||||
- g_string_free(priv->snapshot_text, FALSE);
|
||||
+ *old_text = priv->snapshot_text;
|
||||
} else {
|
||||
- *old = g_strdup("");
|
||||
- if (olen) {
|
||||
- *olen = 0;
|
||||
- }
|
||||
+ *old_text = g_string_new("");
|
||||
}
|
||||
} else {
|
||||
- if (olen) {
|
||||
- g_assert_not_reached();
|
||||
- }
|
||||
if (priv->snapshot_text != NULL) {
|
||||
g_string_free(priv->snapshot_text, TRUE);
|
||||
}
|
||||
}
|
||||
priv->snapshot_text = NULL;
|
||||
|
||||
- /* Free the character offsets and allocate a new array to hold
|
||||
- * them. */
|
||||
- if (priv->snapshot_characters != NULL) {
|
||||
- g_array_free(priv->snapshot_characters, TRUE);
|
||||
+ /* Free the character offsets unless the caller wants it,
|
||||
+ * and allocate a new array to hold them. */
|
||||
+ if (old_characters) {
|
||||
+ if (priv->snapshot_characters != NULL) {
|
||||
+ *old_characters = priv->snapshot_characters;
|
||||
+ } else {
|
||||
+ *old_characters = g_array_new(FALSE, FALSE, sizeof(int));
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (priv->snapshot_characters != NULL) {
|
||||
+ g_array_free(priv->snapshot_characters, TRUE);
|
||||
+ }
|
||||
}
|
||||
priv->snapshot_characters = g_array_new(FALSE, FALSE, sizeof(int));
|
||||
|
||||
@@ -431,6 +428,8 @@ static void
|
||||
vte_terminal_accessible_text_modified(VteTerminal *terminal, gpointer data)
|
||||
{
|
||||
VteTerminalAccessiblePrivate *priv;
|
||||
+ GString *old_text;
|
||||
+ GArray *old_characters;
|
||||
char *old, *current;
|
||||
glong offset, caret_offset, olen, clen;
|
||||
gint old_snapshot_caret;
|
||||
@@ -444,11 +443,15 @@ vte_terminal_accessible_text_modified(VteTerminal *ter
|
||||
old_snapshot_caret = priv->snapshot_caret;
|
||||
priv->snapshot_contents_invalid = TRUE;
|
||||
vte_terminal_accessible_update_private_data_if_needed(ATK_OBJECT(data),
|
||||
- &old, &olen);
|
||||
- g_assert(old != NULL);
|
||||
+ &old_text,
|
||||
+ &old_characters);
|
||||
+ g_assert(old_text != NULL);
|
||||
+ g_assert(old_characters != NULL);
|
||||
|
||||
current = priv->snapshot_text->str;
|
||||
clen = priv->snapshot_text->len;
|
||||
+ old = old_text->str;
|
||||
+ olen = old_text->len;
|
||||
|
||||
if ((guint) priv->snapshot_caret < priv->snapshot_characters->len) {
|
||||
caret_offset = g_array_index(priv->snapshot_characters,
|
||||
@@ -471,12 +474,15 @@ vte_terminal_accessible_text_modified(VteTerminal *ter
|
||||
if ((olen == offset) &&
|
||||
(caret_offset < olen && old[caret_offset] == ' ') &&
|
||||
(old_snapshot_caret == priv->snapshot_caret + 1)) {
|
||||
- priv->snapshot_text->str = old;
|
||||
- priv->snapshot_text->len = caret_offset + 1;
|
||||
+ GString *saved_text = priv->snapshot_text;
|
||||
+ GArray *saved_characters = priv->snapshot_characters;
|
||||
+
|
||||
+ priv->snapshot_text = old_text;
|
||||
+ priv->snapshot_characters = old_characters;
|
||||
emit_text_changed_delete(G_OBJECT(data),
|
||||
old, caret_offset, 1);
|
||||
- priv->snapshot_text->str = current;
|
||||
- priv->snapshot_text->len = clen;
|
||||
+ priv->snapshot_text = saved_text;
|
||||
+ priv->snapshot_characters = saved_characters;
|
||||
}
|
||||
if (end <= start) {
|
||||
ret = g_strdup ("");
|
||||
|
||||
|
||||
@@ -505,17 +511,17 @@ vte_terminal_accessible_text_modified(VteTerminal *ter
|
||||
/* Now emit a deleted signal for text that was in the old
|
||||
* string but isn't in the new one... */
|
||||
if (olen > offset) {
|
||||
- gchar *saved_str = priv->snapshot_text->str;
|
||||
- gsize saved_len = priv->snapshot_text->len;
|
||||
+ GString *saved_text = priv->snapshot_text;
|
||||
+ GArray *saved_characters = priv->snapshot_characters;
|
||||
|
||||
- priv->snapshot_text->str = old;
|
||||
- priv->snapshot_text->len = olen;
|
||||
+ priv->snapshot_text = old_text;
|
||||
+ priv->snapshot_characters = old_characters;
|
||||
emit_text_changed_delete(G_OBJECT(data),
|
||||
old,
|
||||
offset,
|
||||
olen - offset);
|
||||
- priv->snapshot_text->str = saved_str;
|
||||
- priv->snapshot_text->len = saved_len;
|
||||
+ priv->snapshot_text = saved_text;
|
||||
+ priv->snapshot_characters = saved_characters;
|
||||
}
|
||||
/* .. and an inserted signal for text that wasn't in the old
|
||||
* string but is in the new one. */
|
||||
@@ -527,7 +533,8 @@ vte_terminal_accessible_text_modified(VteTerminal *ter
|
||||
}
|
||||
}
|
||||
|
||||
- g_free(old);
|
||||
+ g_string_free(old_text, TRUE);
|
||||
+ g_array_free(old_characters, TRUE);
|
||||
}
|
||||
|
||||
/* A signal handler to catch "text-scrolled" signals. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user