diff options
Diffstat (limited to 'net/ax25/ax25_ds_timer.c')
-rw-r--r-- | net/ax25/ax25_ds_timer.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/ax25/ax25_ds_timer.c b/net/ax25/ax25_ds_timer.c index 951cd57bb07d..5237dff6941d 100644 --- a/net/ax25/ax25_ds_timer.c +++ b/net/ax25/ax25_ds_timer.c | |||
@@ -102,6 +102,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25) | |||
102 | switch (ax25->state) { | 102 | switch (ax25->state) { |
103 | 103 | ||
104 | case AX25_STATE_0: | 104 | case AX25_STATE_0: |
105 | case AX25_STATE_2: | ||
105 | /* Magic here: If we listen() and a new link dies before it | 106 | /* Magic here: If we listen() and a new link dies before it |
106 | is accepted() it isn't 'dead' so doesn't get removed. */ | 107 | is accepted() it isn't 'dead' so doesn't get removed. */ |
107 | if (!sk || sock_flag(sk, SOCK_DESTROY) || | 108 | if (!sk || sock_flag(sk, SOCK_DESTROY) || |
@@ -111,6 +112,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25) | |||
111 | sock_hold(sk); | 112 | sock_hold(sk); |
112 | ax25_destroy_socket(ax25); | 113 | ax25_destroy_socket(ax25); |
113 | bh_unlock_sock(sk); | 114 | bh_unlock_sock(sk); |
115 | /* Ungrab socket and destroy it */ | ||
114 | sock_put(sk); | 116 | sock_put(sk); |
115 | } else | 117 | } else |
116 | ax25_destroy_socket(ax25); | 118 | ax25_destroy_socket(ax25); |
@@ -213,7 +215,8 @@ void ax25_ds_t1_timeout(ax25_cb *ax25) | |||
213 | case AX25_STATE_2: | 215 | case AX25_STATE_2: |
214 | if (ax25->n2count == ax25->n2) { | 216 | if (ax25->n2count == ax25->n2) { |
215 | ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); | 217 | ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); |
216 | ax25_disconnect(ax25, ETIMEDOUT); | 218 | if (!sock_flag(ax25->sk, SOCK_DESTROY)) |
219 | ax25_disconnect(ax25, ETIMEDOUT); | ||
217 | return; | 220 | return; |
218 | } else { | 221 | } else { |
219 | ax25->n2count++; | 222 | ax25->n2count++; |