[
https://issues.apache.org/jira/browse/ZOOKEEPER-1029?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15050434#comment-15050434
]
Flavio Junqueira commented on ZOOKEEPER-1029:
---------------------------------------------
[~rgs] thanks for the review and comments.
# Previously, the return value was void, so if there was no adaptor, then we'd
silently move on. By returning 0, I'm essentially keeping the same behavior and
saying that it is OK to make progress. The case this patch is covering is
focused on the one that it does try to acquire the lock, but the lock operation
fails. Also, if you want to make this change here, then we will need to fix it
in the 3.4 branch as well. With this patch, I'm just porting what we've done
for the 3.4 branch so far.
# I don't think it is ok to move the while loop out of the if block because we
aren't initializing tmp_list. Even if we were, there isn't going to be any
iteration of the while loop because there is no head.
# It sounds ok to make this change, but I don't see much advantage or any
correction of behavior. If we don't call the if block as you define it, then
we'll have a_list.completion = NULL and a_list.next = NULL, so there will be no
iteration of the subsequent while loop.
> C client bug in zookeeper_init (if bad hostname is given)
> ---------------------------------------------------------
>
> Key: ZOOKEEPER-1029
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1029
> Project: ZooKeeper
> Issue Type: Bug
> Components: c client
> Affects Versions: 3.3.2, 3.4.6, 3.5.0
> Reporter: Dheeraj Agrawal
> Assignee: Flavio Junqueira
> Priority: Blocker
> Fix For: 3.4.7, 3.5.2, 3.6.0
>
> Attachments: ZOOKEEPER-1029-3.4.patch, ZOOKEEPER-1029-3.4.patch,
> ZOOKEEPER-1029-3.4.patch, ZOOKEEPER-1029-3.4.patch, ZOOKEEPER-1029-3.4.patch,
> ZOOKEEPER-1029-3.4.patch, ZOOKEEPER-1029-3.5.patch
>
>
> If you give invalid hostname to zookeeper_init method, it's not able to
> resolve it, and it tries to do the cleanup (free buffer/completion lists/etc)
> . The adaptor_init() is not called for this code path, so the lock,cond
> variables (for adaptor, completion lists) are not initialized.
> As part of the cleanup it's trying to clean up some buffers and acquires
> locks and unlocks (where the locks have not yet been initialized, so
> unlocking fails)
> lock_completion_list(&zh->sent_requests); - pthread_mutex/cond not
> initialized
> tmp_list = zh->sent_requests;
> zh->sent_requests.head = 0;
> zh->sent_requests.last = 0;
> unlock_completion_list(&zh->sent_requests); trying to broadcast here
> on uninitialized cond
> It should do error checking to see if locking succeeds before unlocking it.
> If Locking fails, then appropriate error handling has to be done.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)