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.1, 3.2.0
            Reporter: Isabel Drost


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.

Reply via email to