VirtualBox

Changeset 54645 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Mar 5, 2015 12:12:41 PM (10 years ago)
Author:
vboxsync
Message:

Encryption/Main: Allow encryption of differencing media as long as there are no branches in the image chain and no image is used by multiple virtual machines

Location:
trunk/src/VBox/Main
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/MediumImpl.h

    r54591 r54645  
    145145    HRESULT i_createMediumLockList(bool fFailIfInaccessible,
    146146                                   bool fMediumLockWrite,
     147                                   bool fMediumLockWriteAll,
    147148                                   Medium *pToBeParent,
    148149                                   MediumLockList &mediumLockList);
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r54177 r54645  
    38443844                        rc = medium->i_createMediumLockList(true /* fFailIfInaccessible */,
    38453845                                                            true /* fMediumLockWrite */,
     3846                                                            false /* fMediumLockWriteAll */,
    38463847                                                            NULL,
    38473848                                                            *pMediumLockList);
     
    39413942                                rc = medium->i_createMediumLockList(true /* fFailIfInaccessible */,
    39423943                                                                    true /* fMediumLockWrite */,
     3944                                                                    false /* fMediumLockWriteAll */,
    39433945                                                                    NULL,
    39443946                                                                    *pMediumLockList);
     
    41074109        rc = diff->i_createMediumLockList(true /* fFailIfInaccessible */,
    41084110                                          true /* fMediumLockWrite */,
     4111                                          false /* fMediumLockWriteAll */,
    41094112                                          medium,
    41104113                                          *pMediumLockList);
     
    42104213            rc = medium->i_createMediumLockList(true /* fFailIfInaccessible */,
    42114214                                                true /* fMediumLockWrite */,
     4215                                                false /* fMediumLockWriteAll */,
    42124216                                                NULL,
    42134217                                                *pMediumLockList);
     
    1050810512                    rc = pMedium->i_createMediumLockList(true /* fFailIfInaccessible */,
    1050910513                                                         false /* fMediumLockWrite */,
     10514                                                         false /* fMediumLockWriteAll */,
    1051010515                                                         NULL,
    1051110516                                                         *pMediumLockList);
     
    1075910764                    rc = pMedium->i_createMediumLockList(true /* fFailIfInaccessible */,
    1076010765                                                         false /* fMediumLockWrite */,
     10766                                                         false /* fMediumLockWriteAll */,
    1076110767                                                         NULL,
    1076210768                                                         *pMediumLockList);
     
    1403614042            mrc = pMedium->i_createMediumLockList(fIsVitalImage /* fFailIfInaccessible */,
    1403714043                                                  !fIsReadOnlyLock /* fMediumLockWrite */,
     14044                                                  false /* fMediumLockWriteAll */,
    1403814045                                                  NULL,
    1403914046                                                  *pMediumLockList);
  • trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp

    r54438 r54645  
    684684        rc = diff->i_createMediumLockList(true /* fFailIfInaccessible */,
    685685                                          true /* fMediumLockWrite */,
     686                                          false /* fMediumLockWriteAll */,
    686687                                          pParent,
    687688                                          *pMediumLockList);
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r54625 r54645  
    25582558    alock.release();
    25592559    HRESULT rc = diff->i_createMediumLockList(true /* fFailIfInaccessible */,
    2560                                             true /* fMediumLockWrite */,
    2561                                             this,
    2562                                             *pMediumLockList);
     2560                                              true /* fMediumLockWrite */,
     2561                                              false /* fMediumLockWriteAll */,
     2562                                              this,
     2563                                              *pMediumLockList);
    25632564    alock.acquire();
    25642565    if (FAILED(rc))
     
    26982699        rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    26992700                                    false /* fMediumLockWrite */,
     2701                                    false /* fMediumLockWriteAll */,
    27002702                                    NULL,
    27012703                                    *pSourceMediumLockList);
     
    27122714        rc = pTarget->i_createMediumLockList(true /* fFailIfInaccessible */,
    27132715                                             true /* fMediumLockWrite */,
     2716                                             false /* fMediumLockWriteAll */,
    27142717                                             pParent,
    27152718                                             *pTargetMediumLockList);
     
    28262829        rc = i_createMediumLockList(true /* fFailIfInaccessible */ ,
    28272830                                    true /* fMediumLockWrite */,
     2831                                    false /* fMediumLockWriteAll */,
    28282832                                    NULL,
    28292833                                    *pMediumLockList);
     
    28952899        rc = i_createMediumLockList(true /* fFailIfInaccessible */ ,
    28962900                                    true /* fMediumLockWrite */,
     2901                                    false /* fMediumLockWriteAll */,
    28972902                                    NULL,
    28982903                                    *pMediumLockList);
     
    29772982        rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    29782983                                    true /* fMediumLockWrite */,
     2984                                    false /* fMediumLockWriteAll */,
    29792985                                    NULL,
    29802986                                    *pMediumLockList);
     
    30493055                            m->strLocationFull.c_str());
    30503056
    3051         /* Cannot encrypt child media so far. */
    3052         if (m->pParent)
    3053             return setError(VBOX_E_INVALID_OBJECT_STATE,
    3054                             tr("Cannot encrypt medium '%s' because it is a differencing medium"),
    3055                             m->strLocationFull.c_str());
    3056 
    30573057        /* Cannot encrypt media which are attached to more than one virtual machine. */
    30583058        if (m->backRefs.size() > 1)
     
    30713071        rc = i_createMediumLockList(true /* fFailIfInaccessible */ ,
    30723072                                    true /* fMediumLockWrite */,
     3073                                    true /* fMediumLockAllWrite */,
    30733074                                    NULL,
    30743075                                    *pMediumLockList);
     
    30873088            delete pMediumLockList;
    30883089            throw setError(rc,
    3089                            tr("Failed to lock media when compacting '%s'"),
     3090                           tr("Failed to lock media for encryption '%s'"),
    30903091                           i_getLocationFull().c_str());
     3092        }
     3093
     3094        /*
     3095         * Check all media in the chain to not contain any branches or references to
     3096         * other virtual machines, we support encrypting only a list of differencing media at the moment.
     3097         */
     3098        MediumLockList::Base::const_iterator mediumListBegin = pMediumLockList->GetBegin();
     3099        MediumLockList::Base::const_iterator mediumListEnd = pMediumLockList->GetEnd();
     3100        for (MediumLockList::Base::const_iterator it = mediumListBegin;
     3101             it != mediumListEnd;
     3102             ++it)
     3103        {
     3104            const MediumLock &mediumLock = *it;
     3105            const ComObjPtr<Medium> &pMedium = mediumLock.GetMedium();
     3106            AutoReadLock mediumReadLock(pMedium COMMA_LOCKVAL_SRC_POS);
     3107
     3108            Assert(pMedium->m->state == MediumState_LockedWrite);
     3109
     3110            if (pMedium->m->backRefs.size() > 1)
     3111            {
     3112                rc = setError(VBOX_E_INVALID_OBJECT_STATE,
     3113                              tr("Cannot encrypt medium '%s' because it is attached to %d virtual machines"),
     3114                              pMedium->m->strLocationFull.c_str(), pMedium->m->backRefs.size());
     3115                break;
     3116            }
     3117            else if (pMedium->m->llChildren.size() > 1)
     3118            {
     3119                rc = setError(VBOX_E_INVALID_OBJECT_STATE,
     3120                              tr("Cannot encrypt medium '%s' because it has %d children"),
     3121                              pMedium->m->strLocationFull.c_str(), pMedium->m->llChildren.size());
     3122                break;
     3123            }
     3124        }
     3125
     3126        if (FAILED(rc))
     3127        {
     3128            delete pMediumLockList;
     3129            throw rc;
    30913130        }
    30923131
     
    30943133        rc = pProgress->init(m->pVirtualBox,
    30953134                             static_cast <IMedium *>(this),
    3096                              BstrFmt(tr("Compacting medium '%s'"), m->strLocationFull.c_str()).raw(),
     3135                             BstrFmt(tr("Encrypting medium '%s'"), m->strLocationFull.c_str()).raw(),
    30973136                             TRUE /* aCancelable */);
    30983137        if (FAILED(rc))
     
    39423981 *          inaccessible media are silently skipped and not locked (i.e. their state remains "Inaccessible");
    39433982 *          this is necessary for a VM's removable media VM startup for which we do not want to fail.
    3944  * @param fMediumLockWrite  Whether to associate a write lock with this medium.
    3945  * @param pToBeParent       Medium which will become the parent of this medium.
    3946  * @param mediumLockList    Where to store the resulting list.
     3983 * @param fMediumLockWrite     Whether to associate a write lock with this medium.
     3984 * @param fMediumLockWriteAll  Whether to associate a write lock to all other media too.
     3985 * @param pToBeParent          Medium which will become the parent of this medium.
     3986 * @param mediumLockList       Where to store the resulting list.
    39473987 */
    39483988HRESULT Medium::i_createMediumLockList(bool fFailIfInaccessible,
    39493989                                       bool fMediumLockWrite,
     3990                                       bool fMediumLockWriteAll,
    39503991                                       Medium *pToBeParent,
    39513992                                       MediumLockList &mediumLockList)
     
    40154056            mediumLockList.Prepend(pMedium, fMediumLockWrite);
    40164057        else
    4017             mediumLockList.Prepend(pMedium, false);
     4058            mediumLockList.Prepend(pMedium, fMediumLockWriteAll);
    40184059
    40194060        pMedium = pMedium->i_getParent();
     
    43804421        rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    43814422                                    true /* fMediumLockWrite */,
     4423                                    false /* fMediumLockWriteAll */,
    43824424                                    NULL,
    43834425                                    *pMediumLockList);
     
    47424784            rc = pTarget->i_createMediumLockList(true /* fFailIfInaccessible */,
    47434785                                                 true /* fMediumLockWrite */,
     4786                                                 false /* fMediumLockWriteAll */,
    47444787                                                 NULL,
    47454788                                                 *aMediumLockList);
     
    47474790            rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    47484791                                        false /* fMediumLockWrite */,
     4792                                        false /* fMediumLockWriteAll */,
    47494793                                        NULL,
    47504794                                        *aMediumLockList);
     
    51875231    HRESULT rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    51885232                                        false /* fMediumLockWrite */,
     5233                                        false /* fMediumLockWriteAll */,
    51895234                                        this,
    51905235                                        mediumLockList);
     
    53005345        rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    53015346                                    false /* fMediumLockWrite */,
     5347                                    false /* fMediumLockWriteAll */,
    53025348                                    NULL,
    53035349                                    *pSourceMediumLockList);
     
    53915437        rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    53925438                                    true /* fMediumLockWrite */,
     5439                                    false /* fMediumLockWriteAll */,
    53935440                                    aParent,
    53945441                                    *pTargetMediumLockList);
     
    54905537        rc = i_createMediumLockList(true /* fFailIfInaccessible */,
    54915538                                    false /* fMediumLockWrite */,
     5539                                    false /* fMediumLockWriteAll */,
    54925540                                    NULL,
    54935541                                    *pSourceMediumLockList);
     
    55045552        rc = aTarget->i_createMediumLockList(true /* fFailIfInaccessible */,
    55055553                                             true /* fMediumLockWrite */,
     5554                                             false /* fMediumLockWriteAll */,
    55065555                                             aParent,
    55075556                                             *pTargetMediumLockList);
     
    88048853        Medium::CryptoFilterSettings CryptoSettingsWrite;
    88058854
     8855        ComObjPtr<Medium> pBase = i_getBase();
     8856
    88068857        uint8_t *pbDek = NULL;
    88078858        size_t cbDek = 0;
     
    88188869                 * configured is existing.
    88198870                 */
    8820                 settings::StringsMap::iterator it = m->mapProperties.find("CRYPT/KeyStore");
    8821                 if (it != m->mapProperties.end())
     8871                settings::StringsMap::iterator it = pBase->m->mapProperties.find("CRYPT/KeyStore");
     8872                if (it != pBase->m->mapProperties.end())
    88228873                    throw setError(VBOX_E_INVALID_OBJECT_STATE,
    88238874                                   tr("The password given for the encrypted image is incorrect"));
     
    88258876            else
    88268877            {
    8827                 settings::StringsMap::iterator it = m->mapProperties.find("CRYPT/KeyStore");
    8828                 if (it == m->mapProperties.end())
     8878                settings::StringsMap::iterator it = pBase->m->mapProperties.find("CRYPT/KeyStore");
     8879                if (it == pBase->m->mapProperties.end())
    88298880                    throw setError(VBOX_E_INVALID_OBJECT_STATE,
    88308881                                   tr("The image is not configured for encryption"));
     
    88778928                AutoReadLock alock(pMedium COMMA_LOCKVAL_SRC_POS);
    88788929
    8879                 /* sanity check */
    8880                 if (it == mediumListLast)
    8881                     Assert(pMedium->m->state == MediumState_LockedWrite);
    8882                 else
    8883                     Assert(pMedium->m->state == MediumState_LockedRead);
     8930                Assert(pMedium->m->state == MediumState_LockedWrite);
    88848931
    88858932                /* Open all media but last in read-only mode. Do not handle
     
    89138960            thisLock.acquire();
    89148961            /* If everything went well set the new key store. */
    8915             settings::StringsMap::iterator it = m->mapProperties.find("CRYPT/KeyStore");
    8916             if (it != m->mapProperties.end())
    8917                 m->mapProperties.erase(it);
    8918 
    8919             it = m->mapProperties.find("CRYPT/KeyId");
    8920             if (it != m->mapProperties.end())
    8921                 m->mapProperties.erase(it);
     8962            settings::StringsMap::iterator it = pBase->m->mapProperties.find("CRYPT/KeyStore");
     8963            if (it != pBase->m->mapProperties.end())
     8964                pBase->m->mapProperties.erase(it);
     8965
     8966            it = pBase->m->mapProperties.find("CRYPT/KeyId");
     8967            if (it != pBase->m->mapProperties.end())
     8968                pBase->m->mapProperties.erase(it);
    89228969
    89238970            if (CryptoSettingsWrite.pszKeyStore)
    89248971            {
    8925                 m->mapProperties["CRYPT/KeyStore"] = Utf8Str(CryptoSettingsWrite.pszKeyStore);
    8926                 m->mapProperties["CRYPT/KeyId"] = task.mstrNewPasswordId;
     8972                pBase->m->mapProperties["CRYPT/KeyStore"] = Utf8Str(CryptoSettingsWrite.pszKeyStore);
     8973                pBase->m->mapProperties["CRYPT/KeyId"] = task.mstrNewPasswordId;
    89278974            }
    89288975
    89298976            thisLock.release();
    8930             i_markRegistriesModified();
     8977            pBase->i_markRegistriesModified();
    89318978            m->pVirtualBox->i_saveModifiedRegistries();
    89328979        }
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