VirtualBox

Ignore:
Timestamp:
Feb 16, 2016 1:50:10 PM (9 years ago)
Author:
vboxsync
Message:

IPRT: strformat.cpp: Share the temporary buffer and use it for '%c' output buffering to prevent trouble if the output callback checks for null termination.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/string/strformat.cpp

    r57944 r59703  
    364364                            const char *pszFormat, va_list InArgs)
    365365{
     366    char        szTmp[64]; /* Worker functions assumes 64 byte buffer! Ugly but faster. */
    366367    va_list     args;
    367368    KSIZE       cch = 0;
     
    520521                    case 'c':
    521522                    {
    522                         char ch;
    523 
    524523                        if (!(fFlags & RTSTR_F_LEFT))
    525524                            while (--cchWidth > 0)
    526525                                cch += pfnOutput(pvArgOutput, " ", 1);
    527526
    528                         ch = (char)va_arg(args, int);
    529                         cch += pfnOutput(pvArgOutput, SSToDS(&ch), 1);
     527                        szTmp[0] = (char)va_arg(args, int);
     528                        szTmp[1] = '\0';                     /* Some output functions wants terminated strings. */
     529                        cch += pfnOutput(pvArgOutput, SSToDS(&szTmp[0]), 1);
    530530
    531531                        while (--cchWidth > 0)
     
    559559                                RTUNICP Cp;
    560560                                RTUtf16GetCpEx(&pwszStr, &Cp);
    561                                 char szUtf8[8]; /* Cp=0x7fffffff -> 6 bytes. */
    562                                 char *pszEnd = RTStrPutCp(szUtf8, Cp);
    563                                 cch += pfnOutput(pvArgOutput, szUtf8, pszEnd - szUtf8);
     561                                char *pszEnd = RTStrPutCp(szTmp, Cp);
     562                                cch += pfnOutput(pvArgOutput, szTmp, pszEnd - szTmp);
    564563#else
    565564                                char ch = (char)*pwszStr++;
     
    591590/**@todo \#ifndef IN_RC*/
    592591#ifdef IN_RING3
    593                                 char szUtf8[8]; /* Cp=0x7fffffff -> 6 bytes. */
    594                                 char *pszEnd = RTStrPutCp(szUtf8, *puszStr++);
    595                                 cch += pfnOutput(pvArgOutput, szUtf8, pszEnd - szUtf8);
     592                                char *pszEnd = RTStrPutCp(szTmp, *puszStr++);
     593                                cch += pfnOutput(pvArgOutput, szTmp, pszEnd - szTmp);
    596594#else
    597595                                char ch = (char)*puszStr++;
     
    633631                    case 'X':
    634632                    {
    635                         char        achNum[64]; /* FIXME */
    636633                        int         cchNum;
    637634                        uint64_t    u64Value;
     
    754751                            }
    755752                        }
    756                         cchNum = RTStrFormatNumber((char *)SSToDS(&achNum), u64Value, uBase, cchWidth, cchPrecision, fFlags);
    757                         cch += pfnOutput(pvArgOutput, (char *)SSToDS(&achNum), cchNum);
     753                        cchNum = RTStrFormatNumber((char *)SSToDS(&szTmp), u64Value, uBase, cchWidth, cchPrecision, fFlags);
     754                        cch += pfnOutput(pvArgOutput, (char *)SSToDS(&szTmp), cchNum);
    758755                        break;
    759756                    }
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