VirtualBox

Changeset 35061 in vbox


Ignore:
Timestamp:
Dec 14, 2010 10:58:49 AM (14 years ago)
Author:
vboxsync
Message:

GuestControl/Main: Added timeout value for SetProcessInput to prevent host hangs when guest misbehaves.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/GuestImpl.cpp

    r34942 r35061  
    346346                            ULONG uBytesWritten;
    347347                            rc = pGuest->SetProcessInput(uPID, uFlags,
     348                                                         5 * 1000 /* Wait 5s for getting the input data transfered. */,
    348349                                                         ComSafeArrayAsInParam(aInputData), &uBytesWritten);
    349350                            if (FAILED(rc))
     
    606607                                    ULONG uBytesWritten;
    607608                                    rc = pGuest->SetProcessInput(uPID, uFlags,
     609                                                                 5 * 1000 /* Wait 5s for getting the input data transfered. */,
    608610                                                                 ComSafeArrayAsInParam(aInputData), &uBytesWritten);
    609611                                    if (FAILED(rc))
     
    622624                                    Assert(cbLength >= uBytesWritten);
    623625                                    cbLength -= uBytesWritten;
     626                                }
     627                                else if (RT_FAILURE(vrc))
     628                                {
     629                                    rc = TaskGuest::setProgressErrorInfo(VBOX_E_IPRT_ERROR, aTask->progress,
     630                                                                         Guest::tr("Error while reading setup file \"%s\" (To read: %u, Size: %u) from installation medium (%Rrc)"),
     631                                                                         installerImage.c_str(), cbToRead, cbLength, vrc);
    624632                                }
    625633                            }
     
    21562164}
    21572165
    2158 STDMETHODIMP Guest::SetProcessInput(ULONG aPID, ULONG aFlags, ComSafeArrayIn(BYTE, aData), ULONG *aBytesWritten)
     2166STDMETHODIMP Guest::SetProcessInput(ULONG aPID, ULONG aFlags, ULONG aTimeoutMS, ComSafeArrayIn(BYTE, aData), ULONG *aBytesWritten)
    21592167{
    21602168#ifndef VBOX_WITH_GUEST_CONTROL
     
    22172225            if (FAILED(rc)) return rc;
    22182226
     2227            /* Adjust timeout. */
     2228            if (aTimeoutMS == 0)
     2229                aTimeoutMS = UINT32_MAX;
     2230
    22192231            PCALLBACKDATAEXECINSTATUS pData = (PCALLBACKDATAEXECINSTATUS)RTMemAlloc(sizeof(CALLBACKDATAEXECINSTATUS));
    22202232            AssertReturn(pData, VBOX_E_IPRT_ERROR);
     
    22782290
    22792291                    /* Wait until operation completed. */
    2280                     rc = it->second.pProgress->WaitForCompletion(UINT32_MAX /* Wait forever */);
     2292                    rc = it->second.pProgress->WaitForCompletion(aTimeoutMS);
    22812293                    if (FAILED(rc)) throw rc;
    22822294
     
    23852397        if (FAILED(rc)) return rc;
    23862398
    2387         /* Adjust timeout */
     2399        /* Adjust timeout. */
    23882400        if (aTimeoutMS == 0)
    23892401            aTimeoutMS = UINT32_MAX;
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r35040 r35061  
    79387938  <interface
    79397939    name="IGuest" extends="$unknown"
    7940     uuid="1039b0cc-9bc1-4c6d-8d12-864aa48aa5b9"
     7940    uuid="7ce7e4d8-cdaa-4d83-a0f4-510c8ee70aea"
    79417941    wsmap="managed"
    79427942    >
     
    83278327        <desc>
    83288328          Not used, must be set to zero.
     8329        </desc>
     8330      </param>
     8331      <param name="timeoutMS" type="unsigned long" dir="in">
     8332        <desc>
     8333          The maximum timeout value (in msec) to wait for getting the
     8334          data transfered to the guest. Pass 0 for an infinite timeout.
    83298335        </desc>
    83308336      </param>
  • trunk/src/VBox/Main/include/GuestImpl.h

    r34831 r35061  
    9999                              ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress);
    100100    STDMETHOD(GetProcessOutput)(ULONG aPID, ULONG aFlags, ULONG aTimeoutMS, LONG64 aSize, ComSafeArrayOut(BYTE, aData));
    101     STDMETHOD(SetProcessInput)(ULONG aPID, ULONG aFlags, ComSafeArrayIn(BYTE, aData), ULONG *aBytesWritten);
     101    STDMETHOD(SetProcessInput)(ULONG aPID, ULONG aFlags, ULONG aTimeoutMS, ComSafeArrayIn(BYTE, aData), ULONG *aBytesWritten);
    102102    STDMETHOD(GetProcessStatus)(ULONG aPID, ULONG *aExitCode, ULONG *aFlags, ULONG *aStatus);
    103103    STDMETHOD(CopyToGuest)(IN_BSTR aSource, IN_BSTR aDest, IN_BSTR aUserName, IN_BSTR aPassword, ULONG aFlags, IProgress **aProgress);
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