[Gluster-users] 2.0.6/transport/socket/src/name.c af_inet_bind_to_port_lt_ceiling usage

Stephan von Krawczynski skraw at ithnet.com
Fri Sep 11 07:24:20 UTC 2009

Hello programmers,

here you can see some code from above source that you really do not want if
you like defensive programming:

client_bind (transport_t *this,
             struct sockaddr *sockaddr, 
             socklen_t *sockaddr_len,
             int sock)
        int ret = 0;

        *sockaddr_len = sizeof (struct sockaddr_in6);
        switch (sockaddr->sa_family)
        case AF_INET_SDP:
        case AF_INET:
                *sockaddr_len = sizeof (struct sockaddr_in);

        case AF_INET6:
                ret = af_inet_bind_to_port_lt_ceiling (sock, sockaddr,
                                                       *sockaddr_len, CLIENT_PORT_CEILING);
                if (ret == -1) {
                        gf_log (this->xl->name, GF_LOG_ERROR,
                                "cannot bind inet socket (%d) to port less than %d (%s)",
                                sock, CLIENT_PORT_CEILING, strerror (errno));
                        ret = 0;

        case AF_UNIX:
                *sockaddr_len = sizeof (struct sockaddr_un);
                ret = af_unix_client_bind (this, (struct sockaddr *)sockaddr,
                                           *sockaddr_len, sock);
                gf_log (this->xl->name, GF_LOG_ERROR,
                        "unknown address family %d", sockaddr->sa_family);
                ret = -1;
        return ret;

If you look closely you find that the error case of af_inet_bind_to_port_lt_ceiling
returning -1 is ending up as ret=0, although all other error cases of this function
return -1. Which means this function returns 0 or -1 in case of error and 0 in case
of nonerror. No chance to make anything useful of the return value for a caller.


More information about the Gluster-users mailing list