VirtualBox

Changeset 19534 in vbox for trunk


Ignore:
Timestamp:
May 8, 2009 3:31:09 PM (16 years ago)
Author:
vboxsync
Message:

GuestHost/SharedClipboard/x11: test and fix handling of non-null-terminated strings

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/x11-clipboard.cpp

    r19506 r19534  
    2020 * additional information or have any questions.
    2121 */
     22
     23/* Note: to automatically run regression tests on the shared clipboard, set
     24 * the make variable VBOX_RUN_X11_CLIPBOARD_TEST=1 while building.  If you
     25 * often make changes to the clipboard code, setting this variable in
     26 * LocalConfig.kmk will cause the tests to be run every time the code is
     27 * changed. */
    2228
    2329#define LOG_GROUP LOG_GROUP_SHARED_CLIPBOARD
     
    388394                                         unsigned cb, uint32_t *pcbActual)
    389395{
    390     unsigned cwDestLen = cbSourceLen;
    391396    char *pu8SourceText = reinterpret_cast<char *>(pValue);
    392397    PRTUTF16 pu16DestText = reinterpret_cast<PRTUTF16>(pv);
     
    396401                  cbSourceLen, pu8SourceText));
    397402    *pcbActual = 0;  /* Only set this to the right value on success. */
    398     for (unsigned i = 0; i < cbSourceLen; i++)
     403    unsigned cwDestLen = 0;
     404    for (unsigned i = 0; i < cbSourceLen && pu8SourceText[i] != '\0'; i++)
     405    {
     406        ++cwDestLen;
    399407        if (pu8SourceText[i] == LINEFEED)
    400408            ++cwDestLen;
     409    }
     410    /* Leave space for the terminator */
     411    ++cwDestLen;
    401412    if (cb < cwDestLen * 2)
    402413    {
     
    10581069static Boolean vboxClipboardConvertToUtf8ForX11(VBOXCLIPBOARDCONTEXTX11
    10591070                                                                      *pCtx,
     1071                                                Atom *atomTarget,
    10601072                                                Atom *atomTypeReturn,
    10611073                                                XtPointer *pValReturn,
     
    11381150    LogFlowFunc (("converted string is %.*s. Returning.\n", cbDestLen, pu8DestText));
    11391151    RTMemFree(pvVBox);
    1140     *atomTypeReturn = clipGetAtom(pCtx->widget, "UTF8_STRING");
     1152    *atomTypeReturn = *atomTarget;
    11411153    *pValReturn = reinterpret_cast<XtPointer>(pu8DestText);
    11421154    *pcLenReturn = cbDestLen + 1;
     
    13361348                                                 piFormatReturn);
    13371349    case UTF8:
    1338         return vboxClipboardConvertToUtf8ForX11(pCtx, atomTypeReturn,
     1350        return vboxClipboardConvertToUtf8ForX11(pCtx, atomTarget,
     1351                                                atomTypeReturn,
    13391352                                                pValReturn, pcLenReturn,
    13401353                                                piFormatReturn);
     
    16131626/* Set the data in the simulated VBox clipboard. */
    16141627static int clipSetVBoxUtf16(VBOXCLIPBOARDCONTEXTX11 *pCtx, int retval,
    1615                             const char *pcszData)
     1628                            const char *pcszData, size_t cb)
    16161629{
    16171630    PRTUTF16 pwszData = NULL;
     
    16201633    if (RT_FAILURE(rc))
    16211634        return rc;
    1622     size_t cb = cwData * 2 + 2;
     1635    AssertReturn(cb <= cwData * 2 + 2, VERR_BUFFER_OVERFLOW);
    16231636    void *pv = RTMemDup(pwszData, cb);
    16241637    RTUtf16Free(pwszData);
     
    21442157    AssertRCReturn(rc, 1);
    21452158
    2146     /***********/
     2159    /*** Utf-8 from X11 ***/
    21472160    RTPrintf(TEST_NAME ": TESTING reading Utf-8 from X11\n");
     2161    /* Simple test */
    21482162    clipSetSelectionValues("UTF8_STRING", XA_STRING, "hello world",
    21492163                           sizeof("hello world"), 8);
    21502164    if (!testStringFromX11(pCtx, 256, "hello world", VINF_SUCCESS))
    21512165        ++cErrs;
     2166    /* Receiving buffer of the exact size needed */
    21522167    if (!testStringFromX11(pCtx, sizeof("hello world") * 2, "hello world",
    21532168                           VINF_SUCCESS))
    21542169        ++cErrs;
     2170    /* Buffer one too small */
    21552171    if (!testStringFromX11(pCtx, sizeof("hello world") * 2 - 1, "hello world",
    21562172                           VERR_BUFFER_OVERFLOW))
    21572173        ++cErrs;
     2174    /* Zero-size buffer */
    21582175    if (!testStringFromX11(pCtx, 0, "hello world", VERR_BUFFER_OVERFLOW))
    21592176        ++cErrs;
    2160     clipSetSelectionValues("UTF8_STRING", XA_STRING, "hello world\n",
    2161                            sizeof("hello world\n"), 8);
    2162     if (!testStringFromX11(pCtx, sizeof("hello world\r\n") * 2,
    2163                            "hello world\r\n", VINF_SUCCESS))
    2164         ++cErrs;
    2165     clipSetSelectionValues("UTF8_STRING", XA_STRING, "",
     2177    /* With an embedded carriage return */
     2178    clipSetSelectionValues("text/plain;charset=UTF-8", XA_STRING,
     2179                           "hello\nworld", sizeof("hello\nworld"), 8);
     2180    if (!testStringFromX11(pCtx, sizeof("hello\r\nworld") * 2,
     2181                           "hello\r\nworld", VINF_SUCCESS))
     2182        ++cErrs;
     2183    /* An empty string */
     2184    clipSetSelectionValues("text/plain;charset=utf-8", XA_STRING, "",
    21662185                           sizeof(""), 8);
    21672186    if (!testStringFromX11(pCtx, sizeof("") * 2, "", VINF_SUCCESS))
    21682187        ++cErrs;
    2169     /* This next one is Utf-8 only. */
    2170     clipSetSelectionValues("UTF8_STRING", XA_STRING,
     2188    /* With an embedded Utf-8 character. */
     2189    clipSetSelectionValues("STRING", XA_STRING,
    21712190                           "100\xE2\x82\xAC" /* 100 Euro */,
    21722191                           sizeof("100\xE2\x82\xAC"), 8);
     
    21742193                           "100\xE2\x82\xAC", VINF_SUCCESS))
    21752194        ++cErrs;
    2176 
    2177     /***********/
     2195    /* A non-zero-terminated string */
     2196    clipSetSelectionValues("TEXT", XA_STRING,
     2197                           "hello world", sizeof("hello world") - 2, 8);
     2198    if (!testStringFromX11(pCtx, sizeof("hello world") * 2 - 2,
     2199                           "hello worl", VINF_SUCCESS))
     2200        ++cErrs;
     2201
     2202    /*** COMPOUND TEXT from X11 ***/
    21782203    RTPrintf(TEST_NAME ": TESTING reading compound text from X11\n");
     2204    /* Simple test */
    21792205    clipSetSelectionValues("COMPOUND_TEXT", XA_STRING, "hello world",
    21802206                           sizeof("hello world"), 8);
    21812207    if (!testStringFromX11(pCtx, 256, "hello world", VINF_SUCCESS))
    21822208        ++cErrs;
     2209    /* Receiving buffer of the exact size needed */
    21832210    if (!testStringFromX11(pCtx, sizeof("hello world") * 2, "hello world",
    21842211                           VINF_SUCCESS))
    21852212        ++cErrs;
     2213    /* Buffer one too small */
    21862214    if (!testStringFromX11(pCtx, sizeof("hello world") * 2 - 1, "hello world",
    21872215                           VERR_BUFFER_OVERFLOW))
    21882216        ++cErrs;
     2217    /* Zero-size buffer */
    21892218    if (!testStringFromX11(pCtx, 0, "hello world", VERR_BUFFER_OVERFLOW))
    21902219        ++cErrs;
    2191     clipSetSelectionValues("COMPOUND_TEXT", XA_STRING, "hello world\n",
    2192                            sizeof("hello world\n"), 8);
    2193     if (!testStringFromX11(pCtx, sizeof("hello world\r\n") * 2,
    2194                            "hello world\r\n", VINF_SUCCESS))
    2195         ++cErrs;
     2220    /* With an embedded carriage return */
     2221    clipSetSelectionValues("COMPOUND_TEXT", XA_STRING, "hello\nworld",
     2222                           sizeof("hello\nworld"), 8);
     2223    if (!testStringFromX11(pCtx, sizeof("hello\r\nworld") * 2,
     2224                           "hello\r\nworld", VINF_SUCCESS))
     2225        ++cErrs;
     2226    /* An empty string */
    21962227    clipSetSelectionValues("COMPOUND_TEXT", XA_STRING, "",
    21972228                           sizeof(""), 8);
    21982229    if (!testStringFromX11(pCtx, sizeof("") * 2, "", VINF_SUCCESS))
    21992230        ++cErrs;
    2200 
    2201     /***********/
     2231    /* A non-zero-terminated string */
     2232    clipSetSelectionValues("COMPOUND_TEXT", XA_STRING,
     2233                           "hello world", sizeof("hello world") - 2, 8);
     2234    if (!testStringFromX11(pCtx, sizeof("hello world") * 2 - 2,
     2235                           "hello worl", VINF_SUCCESS))
     2236        ++cErrs;
     2237
     2238    /*** Latin1 from X11 ***/
    22022239    RTPrintf(TEST_NAME ": TESTING reading Latin1 from X11\n");
     2240    /* Simple test */
    22032241    clipSetSelectionValues("STRING", XA_STRING, "Georges Dupr\xEA",
    22042242                           sizeof("Georges Dupr\xEA"), 8);
    22052243    if (!testLatin1FromX11(pCtx, 256, "Georges Dupr\xEA", VINF_SUCCESS))
    22062244        ++cErrs;
     2245    /* Receiving buffer of the exact size needed */
    22072246    if (!testLatin1FromX11(pCtx, sizeof("Georges Dupr\xEA") * 2,
    22082247                           "Georges Dupr\xEA", VINF_SUCCESS))
    22092248        ++cErrs;
     2249    /* Buffer one too small */
    22102250    if (!testLatin1FromX11(pCtx, sizeof("Georges Dupr\xEA") * 2 - 1,
    22112251                           "Georges Dupr\xEA", VERR_BUFFER_OVERFLOW))
    22122252        ++cErrs;
     2253    /* Zero-size buffer */
    22132254    if (!testLatin1FromX11(pCtx, 0, "Georges Dupr\xEA", VERR_BUFFER_OVERFLOW))
    22142255        ++cErrs;
    2215     clipSetSelectionValues("TEXT", XA_STRING, "Georges Dupr\xEA\n",
    2216                            sizeof("Georges Dupr\xEA\n"), 8);
    2217     if (!testLatin1FromX11(pCtx, sizeof("Georges Dupr\xEA\r\n") * 2,
    2218                            "Georges Dupr\xEA\r\n", VINF_SUCCESS))
    2219         ++cErrs;
    2220 
    2221     /***********/
     2256    /* With an embedded carriage return */
     2257    clipSetSelectionValues("TEXT", XA_STRING, "Georges\nDupr\xEA",
     2258                           sizeof("Georges\nDupr\xEA"), 8);
     2259    if (!testLatin1FromX11(pCtx, sizeof("Georges\r\nDupr\xEA") * 2,
     2260                           "Georges\r\nDupr\xEA", VINF_SUCCESS))
     2261        ++cErrs;
     2262    /* A non-zero-terminated string */
     2263    clipSetSelectionValues("text/plain", XA_STRING,
     2264                           "Georges Dupr\xEA!",
     2265                           sizeof("Georges Dupr\xEA!") - 2, 8);
     2266    if (!testLatin1FromX11(pCtx, sizeof("Georges Dupr\xEA!") * 2 - 2,
     2267                           "Georges Dupr\xEA", VINF_SUCCESS))
     2268        ++cErrs;
     2269
     2270
     2271    /*** Timeout from X11 ***/
    22222272    RTPrintf(TEST_NAME ": TESTING X11 timeout\n");
    22232273    clipSetSelectionValues("UTF8_STRING", XT_CONVERT_FAIL, "hello world",
     
    22262276        ++cErrs;
    22272277
    2228     /***********/
     2278    /*** No data in X11 clipboard ***/
    22292279    RTPrintf(TEST_NAME ": TESTING a data request from an empty X11 clipboard\n");
    22302280    clipSetSelectionValues("UTF8_STRING", XA_STRING, NULL,
     
    22392289    }
    22402290
    2241     /***********/
     2291    /*** request for an invalid VBox format from X11 ***/
    22422292    RTPrintf(TEST_NAME ": TESTING a request for an invalid host format from X11\n");
    22432293    rc = VBoxX11ClipboardReadX11Data(pCtx, 0xffff, (void *) pc,
     
    22492299    }
    22502300
    2251     /***********/
     2301    /*** Utf-8 from VBox ***/
    22522302    RTPrintf(TEST_NAME ": TESTING reading Utf-8 from VBox\n");
    2253     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world");
     2303    /* Simple test */
     2304    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world",
     2305                     sizeof("hello world") * 2);
    22542306    if (!testStringFromVBox(pCtx, "UTF8_STRING",
    22552307                            clipGetAtom(NULL, "UTF8_STRING"),
    22562308                            "hello world", sizeof("hello world"), 8))
    22572309        ++cErrs;
    2258     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world\r\n");
    2259     if (!testStringFromVBox(pCtx, "UTF8_STRING",
    2260                             clipGetAtom(NULL, "UTF8_STRING"),
    2261                             "hello world\n", sizeof("hello world\n"), 8))
    2262         ++cErrs;
    2263     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "");
    2264     if (!testStringFromVBox(pCtx, "UTF8_STRING",
    2265                             clipGetAtom(NULL, "UTF8_STRING"),
     2310    /* With an embedded carriage return */
     2311    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello\r\nworld",
     2312                     sizeof("hello\r\nworld") * 2);
     2313    if (!testStringFromVBox(pCtx, "text/plain;charset=UTF-8",
     2314                            clipGetAtom(NULL, "text/plain;charset=UTF-8"),
     2315                            "hello\nworld", sizeof("hello\nworld"), 8))
     2316        ++cErrs;
     2317    /* An empty string */
     2318    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "", 2);
     2319    if (!testStringFromVBox(pCtx, "text/plain;charset=utf-8",
     2320                            clipGetAtom(NULL, "text/plain;charset=utf-8"),
    22662321                            "", sizeof(""), 8))
    22672322        ++cErrs;
    2268     /* This next one is Utf-8 only. */
    2269     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "100\xE2\x82\xAC" /* 100 Euro */);
    2270     if (!testStringFromVBox(pCtx, "UTF8_STRING",
    2271                             clipGetAtom(NULL, "UTF8_STRING"),
     2323    /* With an embedded Utf-8 character. */
     2324    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "100\xE2\x82\xAC" /* 100 Euro */,
     2325                     10);
     2326    if (!testStringFromVBox(pCtx, "STRING",
     2327                            clipGetAtom(NULL, "STRING"),
    22722328                            "100\xE2\x82\xAC", sizeof("100\xE2\x82\xAC"), 8))
    22732329        ++cErrs;
    2274 
    2275     /***********/
     2330    /* A non-zero-terminated string */
     2331    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world",
     2332                     sizeof("hello world") * 2 - 4);
     2333    if (!testStringFromVBox(pCtx, "TEXT",
     2334                            clipGetAtom(NULL, "TEXT"),
     2335                            "hello worl", sizeof("hello worl"), 8))
     2336        ++cErrs;
     2337
     2338    /*** COMPOUND TEXT from VBox ***/
    22762339    RTPrintf(TEST_NAME ": TESTING reading COMPOUND TEXT from VBox\n");
    2277     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world");
     2340    /* Simple test */
     2341    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world",
     2342                     sizeof("hello world") * 2);
    22782343    if (!testStringFromVBox(pCtx, "COMPOUND_TEXT",
    22792344                            clipGetAtom(NULL, "COMPOUND_TEXT"),
    22802345                            "hello world", sizeof("hello world"), 8))
    22812346        ++cErrs;
    2282     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world\r\n");
     2347    /* With an embedded carriage return */
     2348    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello\r\nworld",
     2349                     sizeof("hello\r\nworld") * 2);
    22832350    if (!testStringFromVBox(pCtx, "COMPOUND_TEXT",
    22842351                            clipGetAtom(NULL, "COMPOUND_TEXT"),
    2285                             "hello world\n", sizeof("hello world\n"), 8))
    2286         ++cErrs;
    2287     clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "");
     2352                            "hello\nworld", sizeof("hello\nworld"), 8))
     2353        ++cErrs;
     2354    /* An empty string */
     2355    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "", 2);
    22882356    if (!testStringFromVBox(pCtx, "COMPOUND_TEXT",
    22892357                            clipGetAtom(NULL, "COMPOUND_TEXT"),
    22902358                            "", sizeof(""), 8))
    22912359        ++cErrs;
    2292 
    2293     /***********/
     2360    /* A non-zero-terminated string */
     2361    clipSetVBoxUtf16(pCtx, VINF_SUCCESS, "hello world",
     2362                     sizeof("hello world") * 2 - 4);
     2363    if (!testStringFromVBox(pCtx, "COMPOUND_TEXT",
     2364                            clipGetAtom(NULL, "COMPOUND_TEXT"),
     2365                            "hello worl", sizeof("hello worl"), 8))
     2366        ++cErrs;
     2367
     2368    /*** Timeout from VBox ***/
    22942369    RTPrintf(TEST_NAME ": TESTING reading from VBox with timeout\n");
    22952370    clipEmptyVBox(pCtx, VERR_TIMEOUT);
     
    22972372        ++cErrs;
    22982373
    2299     /***********/
     2374    /*** No data in VBox clipboard ***/
    23002375    RTPrintf(TEST_NAME ": TESTING reading from VBox with no data\n");
    23012376    clipEmptyVBox(pCtx, VINF_SUCCESS);
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