Print this page
OS-6357 proto_promiscoff_req() doesn't always exit the MAC perimeter

@@ -19,10 +19,11 @@
  * 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,62 +681,60 @@
         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;
+                        goto failed2;
                 }
                 new_flags &= ~DLS_PROMISC_SAP;
                 break;
 
         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;
 
         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;
 
         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;
 
         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;
         }
 
         /*
          * Adjust channel promiscuity.
          */
         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);
         if (dsp->ds_promisc == 0)
                 dls_active_clear(dsp, B_FALSE);

@@ -742,10 +741,12 @@
 
         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);
 }
 
 /*