VirtualBox

Changeset 20822 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Jun 23, 2009 12:44:05 PM (15 years ago)
Author:
vboxsync
Message:

utf8-posix.cpp: Fixed allocation bug in rtstrConvert where we would fail to allocate space the terminator if guess a too small buffer (very unlikely).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/posix/utf8-posix.cpp

    r8245 r20822  
    4545
    4646#ifdef RT_OS_SOLARIS
    47 #include <langinfo.h>
     47# include <langinfo.h>
    4848#endif
     49
     50#include "internal/alignmentchecks.h"
     51
    4952
    5053/*******************************************************************************
     
    7376     * Allocate buffer
    7477     */
     78    bool    fUcs2Term;
    7579    void   *pvOutput;
    7680    size_t  cbOutput2;
     
    8185        if (!pvOutput)
    8286            return VERR_NO_TMP_MEMORY;
     87        fUcs2Term = true;
    8388    }
    8489    else
    8590    {
    8691        pvOutput = *ppvOutput;
    87         cbOutput2 = cbOutput - (!strcmp(pszOutputCS, "UCS-2") ? sizeof(RTUTF16) : 1);
     92        fUcs2Term = !strcmp(pszOutputCS, "UCS-2");
     93        cbOutput2 = cbOutput - (fUcs2Term ? sizeof(RTUTF16) : 1);
    8894        if (cbOutput2 > cbOutput)
    8995            return VERR_BUFFER_OVERFLOW;
     
    105111            pszOutputCS = nl_langinfo(CODESET);
    106112#endif
     113        IPRT_ALIGNMENT_CHECKS_DISABLE(); /* glibc causes trouble */
    107114        iconv_t icHandle = iconv_open(pszOutputCS, pszInputCS);
     115        IPRT_ALIGNMENT_CHECKS_ENABLE();
    108116        if (icHandle != (iconv_t)-1)
    109117        {
     
    128136                     */
    129137                    iconv_close(icHandle);
    130                     if (!cbOutput || !strcmp(pszOutputCS, "UCS-2"))
    131                         *(PRTUTF16)pvOutputLeft = '\0';
    132                     else
    133                         *(char *)pvOutputLeft = '\0';
     138                    ((char *)pvOutputLeft)[0] = '\0';
     139                    if (fUcs2Term)
     140                        ((char *)pvOutputLeft)[1] = '\0';
    134141                    *ppvOutput = pvOutput;
    135142                    return VINF_SUCCESS;
    136143                }
    137                 else
    138                     errno = E2BIG;
     144                errno = E2BIG;
    139145            }
    140146            iconv_close(icHandle);
     
    150156                    RTMemTmpFree(pvOutput);
    151157                    cbOutput2 *= 2;
    152                     pvOutput = RTMemTmpAlloc(cbOutput2);
     158                    pvOutput = RTMemTmpAlloc(cbOutput2 + sizeof(RTUTF16));
    153159                    if (!pvOutput)
    154160                        return VERR_NO_TMP_MEMORY;
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