VirtualBox

Changeset 89230 in vbox


Ignore:
Timestamp:
May 23, 2021 1:21:26 AM (4 years ago)
Author:
vboxsync
Message:

AudioTest: Don't take the RTSystemQueryOSInfo status code dead serious, it's a robust API, overflows can happen whatever buffer size you give it (it was toooo small). Just use the filename buffer, it's a lot bigger. bugref:10008

Location:
trunk/src/VBox/Devices/Audio
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/AudioTest.cpp

    r89139 r89230  
    334334static int audioTestManifestWriteV(PAUDIOTESTSET pSet, const char *pszFormat, va_list args)
    335335{
     336    /** @todo r=bird: Use RTStrmOpen + RTStrmPrintf instead of this slow
     337     *        do-it-all-yourself stuff. */
    336338    char *psz = NULL;
    337339    if (RTStrAPrintfV(&psz, pszFormat, args) == -1)
     
    396398
    397399    /** @todo Keep it as simple as possible for now. Improve this later. */
    398     int rc = audioTestManifestWrite(pSet, "[");
    399     AssertRC(rc);
    400 
    401     rc = audioTestManifestWriteV(pSet, pszSection, va);
    402     AssertRC(rc);
    403 
    404     rc = audioTestManifestWrite(pSet, "]\n");
    405     AssertRC(rc);
     400    int rc = audioTestManifestWrite(pSet, "[%N]", pszSection, &va);
    406401
    407402    va_end(va);
     
    604599 * @returns VBox status code.
    605600 * @param   pSet                Test set to create.
    606  * @param   pszPath             Absolute path to use for the test set's temporary directory.
    607  *                              If NULL, the OS' temporary directory will be used.
     601 * @param   pszPath             Where to store the set set data.  If NULL, the
     602 *                              temporary directory will be used.
    608603 * @param   pszTag              Tag name to use for this test set.
    609604 */
     
    615610    AssertRCReturn(rc, rc);
    616611
     612    /*
     613     * Test set directory.
     614     */
    617615    if (pszPath)
    618616    {
    619         rc = RTStrCopy(pSet->szPathAbs, sizeof(pSet->szPathAbs), pszPath);
     617        rc = RTPathAbs(pszPath, pSet->szPathAbs, sizeof(pSet->szPathAbs));
    620618        AssertRCReturn(rc, rc);
    621619
     
    626624    AssertRCReturn(rc, rc);
    627625
    628     if (RT_SUCCESS(rc))
    629     {
    630         char szManifest[RTPATH_MAX];
    631         rc = RTStrCopy(szManifest, sizeof(szManifest), pSet->szPathAbs);
    632         AssertRCReturn(rc, rc);
    633 
    634         rc = RTPathAppend(szManifest, sizeof(szManifest), AUDIOTEST_MANIFEST_FILE_STR);
    635         AssertRCReturn(rc, rc);
    636 
    637         rc = RTFileOpen(&pSet->f.hFile, szManifest,
    638                         RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE);
    639         AssertRCReturn(rc, rc);
    640 
    641         rc = audioTestManifestWriteSectionHdr(pSet, "header");
    642         AssertRCReturn(rc, rc);
    643 
    644         rc = audioTestManifestWrite(pSet, "magic=vkat_ini\n"); /* VKAT Manifest, .INI-style. */
    645         AssertRCReturn(rc, rc);
    646         rc = audioTestManifestWrite(pSet, "ver=%d\n", AUDIOTEST_MANIFEST_VER);
    647         AssertRCReturn(rc, rc);
    648         rc = audioTestManifestWrite(pSet, "tag=%s\n", pSet->szTag);
    649         AssertRCReturn(rc, rc);
    650 
    651         char szVal[64];
    652         RTTIMESPEC time;
    653         if (!RTTimeSpecToString(RTTimeNow(&time), szVal, sizeof(szVal)))
    654             AssertFailedReturn(VERR_BUFFER_OVERFLOW);
    655 
    656         rc = audioTestManifestWrite(pSet, "date_created=%s\n", szVal);
    657         AssertRCReturn(rc, rc);
    658 
    659         rc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szVal, sizeof(szVal));
    660         AssertRCReturn(rc, rc);
    661         rc = audioTestManifestWrite(pSet, "os_product=%s\n", szVal);
    662         AssertRCReturn(rc, rc);
    663         rc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szVal, sizeof(szVal));
    664         AssertRCReturn(rc, rc);
    665         rc = audioTestManifestWrite(pSet, "os_rel=%s\n", szVal);
    666         AssertRCReturn(rc, rc);
    667         rc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szVal, sizeof(szVal));
    668         AssertRCReturn(rc, rc);
    669         rc = audioTestManifestWrite(pSet, "os_ver=%s\n", szVal);
    670         AssertRCReturn(rc, rc);
    671         rc = audioTestManifestWrite(pSet, "vbox_ver=%s r%u %s (%s %s)\n",
    672                                       VBOX_VERSION_STRING, RTBldCfgRevision(),
    673                                       RTBldCfgTargetDotArch(), __DATE__, __TIME__);
    674         AssertRCReturn(rc, rc);
    675 
    676         rc = audioTestManifestWrite(pSet, "test_count=");
    677         AssertRCReturn(rc, rc);
    678         pSet->offTestCount = audioTestManifestGetOffsetAbs(pSet);
    679         rc = audioTestManifestWrite(pSet, "0000\n"); /* A bit messy, but does the trick for now. */
    680         AssertRCReturn(rc, rc);
    681 
    682         pSet->enmMode = AUDIOTESTSETMODE_TEST;
    683     }
     626    /*
     627     * Create the manifest file.
     628     */
     629    char szTmp[RTPATH_MAX];
     630    rc = RTPathJoin(szTmp, sizeof(szTmp), pSet->szPathAbs, AUDIOTEST_MANIFEST_FILE_STR);
     631    AssertRCReturn(rc, rc);
     632
     633    rc = RTFileOpen(&pSet->f.hFile, szTmp, RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE);
     634    AssertRCReturn(rc, rc);
     635
     636    rc = audioTestManifestWriteSectionHdr(pSet, "header");
     637    AssertRCReturn(rc, rc);
     638
     639    rc = audioTestManifestWrite(pSet, "magic=vkat_ini\n"); /* VKAT Manifest, .INI-style. */
     640    AssertRCReturn(rc, rc);
     641    rc = audioTestManifestWrite(pSet, "ver=%d\n", AUDIOTEST_MANIFEST_VER);
     642    AssertRCReturn(rc, rc);
     643    rc = audioTestManifestWrite(pSet, "tag=%s\n", pSet->szTag);
     644    AssertRCReturn(rc, rc);
     645
     646    AssertCompile(sizeof(szTmp) > RTTIME_STR_LEN);
     647    RTTIMESPEC Now;
     648    rc = audioTestManifestWrite(pSet, "date_created=%s\n", RTTimeSpecToString(RTTimeNow(&Now), szTmp, sizeof(szTmp)));
     649    AssertRCReturn(rc, rc);
     650
     651    RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp)); /* do NOT return on failure. */
     652    rc = audioTestManifestWrite(pSet, "os_product=%s\n", szTmp);
     653    AssertRCReturn(rc, rc);
     654
     655    RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp)); /* do NOT return on failure. */
     656    rc = audioTestManifestWrite(pSet, "os_rel=%s\n", szTmp);
     657    AssertRCReturn(rc, rc);
     658
     659    RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp)); /* do NOT return on failure. */
     660    rc = audioTestManifestWrite(pSet, "os_ver=%s\n", szTmp);
     661    AssertRCReturn(rc, rc);
     662
     663    rc = audioTestManifestWrite(pSet, "vbox_ver=%s r%u %s (%s %s)\n",
     664                                VBOX_VERSION_STRING, RTBldCfgRevision(), RTBldCfgTargetDotArch(), __DATE__, __TIME__);
     665    AssertRCReturn(rc, rc);
     666
     667    rc = audioTestManifestWrite(pSet, "test_count=");
     668    AssertRCReturn(rc, rc);
     669    pSet->offTestCount = audioTestManifestGetOffsetAbs(pSet);
     670    rc = audioTestManifestWrite(pSet, "0000\n"); /* A bit messy, but does the trick for now. */
     671    AssertRCReturn(rc, rc);
     672
     673    pSet->enmMode = AUDIOTESTSETMODE_TEST;
    684674
    685675    return rc;
  • trunk/src/VBox/Devices/Audio/AudioTest.h

    r89139 r89230  
    232232    union
    233233    {
     234        /** @todo r=bird: RTSTREAM not RTFILE.  That means you don't have to check
     235         *        every write status code and it's buffered and thus faster.  Also,
     236         *        you don't have to re-invent fprintf-style RTFileWrite wrappers. */
    234237        RTFILE       hFile;
    235238        RTINIFILE    hIniFile;
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