net: Fix routing tables with id > 255 for legacy software
[linux-block.git] / net / ipv4 / fib_semantics.c
index a13c84763d4c10e503e418f2e6afef3e353193c3..0d4d72827e4be08c4829ecea846b2a15e0d83e42 100644 (file)
@@ -152,6 +152,7 @@ void free_fib_info(struct fib_info *fi)
                nh->nh_dev = NULL;
        } endfor_nexthops(fi);
        fib_info_cnt--;
+       release_net(fi->fib_net);
        kfree(fi);
 }
 
@@ -730,7 +731,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
                goto failure;
        fib_info_cnt++;
 
-       fi->fib_net = net;
+       fi->fib_net = hold_net(net);
        fi->fib_protocol = cfg->fc_protocol;
        fi->fib_flags = cfg->fc_flags;
        fi->fib_priority = cfg->fc_priority;
@@ -959,7 +960,10 @@ int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
        rtm->rtm_dst_len = dst_len;
        rtm->rtm_src_len = 0;
        rtm->rtm_tos = tos;
-       rtm->rtm_table = tb_id;
+       if (tb_id < 256)
+               rtm->rtm_table = tb_id;
+       else
+               rtm->rtm_table = RT_TABLE_COMPAT;
        NLA_PUT_U32(skb, RTA_TABLE, tb_id);
        rtm->rtm_type = type;
        rtm->rtm_flags = fi->fib_flags;