VirtualBox

Ignore:
Timestamp:
Oct 2, 2020 11:39:26 AM (4 years ago)
Author:
vboxsync
Message:

IPRT/pipe: Adding RTPipeCloseEx w/ a fLeaveOpen parameter so we can prevent leaks via RTHandleGetStandard. Adding RTPIPE_N_LEAVE_OPEN to RTPipeFromNative. bugref:9841

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/win/pipe-win.cpp

    r82968 r86412  
    6767    /** Set if this is the read end, clear if it's the write end. */
    6868    bool                fRead;
     69    /** RTPipeFromNative: Leave native handle open on RTPipeClose. */
     70    bool                fLeaveOpen;
    6971    /** Set if there is already pending I/O. */
    7072    bool                fIOPending;
     
    284286                            pThisR->fRead               = true;
    285287                            pThisW->fRead               = false;
     288                            pThisR->fLeaveOpen          = false;
     289                            pThisW->fLeaveOpen          = false;
    286290                            //pThisR->fIOPending        = false;
    287291                            //pThisW->fIOPending        = false;
     
    400404
    401405
    402 RTDECL(int)  RTPipeClose(RTPIPE hPipe)
     406RTDECL(int)  RTPipeCloseEx(RTPIPE hPipe, bool fLeaveOpen)
    403407{
    404408    RTPIPEINTERNAL *pThis = hPipe;
     
    418422        rtPipeWriteCheckCompletion(pThis);
    419423
    420     CloseHandle(pThis->hPipe);
     424    if (!fLeaveOpen && !pThis->fLeaveOpen)
     425        CloseHandle(pThis->hPipe);
    421426    pThis->hPipe = INVALID_HANDLE_VALUE;
    422427
     
    436441
    437442
     443RTDECL(int)  RTPipeClose(RTPIPE hPipe)
     444{
     445    return RTPipeCloseEx(hPipe, false /*fLeaveOpen*/);
     446}
     447
     448
    438449RTDECL(int)  RTPipeFromNative(PRTPIPE phPipe, RTHCINTPTR hNativePipe, uint32_t fFlags)
    439450{
    440451    AssertPtrReturn(phPipe, VERR_INVALID_POINTER);
    441     AssertReturn(!(fFlags & ~RTPIPE_N_VALID_MASK), VERR_INVALID_PARAMETER);
     452    AssertReturn(!(fFlags & ~RTPIPE_N_VALID_MASK_FN), VERR_INVALID_PARAMETER);
    442453    AssertReturn(!!(fFlags & RTPIPE_N_READ) != !!(fFlags & RTPIPE_N_WRITE), VERR_INVALID_PARAMETER);
    443454
     
    482493            pThis->u32Magic             = RTPIPE_MAGIC;
    483494            pThis->hPipe                = hNative;
    484             pThis->fRead                = !!(fFlags & RTPIPE_N_READ);
     495            pThis->fRead                = RT_BOOL(fFlags & RTPIPE_N_READ);
     496            pThis->fLeaveOpen           = RT_BOOL(fFlags & RTPIPE_N_LEAVE_OPEN);
    485497            //pThis->fIOPending         = false;
    486498            //pThis->fZeroByteRead      = false;
     
    510522                    pThis->hPipe = hNative2;
    511523                    if (rtPipeQueryNtInfo(pThis, &Info))
     524                    {
     525                        pThis->fLeaveOpen = false;
    512526                        rc = VINF_SUCCESS;
     527                    }
    513528                    else
    514529                    {
     
    552567                    if (hNative2 != INVALID_HANDLE_VALUE)
    553568                    {
    554                         if (   hNative != GetStdHandle(STD_INPUT_HANDLE)
     569                        if (   !(fFlags & RTPIPE_N_LEAVE_OPEN)
     570                            && hNative != GetStdHandle(STD_INPUT_HANDLE)
    555571                            && hNative != GetStdHandle(STD_OUTPUT_HANDLE)
    556                             && hNative != GetStdHandle(STD_ERROR_HANDLE))
     572                            && hNative != GetStdHandle(STD_ERROR_HANDLE) )
    557573                            CloseHandle(hNative);
    558574                    }
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