| From foo@baz Mon May 16 11:21:32 PDT 2016 |
| From: "David S. Miller" <davem@davemloft.net> |
| Date: Sun, 10 Apr 2016 23:01:30 -0400 |
| Subject: decnet: Do not build routes to devices without decnet private data. |
| |
| From: "David S. Miller" <davem@davemloft.net> |
| |
| [ Upstream commit a36a0d4008488fa545c74445d69eaf56377d5d4e ] |
| |
| In particular, make sure we check for decnet private presence |
| for loopback devices. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/decnet/dn_route.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/net/decnet/dn_route.c |
| +++ b/net/decnet/dn_route.c |
| @@ -1034,10 +1034,13 @@ source_ok: |
| if (!fld.daddr) { |
| fld.daddr = fld.saddr; |
| |
| - err = -EADDRNOTAVAIL; |
| if (dev_out) |
| dev_put(dev_out); |
| + err = -EINVAL; |
| dev_out = init_net.loopback_dev; |
| + if (!dev_out->dn_ptr) |
| + goto out; |
| + err = -EADDRNOTAVAIL; |
| dev_hold(dev_out); |
| if (!fld.daddr) { |
| fld.daddr = |
| @@ -1110,6 +1113,8 @@ source_ok: |
| if (dev_out == NULL) |
| goto out; |
| dn_db = rcu_dereference_raw(dev_out->dn_ptr); |
| + if (!dn_db) |
| + goto e_inval; |
| /* Possible improvement - check all devices for local addr */ |
| if (dn_dev_islocal(dev_out, fld.daddr)) { |
| dev_put(dev_out); |
| @@ -1151,6 +1156,8 @@ select_source: |
| dev_put(dev_out); |
| dev_out = init_net.loopback_dev; |
| dev_hold(dev_out); |
| + if (!dev_out->dn_ptr) |
| + goto e_inval; |
| fld.flowidn_oif = dev_out->ifindex; |
| if (res.fi) |
| dn_fib_info_put(res.fi); |