diff options
author | Kotresh HR <khiremat@redhat.com> | 2015-06-17 14:39:26 +0530 |
---|---|---|
committer | Venky Shankar <vshankar@redhat.com> | 2015-06-17 23:34:13 -0700 |
commit | ba7d5d914b2c897aef0616f3d95beb4d17bc51a8 (patch) | |
tree | cd80a867ed47be306494d92396f0a31e516fe596 /xlators | |
parent | edc8d7d85c67f49fe6b3deb8868013bf3933f9e7 (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>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/features/changelog/lib/src/gf-changelog-journal-handler.c | 9 | ||||
-rw-r--r-- | 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 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: |