diff options
| author | Srinivasarao P <spathi@codeaurora.org> | 2019-02-27 12:19:37 +0530 |
|---|---|---|
| committer | Srinivasarao P <spathi@codeaurora.org> | 2019-02-27 12:20:28 +0530 |
| commit | 567c084d6267ecef2d65ca2be5b359857a6305d8 (patch) | |
| tree | d550b16fc36c58fba3c9b169a17db3e4182fa9af /net/ax25/ax25_route.c | |
| parent | 119c43587e314ff2ed171b2b5acf70ebd5fbd156 (diff) | |
| parent | cf84cdc1d2b5be6b3e74130a1e7156a26a813fa8 (diff) | |
Merge android-4.4.176 (cf84cdc) into msm-4.4
* refs/heads/tmp-cf84cdc
Linux 4.4.176
KVM: VMX: Fix x2apic check in vmx_msr_bitmap_mode()
ax25: fix possible use-after-free
mISDN: fix a race in dev_expire_timer()
net/x25: do not hold the cpu too long in x25_new_lci()
mfd: as3722: Mark PM functions as __maybe_unused
mfd: as3722: Handle interrupts on suspend
kvm: fix kvm_ioctl_create_device() reference counting (CVE-2019-6974)
x86: livepatch: Treat R_X86_64_PLT32 as R_X86_64_PC32
net: ipv4: use a dedicated counter for icmp_v4 redirect packets
net: stmmac: Fix a race in EEE enable callback
vxlan: test dev->flags & IFF_UP before calling netif_rx()
tcp: clear icsk_backoff in tcp_write_queue_purge()
net: Do not allocate page fragments that are not skb aligned
tcp: tcp_v4_err() should be more careful
net: Add header for usage of fls64()
sky2: Increase D3 delay again
net: Fix for_each_netdev_feature on Big endian
hwmon: (lm80) Fix missing unlock on error in set_fan_div()
vsock: cope with memory allocation failure at socket creation time
net: fix IPv6 prefix route residue
Change-Id: I73009b0e908406e13fe1ce87f9dbe3341f70af98
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
Diffstat (limited to 'net/ax25/ax25_route.c')
| -rw-r--r-- | net/ax25/ax25_route.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c index d39097737e38..149f82bd83fd 100644 --- a/net/ax25/ax25_route.c +++ b/net/ax25/ax25_route.c @@ -40,7 +40,7 @@ #include <linux/export.h> static ax25_route *ax25_route_list; -static DEFINE_RWLOCK(ax25_route_lock); +DEFINE_RWLOCK(ax25_route_lock); void ax25_rt_device_down(struct net_device *dev) { @@ -349,6 +349,7 @@ const struct file_operations ax25_route_fops = { * Find AX.25 route * * Only routes with a reference count of zero can be destroyed. + * Must be called with ax25_route_lock read locked. */ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) { @@ -356,7 +357,6 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) ax25_route *ax25_def_rt = NULL; ax25_route *ax25_rt; - read_lock(&ax25_route_lock); /* * Bind to the physical interface we heard them on, or the default * route if none is found; @@ -379,11 +379,6 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) if (ax25_spe_rt != NULL) ax25_rt = ax25_spe_rt; - if (ax25_rt != NULL) - ax25_hold_route(ax25_rt); - - read_unlock(&ax25_route_lock); - return ax25_rt; } @@ -414,9 +409,12 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr) ax25_route *ax25_rt; int err = 0; - if ((ax25_rt = ax25_get_route(addr, NULL)) == NULL) + ax25_route_lock_use(); + ax25_rt = ax25_get_route(addr, NULL); + if (!ax25_rt) { + ax25_route_lock_unuse(); return -EHOSTUNREACH; - + } if ((ax25->ax25_dev = ax25_dev_ax25dev(ax25_rt->dev)) == NULL) { err = -EHOSTUNREACH; goto put; @@ -451,8 +449,7 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr) } put: - ax25_put_route(ax25_rt); - + ax25_route_lock_unuse(); return err; } |
