diff options
author | root <root@rshg054.dnsready.net> | 2012-04-11 00:01:18 +0000 |
---|---|---|
committer | root <root@rshg054.dnsready.net> | 2012-04-11 00:01:18 +0000 |
commit | 04aff5f70cb7c04abe06ca8eaf8261cbb0eeb378 (patch) | |
tree | 4935a4f0959f9560df7fba4989a0de1dc361884e /community-testing/dee/fix-crash.patch | |
parent | 223ca251f3ce07eb5484be845e631d6ca645b263 (diff) |
Wed Apr 11 00:01:18 UTC 2012
Diffstat (limited to 'community-testing/dee/fix-crash.patch')
-rw-r--r-- | community-testing/dee/fix-crash.patch | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/community-testing/dee/fix-crash.patch b/community-testing/dee/fix-crash.patch new file mode 100644 index 000000000..9ce664e10 --- /dev/null +++ b/community-testing/dee/fix-crash.patch @@ -0,0 +1,86 @@ +=== modified file 'src/dee-shared-model.c' +--- src/dee-shared-model.c 2012-03-12 11:49:53 +0000 ++++ src/dee-shared-model.c 2012-03-29 12:04:44 +0000 +@@ -1183,6 +1183,7 @@ + guint32 pos; + guchar change_type; + gint i, j; ++ gboolean transaction_error; + + g_return_if_fail (DEE_IS_SHARED_MODEL (self)); + g_return_if_fail (transaction != NULL); +@@ -1249,48 +1250,56 @@ + g_variant_get (tt, "(tt)", &seqnum_before, &seqnum_after); + g_variant_unref (tt); + ++ transaction_error = FALSE; + /* If this is our first transaction we accept anything, if not the + * incoming seqnums must align with our own records */ + current_seqnum = dee_serializable_model_get_seqnum (DEE_MODEL (self)); +- if (current_seqnum != 0 && +- current_seqnum != seqnum_before) +- { ++ ++ if (current_seqnum != 0 && current_seqnum != seqnum_before) ++ { + g_warning ("Transaction from %s is in the %s. Expected seqnum %"G_GUINT64_FORMAT + ", but got %"G_GUINT64_FORMAT". Ignoring transaction.", + sender_name, + current_seqnum < seqnum_before ? "future" : "past", + current_seqnum, seqnum_before); +- if (dee_shared_model_is_leader (self)) +- { +- g_warning ("Invalidating %s", sender_name); +- invalidate_peer (self, sender_name, NULL); +- } +- +- g_variant_unref (transaction); +- g_variant_unref (aav); +- g_variant_unref (au); +- g_variant_unref (ay); +- return; +- } ++ transaction_error = TRUE; ++ } + + /* Check that the lengths of all the arrays match up */ + n_rows = g_variant_n_children (aav); ++ + if (n_rows != g_variant_n_children (au)) + { + g_warning ("Commit from %s has illegal position vector", + sender_name); +- // FIXME cleanup ++ transaction_error = TRUE; + } + if (n_rows != g_variant_n_children (ay)) + { + g_warning ("Commit from %s has illegal change type vector", + sender_name); +- // FIXME cleanup ++ transaction_error = TRUE; + } + if (n_rows > (seqnum_after - seqnum_before)) + { + g_warning ("Commit from %s has illegal seqnum count.", + sender_name); ++ transaction_error = TRUE; ++ } ++ ++ if (transaction_error) ++ { ++ if (dee_shared_model_is_leader (self)) ++ { ++ g_warning ("Invalidating %s", sender_name); ++ invalidate_peer (self, sender_name, NULL); ++ } ++ ++ g_variant_unref (transaction); ++ g_variant_unref (aav); ++ g_variant_unref (au); ++ g_variant_unref (ay); ++ return; + } + + /* Allocate an array on the stack as a temporary row data buffer */ + |