mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
Fix various places where we don't properly release a lock
PR: 185043 Submitted by: Michael Bentkofsky MFC after: 2 weeks
This commit is contained in:
parent
2d9872d14e
commit
d9e1bc4f0d
1 changed files with 18 additions and 8 deletions
|
|
@ -1496,7 +1496,7 @@ inp_block_unblock_source(struct inpcb *inp, struct sockopt *sopt)
|
|||
error = inm_merge(inm, imf);
|
||||
if (error) {
|
||||
CTR1(KTR_IGMPV3, "%s: failed to merge inm state", __func__);
|
||||
goto out_imf_rollback;
|
||||
goto out_in_multi_locked;
|
||||
}
|
||||
|
||||
CTR1(KTR_IGMPV3, "%s: doing igmp downcall", __func__);
|
||||
|
|
@ -1504,6 +1504,8 @@ inp_block_unblock_source(struct inpcb *inp, struct sockopt *sopt)
|
|||
if (error)
|
||||
CTR1(KTR_IGMPV3, "%s: failed igmp downcall", __func__);
|
||||
|
||||
out_in_multi_locked:
|
||||
|
||||
IN_MULTI_UNLOCK();
|
||||
|
||||
out_imf_rollback:
|
||||
|
|
@ -2172,8 +2174,12 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt)
|
|||
if (is_new) {
|
||||
error = in_joingroup_locked(ifp, &gsa->sin.sin_addr, imf,
|
||||
&inm);
|
||||
if (error)
|
||||
if (error) {
|
||||
CTR1(KTR_IGMPV3, "%s: in_joingroup_locked failed",
|
||||
__func__);
|
||||
IN_MULTI_UNLOCK();
|
||||
goto out_imo_free;
|
||||
}
|
||||
imo->imo_membership[idx] = inm;
|
||||
} else {
|
||||
CTR1(KTR_IGMPV3, "%s: merge inm state", __func__);
|
||||
|
|
@ -2181,20 +2187,21 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt)
|
|||
if (error) {
|
||||
CTR1(KTR_IGMPV3, "%s: failed to merge inm state",
|
||||
__func__);
|
||||
goto out_imf_rollback;
|
||||
goto out_in_multi_locked;
|
||||
}
|
||||
CTR1(KTR_IGMPV3, "%s: doing igmp downcall", __func__);
|
||||
error = igmp_change_state(inm);
|
||||
if (error) {
|
||||
CTR1(KTR_IGMPV3, "%s: failed igmp downcall",
|
||||
__func__);
|
||||
goto out_imf_rollback;
|
||||
goto out_in_multi_locked;
|
||||
}
|
||||
}
|
||||
|
||||
out_in_multi_locked:
|
||||
|
||||
IN_MULTI_UNLOCK();
|
||||
|
||||
out_imf_rollback:
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
if (error) {
|
||||
imf_rollback(imf);
|
||||
|
|
@ -2398,7 +2405,7 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
|
|||
if (error) {
|
||||
CTR1(KTR_IGMPV3, "%s: failed to merge inm state",
|
||||
__func__);
|
||||
goto out_imf_rollback;
|
||||
goto out_in_multi_locked;
|
||||
}
|
||||
|
||||
CTR1(KTR_IGMPV3, "%s: doing igmp downcall", __func__);
|
||||
|
|
@ -2409,9 +2416,10 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
|
|||
}
|
||||
}
|
||||
|
||||
out_in_multi_locked:
|
||||
|
||||
IN_MULTI_UNLOCK();
|
||||
|
||||
out_imf_rollback:
|
||||
if (error)
|
||||
imf_rollback(imf);
|
||||
else
|
||||
|
|
@ -2645,7 +2653,7 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
|
|||
error = inm_merge(inm, imf);
|
||||
if (error) {
|
||||
CTR1(KTR_IGMPV3, "%s: failed to merge inm state", __func__);
|
||||
goto out_imf_rollback;
|
||||
goto out_in_multi_locked;
|
||||
}
|
||||
|
||||
CTR1(KTR_IGMPV3, "%s: doing igmp downcall", __func__);
|
||||
|
|
@ -2653,6 +2661,8 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
|
|||
if (error)
|
||||
CTR1(KTR_IGMPV3, "%s: failed igmp downcall", __func__);
|
||||
|
||||
out_in_multi_locked:
|
||||
|
||||
IN_MULTI_UNLOCK();
|
||||
|
||||
out_imf_rollback:
|
||||
|
|
|
|||
Loading…
Reference in a new issue