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

Commit 9e691ed6 authored by Simon Horman's avatar Simon Horman
Browse files

ipvs: only unlock in ip_vs_edit_service() if already locked



Jumping to out unlocks __ip_vs_svc_lock, but that lock is not taken until
after code that may jump to out.

This problem was detected by sparse.

make C=1
  CHECK   net/ipv4/ipvs/ip_vs_ctl.c
net/ipv4/ipvs/ip_vs_ctl.c:1332:2: warning: context imbalance in 'ip_vs_edit_service' - unexpected unlock

Acked-by: default avatarSven Wegener <sven.wegener@stealer.net>
Acked-by: default avatarJulius Volz <juliusv@google.com>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent e8ae43ec
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -1305,7 +1305,7 @@ ip_vs_edit_service(struct ip_vs_service *svc, struct ip_vs_service_user_kern *u)
		 */
		 */
		if ((ret = ip_vs_unbind_scheduler(svc))) {
		if ((ret = ip_vs_unbind_scheduler(svc))) {
			old_sched = sched;
			old_sched = sched;
			goto out;
			goto out_unlock;
		}
		}


		/*
		/*
@@ -1324,12 +1324,13 @@ ip_vs_edit_service(struct ip_vs_service *svc, struct ip_vs_service_user_kern *u)
			 */
			 */
			ip_vs_bind_scheduler(svc, old_sched);
			ip_vs_bind_scheduler(svc, old_sched);
			old_sched = sched;
			old_sched = sched;
			goto out;
			goto out_unlock;
		}
		}
	}
	}


  out:
  out_unlock:
	write_unlock_bh(&__ip_vs_svc_lock);
	write_unlock_bh(&__ip_vs_svc_lock);
  out:


	if (old_sched)
	if (old_sched)
		ip_vs_scheduler_put(old_sched);
		ip_vs_scheduler_put(old_sched);