Blob Blame History Raw
From 9324d717d9785bc5b811beebabeb02401ed35f3e Mon Sep 17 00:00:00 2001
From: Kotresh HR <khiremat@redhat.com>
Date: Wed, 17 Jun 2015 14:39:26 +0530
Subject: [PATCH 108/129] libgfchangelog: Fix crash in gf_changelog_process

Problem:
    Crash observed in gf_changelog_process and
    gf_changelog_callback_invoker.

Cause:
    Assignments to arguments passed to thread is done
    post thread creation. If the thread created gets
    scheduled before the assignment and access these
    variables, it would crash with segmentation fault.

Solution:
    Assignments to arguments are done prior to the thread
    creation.

BUG: 1232609
Change-Id: Ie90325f46713dcdd94c4ac715815c814ca804489
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: http://review.gluster.org/11273
Reviewed-on: http://review.gluster.org/11308
Reviewed-on: https://code.engineering.redhat.com/gerrit/51069
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
---
 .../lib/src/gf-changelog-journal-handler.c         |    9 ++++++---
 xlators/features/changelog/lib/src/gf-changelog.c  |   13 ++++++++-----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c b/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c
index 2975b06..f07d341 100644
--- a/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c
+++ b/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c
@@ -790,13 +790,16 @@ gf_changelog_init_processor (gf_changelog_journal_t *jnl)
                 goto cleanup_mutex;
 
         INIT_LIST_HEAD (&jnl_proc->entries);
+        jnl_proc->waiting = _gf_false;
+        jnl->jnl_proc = jnl_proc;
+
         ret = pthread_create (&jnl_proc->processor,
                               NULL, gf_changelog_process, jnl);
-        if (ret != 0)
+        if (ret != 0) {
+                jnl->jnl_proc = NULL;
                 goto cleanup_cond;
-        jnl_proc->waiting = _gf_false;
+        }
 
-        jnl->jnl_proc = jnl_proc;
         return 0;
 
  cleanup_cond:
diff --git a/xlators/features/changelog/lib/src/gf-changelog.c b/xlators/features/changelog/lib/src/gf-changelog.c
index 82abc66..874ffd0 100644
--- a/xlators/features/changelog/lib/src/gf-changelog.c
+++ b/xlators/features/changelog/lib/src/gf-changelog.c
@@ -292,11 +292,6 @@ gf_init_event (gf_changelog_t *entry)
 
         ev->next_seq = 0;  /* bootstrap sequencing */
 
-        ret = gf_thread_create (&ev->invoker, NULL,
-                                gf_changelog_callback_invoker, ev);
-        if (ret != 0)
-                goto cleanup_cond;
-
         if (GF_NEED_ORDERED_EVENTS (entry)) {
                 entry->pickevent  = pick_event_ordered;
                 entry->queueevent = queue_ordered_event;
@@ -305,6 +300,14 @@ gf_init_event (gf_changelog_t *entry)
                 entry->queueevent = queue_unordered_event;
         }
 
+        ret = gf_thread_create (&ev->invoker, NULL,
+                                gf_changelog_callback_invoker, ev);
+        if (ret != 0) {
+                entry->pickevent = NULL;
+                entry->queueevent = NULL;
+                goto cleanup_cond;
+        }
+
         return 0;
 
  cleanup_cond:
-- 
1.7.1