summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2015-06-17 14:39:26 +0530
committerVenky Shankar <vshankar@redhat.com>2015-06-17 23:34:13 -0700
commitba7d5d914b2c897aef0616f3d95beb4d17bc51a8 (patch)
treecd80a867ed47be306494d92396f0a31e516fe596
parentedc8d7d85c67f49fe6b3deb8868013bf3933f9e7 (diff)
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. Change-Id: I6afc8ccedd050cf4b50b967fef8287a0c834177b BUG: 1232666 Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-on: http://review.gluster.org/11273 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Venky Shankar <vshankar@redhat.com>
-rw-r--r--xlators/features/changelog/lib/src/gf-changelog-journal-handler.c9
-rw-r--r--xlators/features/changelog/lib/src/gf-changelog.c13
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 2975b06757f..f07d341ddef 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 82abc662632..874ffd0d13b 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: