VirtualBox

Changeset 63153 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Aug 8, 2016 12:00:20 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
109771
Message:

Split up GuestProcess:i_startProcess to deal with uninitialized variables and an misplaced AssertReturn (didn't clean up the event).

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/GuestProcessImpl.h

    r61792 r63153  
    5353    int i_onRemove(void);
    5454    int i_readData(uint32_t uHandle, uint32_t uSize, uint32_t uTimeoutMS, void *pvData, size_t cbData, uint32_t *pcbRead, int *pGuestRc);
    55     int i_startProcess(uint32_t uTimeoutMS, int *pGuestRc);
     55    int i_startProcess(uint32_t cMsTimeout, int *pGuestRc);
     56    int i_startProcessInner(uint32_t cMsTimeout, AutoWriteLock &rLock, GuestWaitEvent *pEvent, int *pGuestRc);
    5657    int i_startProcessAsync(void);
    5758    int i_terminateProcess(uint32_t uTimeoutMS, int *pGuestRc);
  • trunk/src/VBox/Main/src-client/GuestProcessImpl.cpp

    r62157 r63153  
    10061006}
    10071007
    1008 int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
    1009 {
    1010     LogFlowThisFunc(("uTimeoutMS=%RU32, procExe=%s, procTimeoutMS=%RU32, procFlags=%x, sessionID=%RU32\n",
    1011                      uTimeoutMS, mData.mProcess.mExecutable.c_str(), mData.mProcess.mTimeoutMS, mData.mProcess.mFlags,
     1008int GuestProcess::i_startProcess(uint32_t cMsTimeout, int *pGuestRc)
     1009{
     1010    LogFlowThisFunc(("cMsTimeout=%RU32, procExe=%s, procTimeoutMS=%RU32, procFlags=%x, sessionID=%RU32\n",
     1011                     cMsTimeout, mData.mProcess.mExecutable.c_str(), mData.mProcess.mTimeoutMS, mData.mProcess.mFlags,
    10121012                     mSession->i_getId()));
    10131013
     
    10251025    {
    10261026        eventTypes.push_back(VBoxEventType_OnGuestProcessStateChanged);
    1027 
    10281027        vrc = registerWaitEvent(eventTypes, &pEvent);
    10291028    }
     
    10321031        vrc = VERR_NO_MEMORY;
    10331032    }
    1034 
    10351033    if (RT_FAILURE(vrc))
    10361034        return vrc;
    10371035
     1036    vrc = i_startProcessInner(cMsTimeout, alock, pEvent, pGuestRc);
     1037
     1038    unregisterWaitEvent(pEvent);
     1039
     1040    LogFlowFuncLeaveRC(vrc);
     1041    return vrc;
     1042}
     1043
     1044int GuestProcess::i_startProcessInner(uint32_t cMsTimeout, AutoWriteLock &rLock, GuestWaitEvent *pEvent, int *pGuestRc)
     1045{
    10381046    GuestSession *pSession = mSession;
    10391047    AssertPtr(pSession);
     
    10441052
    10451053    /* Prepare arguments. */
     1054    size_t cArgs = mData.mProcess.mArguments.size();
     1055    if (cArgs >= 128*1024)
     1056        return VERR_BUFFER_OVERFLOW;
     1057
    10461058    char *pszArgs = NULL;
    1047     size_t cArgs = mData.mProcess.mArguments.size();
    1048     if (cArgs >= UINT32_MAX)
    1049         vrc = VERR_BUFFER_OVERFLOW;
    1050 
    1051     if (   RT_SUCCESS(vrc)
    1052         && cArgs)
     1059    int vrc = VINF_SUCCESS;
     1060    if (cArgs)
    10531061    {
    10541062        char const **papszArgv = (char const **)RTMemAlloc((cArgs + 1) * sizeof(papszArgv[0]));
     
    10681076
    10691077        RTMemFree(papszArgv);
     1078        if (RT_FAILURE(vrc))
     1079            return vrc;
     1080
     1081        /* Note! No returns after this. */
    10701082    }
    10711083
    10721084    /* Calculate arguments size (in bytes). */
    1073     size_t cbArgs = 0;
    1074     if (RT_SUCCESS(vrc))
    1075         cbArgs = pszArgs ? strlen(pszArgs) + 1 : 0; /* Include terminating zero. */
     1085    size_t cbArgs = pszArgs ? strlen(pszArgs) + 1 : 0; /* Include terminating zero. */
    10761086
    10771087    /* Prepare environment.  The guest service dislikes the empty string at the end, so drop it. */
    10781088    size_t  cbEnvBlock;
    10791089    char   *pszzEnvBlock;
    1080     if (RT_SUCCESS(vrc))
    1081         vrc = mData.mProcess.mEnvironmentChanges.queryUtf8Block(&pszzEnvBlock, &cbEnvBlock);
     1090    vrc = mData.mProcess.mEnvironmentChanges.queryUtf8Block(&pszzEnvBlock, &cbEnvBlock);
    10821091    if (RT_SUCCESS(vrc))
    10831092    {
     
    11241133        }
    11251134
    1126         alock.release(); /* Drop the write lock before sending. */
     1135        rLock.release(); /* Drop the write lock before sending. */
    11271136
    11281137        vrc = sendCommand(HOST_EXEC_CMD, i, paParms);
     
    11361145    }
    11371146
    1138     if (pszArgs)
    1139         RTStrFree(pszArgs);
     1147    RTStrFree(pszArgs);
    11401148
    11411149    if (RT_SUCCESS(vrc))
    1142         vrc = i_waitForStatusChange(pEvent, uTimeoutMS,
     1150        vrc = i_waitForStatusChange(pEvent, cMsTimeout,
    11431151                                    NULL /* Process status */, pGuestRc);
    1144     unregisterWaitEvent(pEvent);
    1145 
    1146     LogFlowFuncLeaveRC(vrc);
    11471152    return vrc;
    11481153}
     
    13271332        case ProcessStatus_Undefined:
    13281333        case ProcessStatus_Starting:
     1334        case ProcessStatus_Terminating:
     1335        case ProcessStatus_Paused:
    13291336            /* No result available yet, leave wait
    13301337             * flags untouched. */
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