Casper.Dik at Sun.COM wrote:
>>> What is the code doing?
>>>
>>> 79 if ((dot = strrchr(addr, '.')) == 0) {
>>> 80 return (0);
>>> 81 } else {
>>> 82 char *p = dot - 1;
>>> 83 size_t l = 0;
>>> 84 while (*p != '.') {
>>> 85 p--;
>>> 86 l++;
>>> 87 }
>>> 88 p++;
>>> 89
>>> 90 bzero(port_str, addr_len);
>>> 91 (void) strncpy(port_str, p, l);
>>> 92 port = atol(port_str) << 8;
>>> 93
>>> 94 (void) strlcpy(port_str, dot + 1, addr_len);
>>> 95 port = port | atol(port_str);
>>> 96 }
>>> 97
>>> 98 return (port);
>>>
>>> And are we sure that the code is only called with an address with 2 dots?
>>>
>>> I agree that strtol is probably the best function to use here.
>>>
>>>
>>> p = addr + strlen(addr);
>>>
>>> dots = 0;
>>>
>>> while (p-- > addr)
>>> if (*p == '.' && ++dots == 2)
>>> break;
>>>
>>> if (dots != 2)
>>> return (0);
>>> p++;
>>> port = strtoul(p, &q, 10) << 8;
>>> if (q == p || q != '.')
>>> return (0);
>>> port |= strtoul(q + 1, NULL, 10);
>>> return (port);
>>>
>>>
>> It is looking for something like:
>> 10.1.1.1.10.20
>>
>> To mean that IP#10.1.1.1 is using port 2580
>>
>> But it is also trying to pick ports off the end of
>> an IPv6 address too...ie
>> fe80:1:2:3:4:5:6:7.10.20
>>
>
>
> But it fails horribly when it's given:
>
> "<--there might be a second dot left of this arrow."
>
> Then you copy a large piece of memory into port_str.
>
Casper,
We're handling universal addresses from rpcbind(3NSL) so the address
should have correct format.
However, I agree with and Dave that we should better handle malformed
input. I've made the change to make sure that we don't walk past the
input address.
Thanks,
tony