From 9324d717d9785bc5b811beebabeb02401ed35f3e Mon Sep 17 00:00:00 2001 From: Kotresh HR 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 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 Tested-by: Venky Shankar --- .../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