You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Patrick Hunt (JIRA)" <ji...@apache.org> on 2009/10/14 19:22:31 UTC

[jira] Commented: (ZOOKEEPER-530) Memory corruption: Zookeeper c client IPv6 implementation does not honor struct sockaddr_in6 size

    [ https://issues.apache.org/jira/browse/ZOOKEEPER-530?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12765651#action_12765651 ] 

Patrick Hunt commented on ZOOKEEPER-530:
----------------------------------------

Isabel, is this ready for review? Please click the "submit patch" link if so. 

Also, is there some test we can add for this? Or we just need to run the existing tests on IPv6?


> Memory corruption: Zookeeper c client IPv6 implementation does not honor struct sockaddr_in6 size
> -------------------------------------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-530
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-530
>             Project: Zookeeper
>          Issue Type: Bug
>          Components: c client
>    Affects Versions: 3.2.0, 3.2.1
>            Reporter: Isabel Drost
>            Assignee: Isabel Drost
>             Fix For: 3.3.0
>
>         Attachments: ZOOKEEPER-530.patch
>
>
> I tried to run zookeeper c-client on a machine with IPv6 enabled. When connecting to the IPv6 address a connect(...) gave a "Address family not supported by protocol" error. The reason was, that a few lines earlier, the socket was opened with PF_INET instead of PF_INET6. Changing that the following way:
> {code}
>            if (zh->addrs[zh->connect_index].sa_family == AF_INET) {
>             	zh->fd = socket(PF_INET, SOCK_STREAM, 0);
>             } else {
>             	zh->fd = socket(PF_INET6, SOCK_STREAM, 0);
>             }
> {code}
> turned the error message into "Invalid argument". 
> When printing out sizeof(struct sockaddr), sizeof(struct sockaddr_in) and sizeof(struct sockaddr_in6) I got sockaddr: 16, sockaddr_in: 16 and sockaddr_in6: 28. 
> So in the code calling 
> {code}
>            connect(zh->fd, &zh->addrs[zh->connect_index], sizeof(struct sockaddr_in));
> {code}
> the parameter address_len is too small.
> Same applies to how IPv6 addresses are handled in the function getaddrs(zhandle_t *zh).
> (Big Thanks+kiss to Thilo Fromm for helping me debug this.)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.