Casper.Dik at Sun.COM wrote:
>> Darren Reed writes:
>>     
>>> As part of this continuing code review, I looked at
>>> http://cr.opensolaris.org/~tonyn/firewall13Jan2009/usr/src/cmd/svc/servinfo/servinfo.c
>>>
>>> and I'm wondering if you have, in your latest workspace, a version
>>> of uaddr2port() that doesn't leak memory from the malloc() for port_str?
>>> The other alternative is to use alloca() instead.
>>>       
>> I doubt that either malloc or alloca is needed here.  strtol should be
>> able to crack those numbers without having to make a separate copy.
>>     
>
>
> 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

Darren


Reply via email to