Print this page
OS-6357 proto_promiscoff_req() doesn't always exit the MAC perimeter
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012, Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
*/
/*
* Data-Link Driver
*/
*** 680,741 ****
new_flags = dsp->ds_promisc;
switch (dlp->dl_level) {
case DL_PROMISC_SAP:
if (!(dsp->ds_promisc & DLS_PROMISC_SAP)) {
dl_err = DL_NOTENAB;
! goto failed;
}
new_flags &= ~DLS_PROMISC_SAP;
break;
case DL_PROMISC_MULTI:
if (!(dsp->ds_promisc & DLS_PROMISC_MULTI)) {
dl_err = DL_NOTENAB;
! goto failed;
}
new_flags &= ~DLS_PROMISC_MULTI;
break;
case DL_PROMISC_PHYS:
if (!(dsp->ds_promisc & DLS_PROMISC_PHYS)) {
dl_err = DL_NOTENAB;
! goto failed;
}
new_flags &= ~DLS_PROMISC_PHYS;
break;
case DL_PROMISC_RX_ONLY:
if (!(dsp->ds_promisc & DLS_PROMISC_RX_ONLY)) {
dl_err = DL_NOTENAB;
! goto failed;
}
new_flags &= ~DLS_PROMISC_RX_ONLY;
break;
case DL_PROMISC_FIXUPS:
if (!(dsp->ds_promisc & DLS_PROMISC_FIXUPS)) {
dl_err = DL_NOTENAB;
! goto failed;
}
new_flags &= ~DLS_PROMISC_FIXUPS;
break;
default:
dl_err = DL_NOTSUPPORTED;
! mac_perim_exit(mph);
! goto failed;
}
/*
* Adjust channel promiscuity.
*/
err = dls_promisc(dsp, new_flags);
if (err != 0) {
- mac_perim_exit(mph);
dl_err = DL_SYSERR;
! goto failed;
}
ASSERT(dsp->ds_promisc == new_flags);
if (dsp->ds_promisc == 0)
dls_active_clear(dsp, B_FALSE);
--- 681,740 ----
new_flags = dsp->ds_promisc;
switch (dlp->dl_level) {
case DL_PROMISC_SAP:
if (!(dsp->ds_promisc & DLS_PROMISC_SAP)) {
dl_err = DL_NOTENAB;
! goto failed2;
}
new_flags &= ~DLS_PROMISC_SAP;
break;
case DL_PROMISC_MULTI:
if (!(dsp->ds_promisc & DLS_PROMISC_MULTI)) {
dl_err = DL_NOTENAB;
! goto failed2;
}
new_flags &= ~DLS_PROMISC_MULTI;
break;
case DL_PROMISC_PHYS:
if (!(dsp->ds_promisc & DLS_PROMISC_PHYS)) {
dl_err = DL_NOTENAB;
! goto failed2;
}
new_flags &= ~DLS_PROMISC_PHYS;
break;
case DL_PROMISC_RX_ONLY:
if (!(dsp->ds_promisc & DLS_PROMISC_RX_ONLY)) {
dl_err = DL_NOTENAB;
! goto failed2;
}
new_flags &= ~DLS_PROMISC_RX_ONLY;
break;
case DL_PROMISC_FIXUPS:
if (!(dsp->ds_promisc & DLS_PROMISC_FIXUPS)) {
dl_err = DL_NOTENAB;
! goto failed2;
}
new_flags &= ~DLS_PROMISC_FIXUPS;
break;
default:
dl_err = DL_NOTSUPPORTED;
! goto failed2;
}
/*
* Adjust channel promiscuity.
*/
err = dls_promisc(dsp, new_flags);
if (err != 0) {
dl_err = DL_SYSERR;
! goto failed2;
}
ASSERT(dsp->ds_promisc == new_flags);
if (dsp->ds_promisc == 0)
dls_active_clear(dsp, B_FALSE);
*** 742,751 ****
--- 741,752 ----
mac_perim_exit(mph);
dlokack(q, mp, DL_PROMISCOFF_REQ);
return;
+ failed2:
+ mac_perim_exit(mph);
failed:
dlerrorack(q, mp, DL_PROMISCOFF_REQ, dl_err, (t_uscalar_t)err);
}
/*