VirtualBox

Changeset 21799 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jul 25, 2009 11:34:24 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
50402
Message:

Fixed old SSMR3Seek.

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/SSM-new.cpp

    r21797 r21799  
    28642864     */
    28652865    size_t              cbUnit = strlen(pszUnit) + 1;
    2866     AssertLogRelReturn(cbUnit > SSM_MAX_NAME_SIZE, VERR_SSM_UNIT_NOT_FOUND);
     2866    AssertLogRelReturn(cbUnit <= SSM_MAX_NAME_SIZE, VERR_SSM_UNIT_NOT_FOUND);
    28672867    char                szName[SSM_MAX_NAME_SIZE];
    28682868    SSMFILEUNITHDRV1    UnitHdr;
     
    28912891                 * Does the name match?
    28922892                 */
    2893                 if (memcmp(szName, pszUnit, cbUnit))
     2893                if (!memcmp(szName, pszUnit, cbUnit))
    28942894                {
    28952895                    pSSM->cbUnitLeftV1 = UnitHdr.cbUnit - RT_OFFSETOF(SSMFILEUNITHDR, szName[cbUnit]);
  • trunk/src/VBox/VMM/SSM.cpp

    r21787 r21799  
    13881388                            pfnProgress(pVM, 100, pvUser);
    13891389                        Log(("SSM: Successfully saved the vm state to '%s'.\n", pszFilename));
    1390                         Log(("\n\n\n"));
    1391                         DBGFR3InfoLog(pVM, "cpum", "verbose");
    1392                         DBGFR3InfoLog(pVM, "timers", NULL);
    1393                         DBGFR3InfoLog(pVM, "activetimers", NULL);
    1394                         DBGFR3InfoLog(pVM, "ioport", NULL);
    1395                         DBGFR3InfoLog(pVM, "mmio", NULL);
    1396                         DBGFR3InfoLog(pVM, "phys", NULL);
    1397                         Log(("\n\n\n"));
    13981390                        return VINF_SUCCESS;
    13991391                    }
     
    20332025            pfnProgress(pVM, 100, pvUser);
    20342026        Log(("SSM: Load of '%s' completed!\n", pszFilename));
    2035         Log(("\n\n\n"));
    2036         DBGFR3InfoLog(pVM, "cpum", "verbose");
    2037         DBGFR3InfoLog(pVM, "timers", NULL);
    2038         DBGFR3InfoLog(pVM, "activetimers", NULL);
    2039         DBGFR3InfoLog(pVM, "ioport", NULL);
    2040         DBGFR3InfoLog(pVM, "mmio", NULL);
    2041         DBGFR3InfoLog(pVM, "phys", NULL);
    2042         Log(("\n\n\n"));
    20432027    }
    20442028    return rc;
     
    22392223     * Walk the data units until we find EOF or a match.
    22402224     */
    2241     size_t  cchUnit = strlen(pszUnit) + 1;
    2242     int     rc = VINF_SUCCESS;
    2243     char   *pszName = NULL;
    2244     size_t  cchName = 0;
    2245     SSMFILEUNITHDR  UnitHdr;
     2225#define SSM_MAX_NAME_SIZE   48
     2226    size_t              cbUnit = strlen(pszUnit) + 1;
     2227    AssertLogRelReturn(cbUnit <= SSM_MAX_NAME_SIZE, VERR_SSM_UNIT_NOT_FOUND);
     2228    char                szName[SSM_MAX_NAME_SIZE];
     2229    SSMFILEUNITHDR      UnitHdr;
    22462230    for (RTFOFF off = pSSM->cbFileHdr; ; off += UnitHdr.cbUnit)
    22472231    {
     
    22492233         * Read the unit header and verify it.
    22502234         */
    2251         rc = RTFileReadAt(pSSM->File, off, &UnitHdr, RT_OFFSETOF(SSMFILEUNITHDR, szName), NULL);
    2252         AssertRC(rc);
    2253         if (RT_SUCCESS(rc))
     2235        int rc = RTFileReadAt(pSSM->File, off, &UnitHdr, RT_OFFSETOF(SSMFILEUNITHDR, szName), NULL);
     2236        AssertRCReturn(rc, rc);
     2237        if (!memcmp(&UnitHdr.achMagic[0], SSMFILEUNITHDR_MAGIC, sizeof(SSMFILEUNITHDR_MAGIC)))
    22542238        {
    2255             if (!memcmp(&UnitHdr.achMagic[0], SSMFILEUNITHDR_MAGIC, sizeof(SSMFILEUNITHDR_MAGIC)))
     2239            /*
     2240             * Does what we've got match, if so read the name.
     2241             */
     2242            if (    UnitHdr.u32Instance == iInstance
     2243                &&  UnitHdr.cchName     == cbUnit)
    22562244            {
     2245                rc = RTFileRead(pSSM->File, szName, cbUnit, NULL);
     2246                AssertRCReturn(rc, rc);
     2247                AssertLogRelMsgReturn(!szName[UnitHdr.cchName - 1],
     2248                                      (" Unit name '%.*s' was not properly terminated.\n", cbUnit, szName),
     2249                                      VERR_SSM_INTEGRITY);
     2250
    22572251                /*
    2258                  * Does it match thus far or should we just skip along?
     2252                 * Does the name match?
    22592253                 */
    2260                 if (    UnitHdr.u32Instance != iInstance
    2261                     &&  UnitHdr.cchName != cchUnit)
    2262                     continue;
    2263 
    2264                 /*
    2265                  * Read the name.
    2266                  * Adjust the name buffer first.
    2267                  */
    2268                 if (cchName < UnitHdr.cchName)
     2254                if (!memcmp(szName, pszUnit, cbUnit))
    22692255                {
    2270                     if (pszName)
    2271                         RTMemTmpFree(pszName);
    2272                     cchName = RT_ALIGN_Z(UnitHdr.cchName, 64);
    2273                     pszName = (char *)RTMemTmpAlloc(cchName);
    2274                 }
    2275                 rc = VERR_NO_MEMORY;
    2276                 if (pszName)
    2277                 {
    2278                     rc = RTFileRead(pSSM->File, pszName, UnitHdr.cchName, NULL);
    2279                     AssertRC(rc);
    2280                     if (RT_SUCCESS(rc))
    2281                     {
    2282                         if (!pszName[UnitHdr.cchName - 1])
    2283                         {
    2284                             /*
    2285                              * Does the name match? If not continue with the next item.
    2286                              */
    2287                             if (memcmp(pszName, pszUnit, cchUnit))
    2288                                 continue;
    2289 
    2290                             pSSM->rc = rc = VINF_SUCCESS;
    2291                             pSSM->cbUnitLeft = UnitHdr.cbUnit - RT_OFFSETOF(SSMFILEUNITHDR, szName[UnitHdr.cchName]);
    2292                             pSSM->offUnit = 0;
    2293                             if (piVersion)
    2294                                 *piVersion = UnitHdr.u32Version;
    2295                         }
    2296                         else
    2297                         {
    2298                             AssertMsgFailed((" Unit name '%.*s' was not properly terminated.\n", UnitHdr.cchName, pszName));
    2299                             rc = VERR_SSM_INTEGRITY;
    2300                         }
    2301                     }
    2302                 }
    2303             }
    2304             else
    2305             {
    2306                 if (!memcmp(&UnitHdr.achMagic[0], SSMFILEUNITHDR_END, sizeof(SSMFILEUNITHDR_END)))
    2307                     rc = VERR_SSM_UNIT_NOT_FOUND;
    2308                 else
    2309                 {
    2310                     AssertMsgFailed(("Invalid unit magic at offset %RTfoff, '%.*s'!\n",
    2311                                      off, sizeof(UnitHdr.achMagic) - 1, &UnitHdr.achMagic[0]));
    2312                     rc = VERR_SSM_INTEGRITY_UNIT_MAGIC;
     2256                    pSSM->cbUnitLeft = UnitHdr.cbUnit - RT_OFFSETOF(SSMFILEUNITHDR, szName[cbUnit]);
     2257                    pSSM->offUnit = 0;
     2258                    if (piVersion)
     2259                        *piVersion = UnitHdr.u32Version;
     2260                    return pSSM->rc = VINF_SUCCESS;
    23132261                }
    23142262            }
    23152263        }
    2316 
    2317         /* error or success, two continue statements cover the iterating */
    2318         break;
    2319     }
    2320 
    2321     RTMemFree(pszName);
    2322     return rc;
     2264        else if (!memcmp(&UnitHdr.achMagic[0], SSMFILEUNITHDR_END, sizeof(SSMFILEUNITHDR_END)))
     2265            return VERR_SSM_UNIT_NOT_FOUND;
     2266        else
     2267            AssertLogRelMsgFailedReturn(("Invalid unit magic at offset %RTfoff, '%.*s'!\n",
     2268                                         off, sizeof(UnitHdr.achMagic) - 1, &UnitHdr.achMagic[0]),
     2269                                        VERR_SSM_INTEGRITY_UNIT_MAGIC);
     2270    }
     2271    /* won't get here. */
    23232272}
    23242273
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette