VirtualBox

Changeset 23281 in vbox for trunk


Ignore:
Timestamp:
Sep 24, 2009 12:22:51 PM (15 years ago)
Author:
vboxsync
Message:

Solaris/VBoxNetFlt: fixed host panic due to wrong reference counting (#4304)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r23062 r23281  
    384384
    385385/** Goes along with the instance to determine type of stream being opened/created. */
    386 VBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType;
     386VBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType = kUndefined;
    387387
    388388#ifdef VBOXNETFLT_SOLARIS_IPV6_POLLING
     
    664664     * Check VirtualBox stream type.
    665665     */
    666     if (g_VBoxNetFltSolarisStreamType == kUndefined)
    667     {
    668         LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed due to undefined VirtualBox open mode.\n"));
     666    if (   g_VBoxNetFltSolarisStreamType != kPromiscStream
     667        && g_VBoxNetFltSolarisStreamType != kArpStream
     668        && g_VBoxNetFltSolarisStreamType != kIp6Stream
     669        && g_VBoxNetFltSolarisStreamType != kIp4Stream)
     670    {
     671        LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed due to undefined VirtualBox open mode. Type=%d\n", g_VBoxNetFltSolarisStreamType));
    669672        RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
    670673        return ENOENT;
     
    741744        default:    /* Heh. */
    742745        {
    743             AssertRelease(pStream->Type);
    744             break;
     746            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen huh!? Invalid stream type %d\n", pStream->Type));
     747            RTMemFree(pStream);
     748            RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
     749            return EINVAL;
    745750        }
    746751    }
     
    754759    pStream->pNext = *ppPrevStream;
    755760    *ppPrevStream = pStream;
     761
     762    /*
     763     * Increment IntNet reference count for this stream.
     764     */
     765    vboxNetFltRetain(pThis, false /* fBusy */);
    756766
    757767    /*
     
    841851    {
    842852        LogRel((DEVICE_NAME ":VBoxNetFltSolarisModClose failed to get stream.\n"));
    843         vboxNetFltRelease(pStream->pThis, false /* fBusy */);
    844853        RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
    845854        return ENXIO;
     
    914923    }
    915924
     925    /*
     926     * Decrement IntNet reference count for this stream.
     927     */
    916928    vboxNetFltRelease(pStream->pThis, false /* fBusy */);
     929
    917930    RTMemFree(pStream);
    918931    pQueue->q_ptr = NULL;
     
    17531766            }
    17541767
    1755             LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to find %s in the host stack.\n"));
     1768            LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to find %s in the host stack.\n", DEVICE_NAME));
    17561769        }
    17571770        else
     
    19161929{
    19171930    LogFlow((DEVICE_NAME ":vboxNetFltSolarisCloseStream pThis=%p\n"));
    1918 
    1919     vboxNetFltRetain(pThis, false /* fBusy */);
    19201931
    19211932    ldi_close(pThis->u.s.hIface, FREAD | FWRITE, kcred);
     
    20472058                                 * Inject/Eject from the host IP stack.
    20482059                                 */
    2049                                 if (!fAttach)
    2050                                     vboxNetFltRetain(pThis, false /* fBusy */);
    20512060
    20522061                                /*
     
    20662075                                if (!rc)
    20672076                                {
    2068                                     if (!fAttach)
    2069                                         vboxNetFltRetain(pThis, false /* fBusy */);
    2070 
    20712077                                    /*
    20722078                                     * Inject/Eject from the host ARP stack.
     
    21272133
    21282134                                    vboxNetFltSolarisRelinkIp4(pUdp4VNode, &Ip4Interface, Ip4MuxFd, ArpMuxFd);
    2129 
    2130                                     if (!fAttach)
    2131                                         vboxNetFltRelease(pThis, false /* fBusy */);
    21322135                                }
    21332136                                else
     
    21392142                                g_VBoxNetFltSolarisInstance = NULL;
    21402143                                g_VBoxNetFltSolarisStreamType = kUndefined;
    2141 
    2142                                 if (!fAttach)
    2143                                     vboxNetFltRelease(pThis, false /* fBusy */);
    21442144                            }
    21452145                            else
     
    22792279                            if (RT_SUCCESS(rc))
    22802280                            {
    2281                                 if (!fAttach)
    2282                                     vboxNetFltRetain(pThis, false /* fBusy */);
    2283 
    22842281                                /*
    22852282                                 * Set global data which will be grabbed by ModOpen.
     
    23352332                                    LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to %s the IP stack. rc=%d\n",
    23362333                                            fAttach ? "inject into" : "eject from", rc));
    2337                                     if (!fAttach)
    2338                                         vboxNetFltRelease(pThis, false /* fBusy */);
    23392334                                }
    23402335                            }
     
    24772472    ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, true);
    24782473    vboxNetFltSolarisCloseStream(pThis);
    2479     int rc = vboxNetFltSolarisAttachIp4(pThis, false /* fAttach */);
     2474    int rc = VINF_SUCCESS;
     2475    if (pThis->u.s.pvIp4Stream)
     2476        rc = vboxNetFltSolarisAttachIp4(pThis, false /* fAttach */);
    24802477    if (pThis->u.s.pvIp6Stream)
    24812478        rc = vboxNetFltSolarisAttachIp6(pThis, false /* fAttach */);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette