[openbeosnetteam] Re: Error in util/misc.c

"David Reid" <dreid@xxxxxxxxxxxx> wrote:

>> struct sockaddr {
>> uint8 sa_len;
>> uint8 sa_family;
>> uint8 sa_data[30];
>> };

>What happens if it's an ipv6 address?
Than it should work just fine, only the ipv4 is broken.
Because sa_data is of uint8 type, not uint32, and = does not compare, and 
memcmp results are different from == results.

This is wrong:
int compare_sockaddr(struct sockaddr *a, struct sockaddr *b)
{
        if (a->sa_len == 4) /* IPv4 address, basically a uint32 */
                return (*(a->sa_data) = *(b->sa_data));
        return memcmp((void*)a->sa_data, (void*)b->sa_data, a->sa_len);
}

This should work:
int compare_sockaddr(struct sockaddr *a, struct sockaddr *b)
{
        if (a->sa_len == 4) /* IPv4 address, basically a uint32 */
                return (*(uint32*)(a->sa_data) == *(uint32 *)(b->sa_data)) ? 1 
: 0;
        return memcmp((void*)a->sa_data, (void*)b->sa_data, a->sa_len);
}

located in 
net_kit/source/server/util/misc.c
and
net_kit/source/server/net_server/misc.c

>(not sure how good it'll be after the drink though :))
Don't drink and code :)

regards
Marcus 

Other related posts: