fixes for some join-object-release problems
authorSuper User <root@isdn.jolly.ten>
Sat, 15 Sep 2007 08:40:29 +0000 (10:40 +0200)
committerSuper User <root@isdn.jolly.ten>
Sat, 15 Sep 2007 08:40:29 +0000 (10:40 +0200)
action.cpp
admin_client.c
admin_server.c
joinpbx.cpp

index 4b3f383..9f9db8e 100644 (file)
@@ -236,6 +236,7 @@ void EndpointAppPBX::action_dialing_internal(void)
                trace_header("ACTION extension (extension doesn't exist)", DIRECTION_NONE);
                add_trace("extension", NULL, dialinginfo.id);
                end_trace();
+               release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0, 0);
                new_state(EPOINT_STATE_OUT_DISCONNECT);
                message_disconnect_port(portlist, CAUSE_UNALLOCATED, LOCATION_PRIVATE_LOCAL, "");
                set_tone(portlist, "cause_86");
@@ -248,6 +249,7 @@ void EndpointAppPBX::action_dialing_internal(void)
                add_trace("extension", NULL, dialinginfo.id);
                end_trace();
                new_state(EPOINT_STATE_OUT_DISCONNECT);
+               release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0, 0);
                message_disconnect_port(portlist, CAUSE_REJECTED, LOCATION_PRIVATE_LOCAL, "");
                set_tone(portlist, "cause_81");
                return;
@@ -382,7 +384,7 @@ void EndpointAppPBX::action_dialing_external(void)
        {
                trace_header("ACTION extern (calling denied)", DIRECTION_NONE);
                end_trace();
-               release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_REJECTED, LOCATION_PRIVATE_LOCAL, 0);
+               release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_REJECTED, 0, 0);
                set_tone(portlist, "cause_82");
                denied:
                message_disconnect_port(portlist, CAUSE_REJECTED, LOCATION_PRIVATE_LOCAL, "");
@@ -399,7 +401,7 @@ void EndpointAppPBX::action_dialing_external(void)
                {
                        trace_header("ACTION extern (national calls denied)", DIRECTION_NONE);
                        end_trace();
-                       release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_REJECTED, LOCATION_PRIVATE_LOCAL, 0);
+                       release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_REJECTED, 0, 0);
                        set_tone(portlist, "cause_83");
                        goto denied;
                }
@@ -413,7 +415,7 @@ void EndpointAppPBX::action_dialing_external(void)
                {
                        trace_header("ACTION extern (international calls denied)", DIRECTION_NONE);
                        end_trace();
-                       release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_REJECTED, LOCATION_PRIVATE_LOCAL, 0);
+                       release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_REJECTED, 0, 0);
                        set_tone(portlist, "cause_84");
                        goto denied;
                }
@@ -2292,7 +2294,7 @@ void EndpointAppPBX::process_dialing(void)
                        release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL);
                        goto end;
                }
-               release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, 0);
+               release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0, 0);
                e_action = e_action->next;
                if (!e_action)
                {
index 9baad71..65937e0 100644 (file)
@@ -1626,9 +1626,11 @@ int main(int argc, char *argv[])
 
                case MODE_TESTCALL:
                ret = admin_testcall(sock, argc, argv);
+               break;
 
                case MODE_TRACE:
                ret = admin_trace(sock, argc, argv);
+               break;
        }
 
        close(sock);
index c42f25f..419d2ec 100644 (file)
@@ -1153,7 +1153,7 @@ int admin_handle(void)
                                if (epoint)
                                {
                                        ((class DEFAULT_ENDPOINT_APP *)epoint->ep_app)->
-                                               release(RELEASE_ALL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, 0, 0);
+                                               release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL);
                                }
                        }
 
index 750705f..ec03dc5 100644 (file)
@@ -855,6 +855,12 @@ void JoinPBX::message_epoint(unsigned long epoint_id, int message_type, union pa
                        break;
 
                        case RELATION_TYPE_CALLING: /* by calling */
+                       /* remove us, if we don't have a called releation yet */
+                       if (!j_relation->next)
+                       {
+                               release(j_relation, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL);
+                               return; // must return, because join IS destroyed
+                       }
                        /* remove all relations that are in called */
                        release_again2:
                        reltemp = j_relation;