fix longstanding possibility of a crash on new user.
[spider.git] / perl / DXProtHandle.pm
index b8c31542285b4c9f45c985795b1d3a1076a8e6b3..b4d80ab09957fccdea84ccceeaa7d5ef077a587e 100644 (file)
@@ -461,18 +461,17 @@ sub handle_16
                        push @rout, @ans if $h && @ans;
                }
 
-               # send info to all logged in thingies
-               $self->tell_login('loginu', "$ncall: $call") if DXUser->get_current($ncall)->is_local_node;
-               $self->tell_buddies('loginb', $call, $ncall);
-
                # add this station to the user database, if required
-#              $call =~ s/-\d+$//o;    # remove ssid for users
-               my $user = DXUser->get_current($call);
-               $user = DXUser->new($call) if !$user;
+               my $user = DXUser->get_current($ncall);
+               $user = DXUser->new($call) unless $user;
                $user->homenode($parent->call) if !$user->homenode;
                $user->node($parent->call);
                $user->lastin($main::systime) unless DXChannel::get($call);
                $user->put;
+
+               # send info to all logged in thingies
+               $self->tell_login('loginu', "$ncall: $call") if $user->is_local_node;
+               $self->tell_buddies('loginb', $call, $ncall);
        }
        if (@rout) {
                $self->route_pc16($origin, $line, $parent, @rout) if @rout;
@@ -540,7 +539,8 @@ sub handle_17
        $parent->del_user($uref);
 
        # send info to all logged in thingies
-       $self->tell_login('logoutu', "$ncall: $ucall") if DXUser->get_current($ncall)->is_local_node;
+       my $user = DXUser->get_current($ncall);
+       $self->tell_login('logoutu', "$ncall: $ucall") if $user && $user->is_local_node;
        $self->tell_buddies('logoutb', $ucall, $ncall);
 
        if (eph_dup($line)) {
@@ -1553,8 +1553,13 @@ sub handle_92
                                                # reparent to external node (note that we must have received a 'C' or 'A' record
                                                # from the true parent node for this external before we get one for the this node
                                                unless ($parent = Route::Node::get($call)) {
-                                                       dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr');
-                                                       return;
+                                                       if ($is_extnode && $oparent) {
+                                                               @radd =  _add_thingy($oparent, $ent[0]);
+                                                               $parent = $radd[0];
+                                                       } else {
+                                                               dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr');
+                                                               return;
+                                                       }
                                                }
                                                $parent = check_pc9x_t($call, $t, 92) || return;
                                                $parent->via_pc92(1);
@@ -1594,10 +1599,12 @@ sub handle_92
 
                        # we only reset obscounts on config records
                        $oparent->reset_obs;
-                       dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('route');
+                       $oparent->PC92C_dxchan($self->{call}) unless $self->{call} eq $oparent->call;
+                       dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('obscount');
                        if ($oparent != $parent) {
                                $parent->reset_obs;
-                               dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('route');
+                               $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call;
+                               dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('obscount');
                        }
 
                        #
@@ -1759,9 +1766,7 @@ sub handle_default
        my $line = shift;
        my $origin = shift;
 
-       if (eph_dup($line)) {
-               dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr');
-       } else {
+       unless (eph_dup($line)) {
                if ($pcno >= 90) {
                        my $pcall = $_[1];
                        unless (is_callsign($pcall)) {