Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a36a0d40 authored by David S. Miller's avatar David S. Miller
Browse files

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: default avatarDavid S. Miller <davem@davemloft.net>
parent ba6f5e33
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -1034,10 +1034,13 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o
	if (!fld.daddr) {
	if (!fld.daddr) {
		fld.daddr = fld.saddr;
		fld.daddr = fld.saddr;


		err = -EADDRNOTAVAIL;
		if (dev_out)
		if (dev_out)
			dev_put(dev_out);
			dev_put(dev_out);
		err = -EINVAL;
		dev_out = init_net.loopback_dev;
		dev_out = init_net.loopback_dev;
		if (!dev_out->dn_ptr)
			goto out;
		err = -EADDRNOTAVAIL;
		dev_hold(dev_out);
		dev_hold(dev_out);
		if (!fld.daddr) {
		if (!fld.daddr) {
			fld.daddr =
			fld.daddr =
@@ -1110,6 +1113,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o
		if (dev_out == NULL)
		if (dev_out == NULL)
			goto out;
			goto out;
		dn_db = rcu_dereference_raw(dev_out->dn_ptr);
		dn_db = rcu_dereference_raw(dev_out->dn_ptr);
		if (!dn_db)
			goto e_inval;
		/* Possible improvement - check all devices for local addr */
		/* Possible improvement - check all devices for local addr */
		if (dn_dev_islocal(dev_out, fld.daddr)) {
		if (dn_dev_islocal(dev_out, fld.daddr)) {
			dev_put(dev_out);
			dev_put(dev_out);
@@ -1151,6 +1156,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *o
			dev_put(dev_out);
			dev_put(dev_out);
		dev_out = init_net.loopback_dev;
		dev_out = init_net.loopback_dev;
		dev_hold(dev_out);
		dev_hold(dev_out);
		if (!dev_out->dn_ptr)
			goto e_inval;
		fld.flowidn_oif = dev_out->ifindex;
		fld.flowidn_oif = dev_out->ifindex;
		if (res.fi)
		if (res.fi)
			dn_fib_info_put(res.fi);
			dn_fib_info_put(res.fi);