diff options
| author | Dan McDonald <danmcd@joyent.com> | 2017-09-19 20:08:01 -0400 |
|---|---|---|
| committer | Dan McDonald <danmcd@joyent.com> | 2017-09-20 19:01:06 -0400 |
| commit | d78c4ca74e47a36eb7759ccc148b752017aef6bc (patch) | |
| tree | 76052f58a8b62e32a29d0bfacadd93fde0463e9c | |
| parent | 99904952625e1dc1714a1b464929cc92420b01dc (diff) | |
| download | illumos-joyent-d78c4ca74e47a36eb7759ccc148b752017aef6bc.tar.gz | |
OS-6357 proto_promiscoff_req() doesn't always exit the MAC perimeter
Reviewed by: Ryan Zezeski <rpz@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Approved by: Patrick Mooney <patrick.mooney@joyent.com>
| -rw-r--r-- | usr/src/uts/common/io/dld/dld_proto.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/usr/src/uts/common/io/dld/dld_proto.c b/usr/src/uts/common/io/dld/dld_proto.c index 661d8b2f4f..d6b28c86a7 100644 --- a/usr/src/uts/common/io/dld/dld_proto.c +++ b/usr/src/uts/common/io/dld/dld_proto.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2012, Nexenta Systems, Inc. All rights reserved. + * Copyright 2017 Joyent, Inc. */ /* @@ -682,7 +683,7 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) case DL_PROMISC_SAP: if (!(dsp->ds_promisc & DLS_PROMISC_SAP)) { dl_err = DL_NOTENAB; - goto failed; + goto failed2; } new_flags &= ~DLS_PROMISC_SAP; break; @@ -690,7 +691,7 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) case DL_PROMISC_MULTI: if (!(dsp->ds_promisc & DLS_PROMISC_MULTI)) { dl_err = DL_NOTENAB; - goto failed; + goto failed2; } new_flags &= ~DLS_PROMISC_MULTI; break; @@ -698,7 +699,7 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) case DL_PROMISC_PHYS: if (!(dsp->ds_promisc & DLS_PROMISC_PHYS)) { dl_err = DL_NOTENAB; - goto failed; + goto failed2; } new_flags &= ~DLS_PROMISC_PHYS; break; @@ -706,7 +707,7 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) case DL_PROMISC_RX_ONLY: if (!(dsp->ds_promisc & DLS_PROMISC_RX_ONLY)) { dl_err = DL_NOTENAB; - goto failed; + goto failed2; } new_flags &= ~DLS_PROMISC_RX_ONLY; break; @@ -714,15 +715,14 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) case DL_PROMISC_FIXUPS: if (!(dsp->ds_promisc & DLS_PROMISC_FIXUPS)) { dl_err = DL_NOTENAB; - goto failed; + goto failed2; } new_flags &= ~DLS_PROMISC_FIXUPS; break; default: dl_err = DL_NOTSUPPORTED; - mac_perim_exit(mph); - goto failed; + goto failed2; } /* @@ -731,9 +731,8 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) err = dls_promisc(dsp, new_flags); if (err != 0) { - mac_perim_exit(mph); dl_err = DL_SYSERR; - goto failed; + goto failed2; } ASSERT(dsp->ds_promisc == new_flags); @@ -744,6 +743,8 @@ proto_promiscoff_req(dld_str_t *dsp, mblk_t *mp) 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); } |
