VirtualBox

Ignore:
Timestamp:
Mar 10, 2019 9:13:03 PM (6 years ago)
Author:
vboxsync
Message:

os2/vboxsf: KernStrToUcs and (probably also) KernStrFromUcs trashes ES in some cases (probably when they load a translation table, as it doesn't happen when JFS is actively used), so they need ES preserving wrappers to be safe to use. ticketref:18376 ticketref:18379

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

Legend:

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

    r76716 r77640  
    505505    if (pDst)
    506506    {
    507         APIRET rc = KernStrToUcs(NULL, &pDst->String.utf16[0], (char *)pszFolderPath, cchSrc + 4, cchSrc);
     507        APIRET rc = SafeKernStrToUcs(NULL, &pDst->String.utf16[0], (char *)pszFolderPath, cchSrc + 4, cchSrc);
    508508        if (rc == NO_ERROR)
    509509        {
     
    525525            if (pDst)
    526526            {
    527                 rc = KernStrToUcs(NULL, pDst->String.utf16, (char *)pszFolderPath, (cchSrc + 16) * 2, cchSrc);
     527                rc = SafeKernStrToUcs(NULL, pDst->String.utf16, (char *)pszFolderPath, (cchSrc + 16) * 2, cchSrc);
    528528                if (rc == NO_ERROR)
    529529                {
     
    535535                }
    536536                VbglR0PhysHeapFree(pDst);
    537                 LogRel(("vboxSfOs2ConvertPath: KernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
     537                LogRel(("vboxSfOs2ConvertPath: SafeKernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
    538538            }
    539539        }
    540540        else
    541             LogRel(("vboxSfOs2ConvertPath: KernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
     541            LogRel(("vboxSfOs2ConvertPath: SafeKernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
    542542    }
    543543
     
    581581        PSHFLSTRING pDst = (PSHFLSTRING)((uint8_t *)pvBuf + offStrInBuf);
    582582
    583         APIRET rc = KernStrToUcs(NULL, &pDst->String.utf16[0], (char *)pszFolderPath, cchSrc + 4, cchSrc);
     583        APIRET rc = SafeKernStrToUcs(NULL, &pDst->String.utf16[0], (char *)pszFolderPath, cchSrc + 4, cchSrc);
    584584        if (rc == NO_ERROR)
    585585        {
     
    604604                pDst = (PSHFLSTRING)((uint8_t *)pvBuf + offStrInBuf);
    605605
    606                 rc = KernStrToUcs(NULL, pDst->String.utf16, (char *)pszFolderPath, (cchSrc + 16) * 2, cchSrc);
     606                rc = SafeKernStrToUcs(NULL, pDst->String.utf16, (char *)pszFolderPath, (cchSrc + 16) * 2, cchSrc);
    607607                if (rc == NO_ERROR)
    608608                {
     
    614614                }
    615615                VbglR0PhysHeapFree(pDst);
    616                 LogRel(("vboxSfOs2ConvertPath: KernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
     616                LogRel(("vboxSfOs2ConvertPath: SafeKernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
    617617            }
    618618        }
    619619        else
    620             LogRel(("vboxSfOs2ConvertPath: KernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
     620            LogRel(("vboxSfOs2ConvertPath: SafeKernStrToUcs returns %#x for %.*Rhxs\n", rc, cchSrc, pszFolderPath));
    621621    }
    622622
  • trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFA.asm

    r75337 r77640  
    509509extern KernThunkStackTo16
    510510extern KernSelToFlat
     511extern KernStrToUcs
     512extern KernStrFromUcs
    511513segment CODE16
    512514extern FSH_FORCENOSWAP
     
    16141616
    16151617
     1618;
     1619;
     1620; Calling 32-bit kernel code.
     1621;
     1622;
     1623
     1624BEGINCODE
     1625
     1626;;
     1627; Wraps APIRET APIENTRY KernStrToUcs(PUconvObj, UniChar *, char *, LONG, LONG),
     1628; to preserve ES.  ES get trashed in some cases (probably conversion table init).
     1629;
     1630BEGINPROC   SafeKernStrToUcs
     1631DWARF_LABEL_TEXT32 NAME(SafeKernStrToUcs)
     1632        push    ebp
     1633        mov     ebp, esp
     1634        push    es
     1635        push    ds
     1636
     1637        push    dword [ebp + 18h]
     1638        push    dword [ebp + 14h]
     1639        push    dword [ebp + 10h]
     1640        push    dword [ebp + 0ch]
     1641        push    dword [ebp + 08h]
     1642        call    KernStrToUcs
     1643
     1644        lea     esp, [ebp - 8]
     1645        pop     ds
     1646        pop     es
     1647        cld                             ; just to be on the safe side
     1648        leave
     1649        ret
     1650ENDPROC     SafeKernStrToUcs
     1651
     1652
     1653;;
     1654; Wraps APIRET APIENTRY KernStrFromUcs(PUconvObj, char *, UniChar *, LONG, LONG),
     1655; to preserve ES.  ES get trashed in some cases (probably conversion table init).
     1656;
     1657BEGINPROC   SafeKernStrFromUcs
     1658DWARF_LABEL_TEXT32 NAME(SafeKernStrFromUcs)
     1659        push    ebp
     1660        mov     ebp, esp
     1661        push    es
     1662        push    ds
     1663
     1664        push    dword [ebp + 18h]
     1665        push    dword [ebp + 14h]
     1666        push    dword [ebp + 10h]
     1667        push    dword [ebp + 0ch]
     1668        push    dword [ebp + 08h]
     1669        call    KernStrFromUcs
     1670
     1671        lea     esp, [ebp - 8]
     1672        pop     ds
     1673        pop     es
     1674        cld                             ; just to be on the safe side
     1675        leave
     1676        ret
     1677ENDPROC     SafeKernStrFromUcs
     1678
    16161679
    16171680
  • trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFFind.cpp

    r76716 r77640  
    9494     * Conver to the native code page.
    9595     */
    96     APIRET rc = KernStrFromUcs(NULL, pszTmp, pwszName, cbTmp, cwcName);
     96    APIRET rc = SafeKernStrFromUcs(NULL, pszTmp, pwszName, cbTmp, cwcName);
    9797    if (rc != NO_ERROR)
    9898    {
    99         LogRel(("vboxSfOs2IsUtf8Name8dot3: KernStrFromUcs failed: %d\n", rc));
     99        LogRel(("vboxSfOs2IsUtf8Name8dot3: SafeKernStrFromUcs failed: %d\n", rc));
    100100        return false;
    101101    }
     
    134134{
    135135    char *pszDst = (char *)pbDst + 1;
    136     APIRET rc = KernStrFromUcs(NULL, pszDst, pwszSrc, CCHMAXPATHCOMP, cwcSrc);
     136    APIRET rc = SafeKernStrFromUcs(NULL, pszDst, pwszSrc, CCHMAXPATHCOMP, cwcSrc);
    137137    if (rc == NO_ERROR)
    138138    {
     
    143143        return pbDst;
    144144    }
    145     LogRel(("vboxSfOs2CopyUtf8Name: KernStrFromUcs failed: %d\n", rc));
     145    LogRel(("vboxSfOs2CopyUtf8Name: SafeKernStrFromUcs failed: %d\n", rc));
    146146    return NULL;
    147147}
     
    154154{
    155155    char *pszDst = (char *)(pbDst + 1);
    156     APIRET rc = KernStrFromUcs(NULL, pszDst, RTUtf16ToUpper(pwszSrc), CCHMAXPATHCOMP, cwcSrc);
     156    APIRET rc = SafeKernStrFromUcs(NULL, pszDst, RTUtf16ToUpper(pwszSrc), CCHMAXPATHCOMP, cwcSrc);
    157157    if (rc == NO_ERROR)
    158158    {
     
    163163        return pbDst;
    164164    }
    165     LogRel(("vboxSfOs2CopyUtf16NameAndUpperCase: KernStrFromUcs failed: %#x\n", rc));
     165    LogRel(("vboxSfOs2CopyUtf16NameAndUpperCase: SafeKernStrFromUcs failed: %#x\n", rc));
    166166    return NULL;
    167167}
     
    443443               PFSFSI pFsFsi, PVBOXSFFS pFsFsd, PBYTE pbData, ULONG cbData, PUSHORT pcMatches, ULONG uLevel, ULONG fFlags)
    444444{
    445     LogFlow(("pCdFsi=%p pCdFsd=%p pszPath=%p:{%s} offCurDirEnd=%d fAttribs=%#x pFsFsi=%p pFsFsd=%p pbData=%p cbData=%#x pcMatches=%p:{%#x} uLevel=%#x fFlags=%#x\n",
     445    LogFlow(("FS32_FINDFIRST: pCdFsi=%p pCdFsd=%p pszPath=%p:{%s} offCurDirEnd=%d fAttribs=%#x pFsFsi=%p pFsFsd=%p pbData=%p cbData=%#x pcMatches=%p:{%#x} uLevel=%#x fFlags=%#x\n",
    446446             pCdFsi, pCdFsd, pszPath, pszPath, offCurDirEnd, fAttribs, pFsFsi, pFsFsd, pbData, cbData, pcMatches, *pcMatches, uLevel, fFlags));
    447447    USHORT const cMaxMatches = *pcMatches;
  • trunk/src/VBox/Additions/os2/VBoxSF/VBoxSFInternal.h

    r76716 r77640  
    248248APIRET      vboxSfOs2MakeEmptyEaListEx(PEAOP pEaOp, ULONG uLevel, uint32_t *pcbWritten, ULONG *poffError);
    249249
    250 DECLASM(PVBOXSFVP) Fsh32GetVolParams(USHORT hVbp, PVPFSI *ppVpFsi /*optional*/);
     250DECLASM(PVBOXSFVP)  Fsh32GetVolParams(USHORT hVbp, PVPFSI *ppVpFsi /*optional*/);
     251DECLASM(APIRET)     SafeKernStrToUcs(PUconvObj, UniChar *, char *, LONG, LONG);
     252DECLASM(APIRET)     SafeKernStrFromUcs(PUconvObj, char *, UniChar *, LONG, LONG);
    251253
    252254
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