sctp: reset ret in again path in sctp_for_each_transport
authorXin Long <lucien.xin@gmail.com>
Tue, 23 Jan 2018 10:22:25 +0000 (18:22 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 23 Jan 2018 16:22:25 +0000 (11:22 -0500)
Commit 97a6ec4ac021 ("rhashtable: Change rhashtable_walk_start to
return void") only initialized ret for the first time, when going
to again path, the next tsp could be NULL. Without resetting ret,
cb_done would be called with tsp as NULL.

A kernel crash was caused by this when running sctpdiag testcase
in sctp-tests.

Note that this issue doesn't affect net.git yet.

Fixes: 97a6ec4ac021 ("rhashtable: Change rhashtable_walk_start to return void")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/socket.c

index 7ff444ecee7511ad7a8f496e4acfc48429918176..a40fa53c93efcc292dc3bd439992efd134eefcbc 100644 (file)
@@ -4860,9 +4860,10 @@ int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
                            struct net *net, int *pos, void *p) {
        struct rhashtable_iter hti;
        struct sctp_transport *tsp;
-       int ret = 0;
+       int ret;
 
 again:
+       ret = 0;
        sctp_transport_walk_start(&hti);
 
        tsp = sctp_transport_get_idx(net, &hti, *pos + 1);