[Freeswitch-dev] Registration Expiration Problem with NATHACK
jpalley at gmail.com
Mon Apr 14 09:51:01 EDT 2008
There is a small bug with registration expiration and nathack.
There is an easy fix but the behavior is unexpected and I believe
there is a chance it may point to a larger problem.
So, I bring it up here. The bug:
sofia_reg.c has the function sofia_reg_check_expire which is called
once a minute to clean out expired registrations from the database.
On line 263: switch_snprintf(sql, sizeof(sql), "delete from
sip_registrations where expires > 0 and expires <= %ld", (long) now);
It deletes expired registrations.
Later in the function we search for NATHACK user agents to send them
an OPTIONS for the NAT keep alive.
Line 282: switch_snprintf(sql, sizeof(sql), "select * from
sip_registrations where status like '%%NATHACK%%'");
Here's the BUG: Line 282 selects records in the database that are
supposed to be deleted in 263. This means you send NAT keep alive to
agents that have already expired. The registrations are then cleared
out of the db once this function completes. Clearly there is some
sort of lock around the db that prevents the delete from occurring
when the sql function is actually called.
Now, we can solve the immediate bug by changing the SQL statement in
Line 282 to not select expired registrations...but is the sqlite
supposed to lock like this?
More information about the Freeswitch-dev