Hi, community!

I have in my Kamailio script following block (while REGISTER processing,
after auth succeed):
 
 .....
        /* Save to usrloc */
        lock("LOCATION_LOCK");
        if (!save("location")) {
                unlock("LOCATION_LOCK");
                sl_reply_error();
                exit();
        }
        unlock("LOCATION_LOCK");

......

According to module documentation - if "save" - failed (for any reason) - I
expected the control to be returned to the script with error code "-1"

But, there are cases - when this does not happen - which lead to deadlock
for workers processing REGISTERs (I never unlock("LOCATION_LOCK")):
- module answers with internal error - and return 0 from "save" function:
https://github.com/kamailio/kamailio/blob/master/src/modules/registrar/save.c
- line 1013

My use case happened due to malfunctioning device that in some moment of
time:
- send REGISTER update 
- kamailio answers 200OK
- device retransmit the same REGISTER (same CSeq)
- during 20 seconds (hardcoded value in registrar module) - kamailio answers
200OK (and everything is ok)
- if retransmission continue more than 20s - kamailio answered 400 Bad
request, and did not return control to script (as a result I had no chance
to unlock("LOCATION_LOCK") from code above)

Tested it on kamailio 4.2.5 and 5.0.3. 

as for me, possible solutions are:
- return -1 instead of 0 from "save" by default 
- if there are some reasons not to do this - we should change documentation,
and explicitly mention that there are cases - when script execution is
stopped.

thanks in advance!

cheers



--
Sent from: http://sip-router.1086192.n5.nabble.com/Users-f3.html

_______________________________________________
Kamailio (SER) - Users Mailing List
sr-users@lists.kamailio.org
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users

Reply via email to