VirtualBox

Changeset 3365 in kBuild


Ignore:
Timestamp:
Jun 8, 2020 11:35:21 PM (4 years ago)
Author:
bird
Message:

kWorker: CreateFileW/A should must not trust negative caching for volatile areas (TEMP).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kWorker/kWorker.c

    r3361 r3365  
    646646    KWHANDLETYPE_FSOBJ_READ_CACHE,
    647647    KWHANDLETYPE_FSOBJ_READ_CACHE_MAPPING,
     648#ifdef WITH_TEMP_MEMORY_FILES
    648649    KWHANDLETYPE_TEMP_FILE,
    649650    KWHANDLETYPE_TEMP_FILE_MAPPING,
     651#endif
    650652    KWHANDLETYPE_OUTPUT_BUF
    651653} KWHANDLETYPE;
     
    669671        /** The file system object.   */
    670672        PKFSWCACHEDFILE     pCachedFile;
     673#ifdef WITH_TEMP_MEMORY_FILES
    671674        /** Temporary file handle or mapping handle. */
    672675        PKWFSTEMPFILE       pTempFile;
     676#endif
    673677#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    674678        /** Buffered output stream. */
     
    696700        /** The file system object.   */
    697701        PKFSWCACHEDFILE     pCachedFile;
     702#ifdef WITH_TEMP_MEMORY_FILES
    698703        /** Temporary file handle or mapping handle. */
    699704        PKWFSTEMPFILE       pTempFile;
     705#endif
    700706    } u;
    701707} KWMEMMAPPING;
     
    888894    PKWMEMMAPPING   paMemMappings;
    889895
     896#ifdef WITH_TEMP_MEMORY_FILES
    890897    /** Head of the list of temporary file. */
    891898    PKWFSTEMPFILE   pTempFileHead;
     899#endif
    892900
    893901    /** Critical section protecting pVirtualAllocHead. */
     
    69566964                        kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    69576965
    6958                         pFsObj = kFsCacheLookupNoMissingA(g_pFsCache, pszFilename, &enmError);
     6966                        pFsObj = kFsCacheLookupA(g_pFsCache, pszFilename, &enmError);
    69596967                        if (pFsObj)
    69606968                        {
    6961                             KBOOL fRc = kwFsObjCacheCreateFile(pFsObj, dwDesiredAccess, pSecAttrs && pSecAttrs->bInheritHandle,
    6962                                                                &hFile);
    6963                             kFsCacheObjRelease(g_pFsCache, pFsObj);
    6964                             if (fRc)
     6969                            if (pFsObj->bObjType != KFSOBJ_TYPE_MISSING)
    69656970                            {
    6966                                 KWFS_LOG(("CreateFileA(%s) -> %p [cached]\n", pszFilename, hFile));
    6967                                 return hFile;
     6971                                KBOOL fRc = kwFsObjCacheCreateFile(pFsObj, dwDesiredAccess,
     6972                                                                   pSecAttrs && pSecAttrs->bInheritHandle, &hFile);
     6973                                kFsCacheObjRelease(g_pFsCache, pFsObj);
     6974                                if (fRc)
     6975                                {
     6976                                    KWFS_LOG(("CreateFileA(%s) -> %p [cached]\n", pszFilename, hFile));
     6977                                    return hFile;
     6978                                }
    69686979                            }
     6980                            else if (!(pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN))
     6981                            {
     6982                                KWFS_LOG(("CreateFileA(%ls) -> INVALID_HANDLE_VALUE, ERROR_FILE_NOT_FOUND\n", pszFilename));
     6983                                return INVALID_HANDLE_VALUE;
     6984                            }
     6985                            /* Always fall back on missing files in volatile areas. */
    69696986                        }
    69706987                        /* These are for nasm and yasm header searching.  Cache will already
     
    70557072                        kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    70567073
    7057                         pFsObj = kFsCacheLookupNoMissingW(g_pFsCache, pwszFilename, &enmError);
     7074                        pFsObj = kFsCacheLookupW(g_pFsCache, pwszFilename, &enmError);
    70587075                        if (pFsObj)
    70597076                        {
    7060                             KBOOL fRc = kwFsObjCacheCreateFile(pFsObj, dwDesiredAccess, pSecAttrs && pSecAttrs->bInheritHandle,
    7061                                                                &hFile);
    7062                             kFsCacheObjRelease(g_pFsCache, pFsObj);
    7063                             if (fRc)
     7077                            if (pFsObj->bObjType != KFSOBJ_TYPE_MISSING)
    70647078                            {
    7065                                 KWFS_LOG(("CreateFileW(%ls) -> %p [cached]\n", pwszFilename, hFile));
    7066                                 return hFile;
     7079                                KBOOL fRc = kwFsObjCacheCreateFile(pFsObj, dwDesiredAccess,
     7080                                                                   pSecAttrs && pSecAttrs->bInheritHandle, &hFile);
     7081                                kFsCacheObjRelease(g_pFsCache, pFsObj);
     7082                                if (fRc)
     7083                                {
     7084                                    KWFS_LOG(("CreateFileW(%ls) -> %p [cached]\n", pwszFilename, hFile));
     7085                                    return hFile;
     7086                                }
    70677087                            }
     7088                            else if (!(pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN))
     7089                            {
     7090                                KWFS_LOG(("CreateFileW(%ls) -> INVALID_HANDLE_VALUE, ERROR_FILE_NOT_FOUND\n", pwszFilename));
     7091                                return INVALID_HANDLE_VALUE;
     7092                            }
     7093                            /* Always fall back on missing files in volatile areas. */
    70687094                        }
    70697095                        /* These are for nasm and yasm style header searching.  Cache will
     
    71387164                    cbFile = pHandle->u.pTempFile->cbFile;
    71397165                    break;
     7166                case KWHANDLETYPE_TEMP_FILE_MAPPING:
    71407167#endif
    7141                 case KWHANDLETYPE_TEMP_FILE_MAPPING:
    71427168                case KWHANDLETYPE_OUTPUT_BUF:
    71437169                default:
     
    71667192                if (offMove >= (KSSIZE)cbFile)
    71677193                {
     7194#ifdef WITH_TEMP_MEMORY_FILES
    71687195                    /* For read-only files, seeking beyond the end isn't useful to us, so clamp it. */
    71697196                    if (pHandle->enmType != KWHANDLETYPE_TEMP_FILE)
     7197#endif
    71707198                        offMove = (KSSIZE)cbFile;
     7199#ifdef WITH_TEMP_MEMORY_FILES
    71717200                    /* For writable files, seeking beyond the end is fine, but check that we've got
    71727201                       the type range for the request. */
     
    71777206                        return INVALID_SET_FILE_POINTER;
    71787207                    }
     7208#endif
    71797209                }
    71807210                pHandle->offFile = (KU32)offMove;
     
    72217251                    cbFile = pHandle->u.pTempFile->cbFile;
    72227252                    break;
     7253                case KWHANDLETYPE_TEMP_FILE_MAPPING:
    72237254#endif
    7224                 case KWHANDLETYPE_TEMP_FILE_MAPPING:
    72257255                case KWHANDLETYPE_OUTPUT_BUF:
    72267256                default:
     
    72497279                if (offMyMove >= (KSSIZE)cbFile)
    72507280                {
     7281#ifdef WITH_TEMP_MEMORY_FILES
    72517282                    /* For read-only files, seeking beyond the end isn't useful to us, so clamp it. */
    72527283                    if (pHandle->enmType != KWHANDLETYPE_TEMP_FILE)
     7284#endif
    72537285                        offMyMove = (KSSIZE)cbFile;
     7286#ifdef WITH_TEMP_MEMORY_FILES
    72547287                    /* For writable files, seeking beyond the end is fine, but check that we've got
    72557288                       the type range for the request. */
     
    72607293                        return INVALID_SET_FILE_POINTER;
    72617294                    }
     7295#endif
    72627296                }
    72637297                pHandle->offFile = (KU32)offMyMove;
     
    73887422                    return TRUE;
    73897423                }
     7424
     7425                case KWHANDLETYPE_TEMP_FILE_MAPPING:
    73907426#endif /* WITH_TEMP_MEMORY_FILES */
    7391 
    7392                 case KWHANDLETYPE_TEMP_FILE_MAPPING:
    73937427                case KWHANDLETYPE_OUTPUT_BUF:
    73947428                default:
     
    77327766
    77337767                default:
     7768#ifdef WITH_TEMP_MEMORY_FILES
    77347769                case KWHANDLETYPE_TEMP_FILE_MAPPING:
     7770#endif
    77357771                    kHlpAssertFailed();
    77367772                    SetLastError(ERROR_INVALID_FUNCTION);
     
    78057841                    return FALSE;
    78067842
     7843# ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    78077844                case KWHANDLETYPE_OUTPUT_BUF:
    78087845                    kHlpAssertFailed();
    78097846                    SetLastError(pHandle->u.pOutBuf->fIsConsole ? ERROR_INVALID_OPERATION : ERROR_ACCESS_DENIED);
    78107847                    return FALSE;
     7848# endif
    78117849
    78127850                default:
     
    78447882                    return FILE_TYPE_DISK;
    78457883
     7884#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    78467885                case KWHANDLETYPE_OUTPUT_BUF:
    78477886                {
     
    78607899                    return fRet;
    78617900                }
     7901#endif
    78627902
    78637903            }
     
    83748414            else
    83758415            {
     8416#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    83768417                KWFS_LOG(("CloseHandle(%p) -> TRUE [intercepted handle] Ignored closing of std%s!\n",
    83778418                          hObject, hObject == g_Sandbox.StdErr.hOutput ? "err" : "out"));
     8419#else
     8420                KWFS_LOG(("CloseHandle(%p) -> TRUE [intercepted handle] Ignored closing of stdXXX!\n", hObject));
     8421#endif
    83788422                fRet = TRUE;
    83798423            }
     
    1046310507#endif
    1046410508
     10509#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    1046510510    { TUPLE("WriteConsoleA"),               NULL,       (KUPTR)kwSandbox_Kernel32_WriteConsoleA },
    1046610511    { TUPLE("WriteConsoleW"),               NULL,       (KUPTR)kwSandbox_Kernel32_WriteConsoleW },
     10512#endif
    1046710513
    1046810514    { TUPLE("VirtualAlloc"),                NULL,       (KUPTR)kwSandbox_Kernel32_VirtualAlloc },
     
    1060610652    { TUPLE("LoadLibraryExA"),              NULL,       (KUPTR)kwSandbox_Kernel32_Native_LoadLibraryExA },
    1060710653
     10654#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    1060810655    { TUPLE("WriteConsoleA"),               NULL,       (KUPTR)kwSandbox_Kernel32_WriteConsoleA },
    1060910656    { TUPLE("WriteConsoleW"),               NULL,       (KUPTR)kwSandbox_Kernel32_WriteConsoleW },
     10657#endif
    1061010658
    1061110659#ifdef WITH_HASH_MD5_CACHE
     
    1119611244                                      idxHandle, pHandle->hHandle, pHandle->cRefs));
    1119711245                            break;
     11246#ifdef WITH_TEMP_MEMORY_FILES
    1119811247                        case KWHANDLETYPE_TEMP_FILE:
    1119911248                            KWFS_LOG(("Closing leaked temp file  handle: %#x/%p cRefs=%d\n",
     
    1120611255                            pHandle->u.pTempFile->cActiveHandles--;
    1120711256                            break;
     11257#endif
    1120811258                        default:
    1120911259                            kHlpAssertFailed();
     
    1140411454    PMY_RTL_USER_PROCESS_PARAMETERS pProcParams = (PMY_RTL_USER_PROCESS_PARAMETERS)pPeb->ProcessParameters;
    1140511455    pProcParams->CommandLine    = pSandbox->SavedCommandLine;
     11456#ifdef WITH_CONSOLE_OUTPUT_BUFFERING
    1140611457    pProcParams->StandardOutput = pSandbox->StdOut.hOutput;
    1140711458    pProcParams->StandardError  = pSandbox->StdErr.hOutput; /* CL.EXE messes with this one. */
     11459#endif
    1140811460}
    1140911461
     
    1284812900    const char                     *pszTmp;
    1284912901    KFSLOOKUPERROR                  enmIgnored;
     12902    DWORD                           dwType;
    1285012903#if defined(KBUILD_OS_WINDOWS) && defined(KBUILD_ARCH_X86)
    1285112904    PVOID                           pvVecXcptHandler = AddVectoredExceptionHandler(0 /*called last*/,
     
    1285612909    PPEB                            pPeb           = kwSandboxGetProcessEnvironmentBlock();
    1285712910    PMY_RTL_USER_PROCESS_PARAMETERS pProcessParams = (PMY_RTL_USER_PROCESS_PARAMETERS)pPeb->ProcessParameters;
    12858     DWORD                           dwType;
    1285912911#endif
    1286012912
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