VirtualBox

Ignore:
Timestamp:
Mar 11, 2019 9:14:16 PM (6 years ago)
Author:
vboxsync
Message:

os2/vboxsf: Supply RTFS_DOS_NT_NORMAL if fMode is zero, or the host will make no changes (resetting readonly bit not possible). Fake case correction or the icsdebug won't display sources (among other things). Detect reads beyond EOF and skip updating sfi_sizel and timestamps. Both FS32_READ and FS32_WRITE had one or three instances of 'rc' variable shadowing.

Location:
trunk/src/VBox/Additions/os2/VBoxSF
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/os2/VBoxSF/VBoxSF.cpp

    r77642 r77661  
    16011601
    16021602    RT_NOREF_PV(pCdFsi);
    1603     LogFlow(("FS32_RMDIR: returns %u\n", rc));
     1603    LogFlow(("FS32_MMDIR: returns %u\n", rc));
    16041604    return rc;
    16051605}
     
    16211621    {
    16221622        int vrc = VbglR0SfHostReqRemove(pFolder->idHostRoot, pReq, SHFL_REMOVE_DIR);
    1623         LogFlow(("FS32_RMDIR: VbglR0SfHostReqRemove -> %Rrc\n", rc));
     1623        LogFlow(("FS32_RMDIR: VbglR0SfHostReqRemove -> %Rrc\n", vrc));
    16241624        if (RT_SUCCESS(vrc))
    16251625            rc = NO_ERROR;
     
    17191719    {
    17201720        int vrc = VbglR0SfHostReqRemove(pFolder->idHostRoot, pReq, SHFL_REMOVE_FILE);
    1721         LogFlow(("FS32_DELETE: VbglR0SfHostReqRemove -> %Rrc\n", rc));
     1721        LogFlow(("FS32_DELETE: VbglR0SfHostReqRemove -> %Rrc\n", vrc));
    17221722        if (RT_SUCCESS(vrc))
    17231723            rc = NO_ERROR;
     
    17631763    /** @todo should we validate attributes?   */
    17641764    pObjInfoBuf->Attr.fMode = (fAttribs << RTFS_DOS_SHIFT) & RTFS_DOS_MASK_OS2;
     1765    if (pObjInfoBuf->Attr.fMode == 0)
     1766        pObjInfoBuf->Attr.fMode |= RTFS_DOS_NT_NORMAL;
    17651767
    17661768    if (pTimestamps)
     
    18871889FS32_FILEATTRIBUTE(ULONG fFlags, PCDFSI pCdFsi, PVBOXSFCD pCdFsd, PCSZ pszName, LONG offCurDirEnd, PUSHORT pfAttr)
    18881890{
    1889     LogFlow(("FS32_FILEATTRIBUTE: fFlags=%#x pCdFsi=%p:{%#x,%s} pCdFsd=%p pszName=%p:{%s} offCurDirEnd=%d pfAttr=%p\n",
    1890              fFlags, pCdFsi, pCdFsi->cdi_hVPB, pCdFsi->cdi_curdir, pCdFsd, pszName, pszName, offCurDirEnd, pfAttr));
     1891    LogFlow(("FS32_FILEATTRIBUTE: fFlags=%#x pCdFsi=%p:{%#x,%s} pCdFsd=%p pszName=%p:{%s} offCurDirEnd=%d pfAttr=%p={%#x}\n",
     1892             fFlags, pCdFsi, pCdFsi->cdi_hVPB, pCdFsi->cdi_curdir, pCdFsd, pszName, pszName, offCurDirEnd, pfAttr, *pfAttr));
    18911893    RT_NOREF(pCdFsi, offCurDirEnd);
    18921894
     
    21442146 * @param   cbData          The maximum amount of data we can return.
    21452147 */
    2146 static int vboxSfOs2QueryCorrectCase(PVBOXSFFOLDER pFolder, VBOXSFCREATEREQ *pReq, const char *pszPath,
    2147                                      PBYTE pbData, ULONG cbData)
    2148 {
    2149 /** @todo do case correction.  Can do step-by-step dir info... but slow */
    2150     RT_NOREF(pFolder, pReq, pszPath, pbData, cbData);
    2151     return ERROR_NOT_SUPPORTED;
     2148static APIRET vboxSfOs2QueryCorrectCase(PVBOXSFFOLDER pFolder, VBOXSFCREATEREQ *pReq, const char *pszPath,
     2149                                        PBYTE pbData, ULONG cbData)
     2150{
     2151    RT_NOREF(pFolder, pReq);
     2152    APIRET rc;
     2153    size_t cchPath = RTStrNLen(pszPath, CCHMAXPATH + 1);
     2154    if (cchPath <= CCHMAXPATH)
     2155    {
     2156        if (cbData > cchPath)
     2157        {
     2158            /** @todo implement this properly on the host side! */
     2159            rc = KernCopyOut(pbData, pszPath, cbData + 1);
     2160            LogFlow(("vboxSfOs2QueryCorrectCase: returns %u\n", rc));
     2161        }
     2162        else
     2163        {
     2164            LogFlow(("vboxSfOs2QueryCorrectCase: returns %u (ERROR_INSUFFICIENT_BUFFER) - cchPath=%#x cbData=%#x\n",
     2165                     ERROR_INSUFFICIENT_BUFFER, cchPath, cbData));
     2166            rc = ERROR_INSUFFICIENT_BUFFER;
     2167        }
     2168    }
     2169    else
     2170    {
     2171        LogFlow(("vboxSfOs2QueryCorrectCase: returns %u (ERROR_FILENAME_EXCED_RANGE)\n", ERROR_FILENAME_EXCED_RANGE));
     2172        rc = ERROR_FILENAME_EXCED_RANGE;
     2173    }
     2174    return rc;
    21522175}
    21532176
  • trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFFile.cpp

    r76716 r77661  
    313313FS32_CLOSE(ULONG uType, ULONG fIoFlags, PSFFSI pSfFsi, PVBOXSFSYFI pSfFsd)
    314314{
    315     LogFlow(("FS32_CLOSE: uType=%#x fIoFlags=%#x pSfFsi=%p pSfFsd=%p:{%#x}\n", uType, fIoFlags, pSfFsi, pSfFsd, pSfFsd->u32Magic));
     315    LogFlow(("FS32_CLOSE: uType=%#x fIoFlags=%#x pSfFsi=%p pSfFsd=%p:{%#x, %#llx}\n",
     316             uType, fIoFlags, pSfFsi, pSfFsd, pSfFsd->u32Magic, pSfFsd->hHostFile));
    316317
    317318    /*
     
    11211122/**
    11221123 * Helper for FS32_READ.
     1124 *
     1125 * @note Must not called if reading beyond the end of the file, as we would give
     1126 *       sfi_sizel an incorrect value then.
    11231127 */
    11241128DECLINLINE(uint32_t) vboxSfOs2ReadFinalize(PSFFSI pSfFsi, uint64_t offRead, uint32_t cbActual)
     
    11701174            {
    11711175                cbActual = pReq->Parms.cb32Read.u.value32;
    1172                 AssertStmt(cbActual <= cbToRead, cbActual = cbToRead);
    1173                 rc = KernCopyOut(pvData, &pReq->abData[0], cbActual);
    1174                 if (rc == NO_ERROR)
     1176                if (cbActual > 0)
    11751177                {
    1176                     *pcb = vboxSfOs2ReadFinalize(pSfFsi, offRead, cbActual);
    1177                     LogFlow(("FS32_READ: returns; cbActual=%#x sfi_positionl=%RI64 [embedded]\n", cbActual, pSfFsi->sfi_positionl));
     1178                    AssertStmt(cbActual <= cbToRead, cbActual = cbToRead);
     1179                    rc = KernCopyOut(pvData, &pReq->abData[0], cbActual);
     1180                    if (rc == NO_ERROR)
     1181                    {
     1182                        *pcb = vboxSfOs2ReadFinalize(pSfFsi, offRead, cbActual);
     1183                        LogFlow(("FS32_READ: returns; cbActual=%#x sfi_positionl=%RI64 [embedded]\n", cbActual, pSfFsi->sfi_positionl));
     1184                    }
     1185                }
     1186                else
     1187                {
     1188                    LogFlow(("FS32_READ: returns; cbActual=0 (EOF); sfi_positionl=%RI64 [embedded]\n", pSfFsi->sfi_positionl));
     1189                    *pcb = 0;
     1190                    rc = NO_ERROR;
    11781191                }
    11791192            }
     
    12271240            {
    12281241                cbActual = pReq->Parms.cb32Read.u.value32;
    1229                 AssertStmt(cbActual <= cbToRead, cbActual = cbToRead);
    1230                 rc = KernCopyOut(pvData, pvBuf, cbActual);
    1231                 if (rc == NO_ERROR)
     1242                if (cbActual > 0)
    12321243                {
    1233                     *pcb = vboxSfOs2ReadFinalize(pSfFsi, offRead, cbActual);
    1234                     LogFlow(("FS32_READ: returns; cbActual=%#x sfi_positionl=%RI64 [bounced]\n", cbActual, pSfFsi->sfi_positionl));
     1244                    AssertStmt(cbActual <= cbToRead, cbActual = cbToRead);
     1245                    rc = KernCopyOut(pvData, pvBuf, cbActual);
     1246                    if (rc == NO_ERROR)
     1247                    {
     1248                        *pcb = vboxSfOs2ReadFinalize(pSfFsi, offRead, cbActual);
     1249                        LogFlow(("FS32_READ: returns; cbActual=%#x sfi_positionl=%RI64 [bounced]\n", cbActual, pSfFsi->sfi_positionl));
     1250                    }
     1251                }
     1252                else
     1253                {
     1254                    LogFlow(("FS32_READ: returns; cbActual=0 (EOF) sfi_positionl=%RI64 [bounced]\n", pSfFsi->sfi_positionl));
     1255                    *pcb = 0;
     1256                    rc = NO_ERROR;
    12351257                }
    12361258            }
     
    12641286        vboxSfOs2ConvertPageList((KernPageList_t volatile *)&pReq->PgLst.aPages[0], &pReq->PgLst.aPages[0], cPagesRet, cPages);
    12651287
    1266         APIRET rc;
    12671288        int vrc = VbglR0SfHostReqReadPgLst(pFolder->idHostRoot, pReq, pSfFsd->hHostFile, offRead, cbToRead, cPages);
    12681289        if (RT_SUCCESS(vrc))
    12691290        {
    12701291            cbActual = pReq->Parms.cb32Read.u.value32;
    1271             AssertStmt(cbActual <= cbToRead, cbActual = cbToRead);
    1272             *pcb = vboxSfOs2ReadFinalize(pSfFsi, offRead, cbActual);
    1273             LogFlow(("FS32_READ: returns; cbActual=%#x sfi_positionl=%RI64 [locked]\n", cbActual, pSfFsi->sfi_positionl));
     1292            if (cbActual > 0)
     1293            {
     1294                AssertStmt(cbActual <= cbToRead, cbActual = cbToRead);
     1295                *pcb = vboxSfOs2ReadFinalize(pSfFsi, offRead, cbActual);
     1296                LogFlow(("FS32_READ: returns; cbActual=%#x sfi_positionl=%RI64 [locked]\n", cbActual, pSfFsi->sfi_positionl));
     1297            }
     1298            else
     1299            {
     1300                LogFlow(("FS32_READ: returns; cbActual=0 (EOF) sfi_positionl=%RI64 [locked]\n", pSfFsi->sfi_positionl));
     1301                *pcb = 0;
     1302                rc = NO_ERROR;
     1303            }
    12741304        }
    12751305        else
     
    13921422            if (rc == NO_ERROR)
    13931423            {
    1394                 APIRET rc;
    13951424                int vrc = VbglR0SfHostReqWriteContig(pFolder->idHostRoot, pReq, pSfFsd->hHostFile,
    13961425                                                     offWrite, cbToWrite, pvBuf, GCPhys);
     
    14311460        vboxSfOs2ConvertPageList((KernPageList_t volatile *)&pReq->PgLst.aPages[0], &pReq->PgLst.aPages[0], cPagesRet, cPages);
    14321461
    1433         APIRET rc;
    14341462        int vrc = VbglR0SfHostReqWritePgLst(pFolder->idHostRoot, pReq, pSfFsd->hHostFile, offWrite, cbToWrite, cPages);
    14351463        if (RT_SUCCESS(vrc))
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