File tree 2 files changed +27
-11
lines changed 2 files changed +27
-11
lines changed Original file line number Diff line number Diff line change @@ -89,18 +89,20 @@ static void ax25_kill_by_device(struct net_device *dev)
89
89
sk = s -> sk ;
90
90
if (!sk ) {
91
91
spin_unlock_bh (& ax25_list_lock );
92
- s -> ax25_dev = NULL ;
93
92
ax25_disconnect (s , ENETUNREACH );
93
+ s -> ax25_dev = NULL ;
94
94
spin_lock_bh (& ax25_list_lock );
95
95
goto again ;
96
96
}
97
97
sock_hold (sk );
98
98
spin_unlock_bh (& ax25_list_lock );
99
99
lock_sock (sk );
100
- s -> ax25_dev = NULL ;
101
- dev_put_track (ax25_dev -> dev , & ax25_dev -> dev_tracker );
102
- ax25_dev_put (ax25_dev );
103
100
ax25_disconnect (s , ENETUNREACH );
101
+ s -> ax25_dev = NULL ;
102
+ if (sk -> sk_socket ) {
103
+ dev_put_track (ax25_dev -> dev , & ax25_dev -> dev_tracker );
104
+ ax25_dev_put (ax25_dev );
105
+ }
104
106
release_sock (sk );
105
107
spin_lock_bh (& ax25_list_lock );
106
108
sock_put (sk );
@@ -979,14 +981,20 @@ static int ax25_release(struct socket *sock)
979
981
{
980
982
struct sock * sk = sock -> sk ;
981
983
ax25_cb * ax25 ;
984
+ ax25_dev * ax25_dev ;
982
985
983
986
if (sk == NULL )
984
987
return 0 ;
985
988
986
989
sock_hold (sk );
987
- sock_orphan (sk );
988
990
lock_sock (sk );
991
+ sock_orphan (sk );
989
992
ax25 = sk_to_ax25 (sk );
993
+ ax25_dev = ax25 -> ax25_dev ;
994
+ if (ax25_dev ) {
995
+ dev_put_track (ax25_dev -> dev , & ax25_dev -> dev_tracker );
996
+ ax25_dev_put (ax25_dev );
997
+ }
990
998
991
999
if (sk -> sk_type == SOCK_SEQPACKET ) {
992
1000
switch (ax25 -> state ) {
Original file line number Diff line number Diff line change @@ -261,12 +261,20 @@ void ax25_disconnect(ax25_cb *ax25, int reason)
261
261
{
262
262
ax25_clear_queues (ax25 );
263
263
264
- if (!ax25 -> sk || !sock_flag (ax25 -> sk , SOCK_DESTROY ))
265
- ax25_stop_heartbeat (ax25 );
266
- ax25_stop_t1timer (ax25 );
267
- ax25_stop_t2timer (ax25 );
268
- ax25_stop_t3timer (ax25 );
269
- ax25_stop_idletimer (ax25 );
264
+ if (reason == ENETUNREACH ) {
265
+ del_timer_sync (& ax25 -> timer );
266
+ del_timer_sync (& ax25 -> t1timer );
267
+ del_timer_sync (& ax25 -> t2timer );
268
+ del_timer_sync (& ax25 -> t3timer );
269
+ del_timer_sync (& ax25 -> idletimer );
270
+ } else {
271
+ if (!ax25 -> sk || !sock_flag (ax25 -> sk , SOCK_DESTROY ))
272
+ ax25_stop_heartbeat (ax25 );
273
+ ax25_stop_t1timer (ax25 );
274
+ ax25_stop_t2timer (ax25 );
275
+ ax25_stop_t3timer (ax25 );
276
+ ax25_stop_idletimer (ax25 );
277
+ }
270
278
271
279
ax25 -> state = AX25_STATE_0 ;
272
280
You can’t perform that action at this time.
0 commit comments