>> 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


Reply via email to