[OpenSIPS-Users] BUG in nathelper - can miss contacts to ping
Bogdan-Andrei Iancu
bogdan at opensips.org
Fri Jul 1 16:32:31 CEST 2011
Hi James,
Thanks a lot for reporting and fixing this - indeed, a very ugly bug,
hard to trace. I just uploaded the fix on both trunk and 1.6 branch.
Best regards,
Bogdan
On 05/15/2011 08:06 PM, James Lamanna wrote:
> Hi,
> I've been investigating a problem where I was noticing that nathelper
> was not pinging all the contacts it should be pinging.
> I've narrowed down the problem to this code in nh_timer() in nathelper.c:
>
> rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only?ul.nat_flag:0),
> ((unsigned int)(unsigned long)timer_idx)*natping_interval+iteration,
> natping_processes*natping_interval);
> if (rval<0) {
> LM_ERR("failed to fetch contacts\n");
> goto done;
> }
> if (rval> 0) {
> if (buf != NULL)
> pkg_free(buf);
> cblen = rval * 2;
> buf = pkg_malloc(cblen);
> if (buf == NULL) {
> LM_ERR("out of pkg memory\n");
> goto done;
> }
> rval = ul.get_all_ucontacts(buf,cblen,(ping_nated_only?ul.nat_flag:0),
> ((unsigned int)(unsigned long)timer_idx)*natping_interval+iteration,
> natping_processes*natping_interval);
> if (rval != 0) {
> pkg_free(buf);
> goto done;
> }
> }
>
>
> The problem here is if the first call to ul.get_all_ucontacts fails
> for insufficent buffer size
> (such as if it returns more than 1 contact), the second call
> multiplies the shortage by 2 and then tries it!
> This results in the second buffer actually being smaller than the
> first in many cases, which causes the
> contacts in that call to be skipped due to insufficient buffer size again...
>
> I would propose that the second call actually allocates the correct
> amount of memory like this patch:
>
>
> Index: modules/nathelper/nathelper.c
> ===================================================================
> --- modules/nathelper/nathelper.c (revision 7939)
> +++ modules/nathelper/nathelper.c (working copy)
> @@ -1130,7 +1130,7 @@
> if (rval> 0) {
> if (buf != NULL)
> pkg_free(buf);
> - cblen = rval * 2;
> + cblen += rval;
> buf = pkg_malloc(cblen);
> if (buf == NULL) {
> LM_ERR("out of pkg memory\n");
>
>
> This problem looks like it has been around a long time, so if you use
> NATed contacts, and have had issues
> with firewalls closing connections on you, you should apply this patch
> to see if your problem is fixed.
>
> Thanks.
--
Bogdan-Andrei Iancu
OpenSIPS solutions and "know-how"
More information about the Users
mailing list