diff options
| author | David S. Miller <davem@davemloft.net> | 2016-04-10 23:01:30 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-04-10 23:01:30 -0400 |
| commit | a36a0d4008488fa545c74445d69eaf56377d5d4e (patch) | |
| tree | 1f9478ad796a658217beeffc6cbfe91236576e2e /net/decnet | |
| parent | ba6f5e33bdbb9ed2014b778fbbaecf20060ca989 (diff) | |
decnet: Do not build routes to devices without decnet private data.
In particular, make sure we check for decnet private presence
for loopback devices.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/decnet')
| -rw-r--r-- | net/decnet/dn_route.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 607a14f20d88..b1dc096d22f8 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -1034,10 +1034,13 @@ source_ok: | |||
| 1034 | if (!fld.daddr) { | 1034 | if (!fld.daddr) { |
| 1035 | fld.daddr = fld.saddr; | 1035 | fld.daddr = fld.saddr; |
| 1036 | 1036 | ||
| 1037 | err = -EADDRNOTAVAIL; | ||
| 1038 | if (dev_out) | 1037 | if (dev_out) |
| 1039 | dev_put(dev_out); | 1038 | dev_put(dev_out); |
| 1039 | err = -EINVAL; | ||
| 1040 | dev_out = init_net.loopback_dev; | 1040 | dev_out = init_net.loopback_dev; |
| 1041 | if (!dev_out->dn_ptr) | ||
| 1042 | goto out; | ||
| 1043 | err = -EADDRNOTAVAIL; | ||
| 1041 | dev_hold(dev_out); | 1044 | dev_hold(dev_out); |
| 1042 | if (!fld.daddr) { | 1045 | if (!fld.daddr) { |
| 1043 | fld.daddr = | 1046 | fld.daddr = |
| @@ -1110,6 +1113,8 @@ source_ok: | |||
| 1110 | if (dev_out == NULL) | 1113 | if (dev_out == NULL) |
| 1111 | goto out; | 1114 | goto out; |
| 1112 | dn_db = rcu_dereference_raw(dev_out->dn_ptr); | 1115 | dn_db = rcu_dereference_raw(dev_out->dn_ptr); |
| 1116 | if (!dn_db) | ||
| 1117 | goto e_inval; | ||
| 1113 | /* Possible improvement - check all devices for local addr */ | 1118 | /* Possible improvement - check all devices for local addr */ |
| 1114 | if (dn_dev_islocal(dev_out, fld.daddr)) { | 1119 | if (dn_dev_islocal(dev_out, fld.daddr)) { |
| 1115 | dev_put(dev_out); | 1120 | dev_put(dev_out); |
| @@ -1151,6 +1156,8 @@ select_source: | |||
| 1151 | dev_put(dev_out); | 1156 | dev_put(dev_out); |
| 1152 | dev_out = init_net.loopback_dev; | 1157 | dev_out = init_net.loopback_dev; |
| 1153 | dev_hold(dev_out); | 1158 | dev_hold(dev_out); |
| 1159 | if (!dev_out->dn_ptr) | ||
| 1160 | goto e_inval; | ||
| 1154 | fld.flowidn_oif = dev_out->ifindex; | 1161 | fld.flowidn_oif = dev_out->ifindex; |
| 1155 | if (res.fi) | 1162 | if (res.fi) |
| 1156 | dn_fib_info_put(res.fi); | 1163 | dn_fib_info_put(res.fi); |
