VirtualBox

Changeset 67239 in vbox


Ignore:
Timestamp:
Jun 2, 2017 1:37:59 PM (8 years ago)
Author:
vboxsync
Message:

Main/MediumImpl: bugref:8344: use RTPathStartsWithRoot() to ensure that the medium is fully qualified. Less strict than calling RTPathAbs() but sufficient. Cosmetic changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r67237 r67239  
    30683068        {
    30693069            /* get source path and filename */
    3070             Utf8Str sourceMediumPath = i_getLocationFull();
    3071             Utf8Str sourceMediumFileName = i_getName();
     3070            Utf8Str sourcePath = i_getLocationFull();
     3071            Utf8Str sourceFName = i_getName();
    30723072
    30733073            if (aLocation.isEmpty())
     
    30803080
    30813081            /* extract destination path and filename */
    3082             Utf8Str destMediumPath(aLocation);
    3083             Utf8Str destMediumFileName(destMediumPath);
    3084             destMediumFileName.stripPath();
    3085 
    3086             Utf8Str suffix(destMediumFileName);
     3082            Utf8Str destPath(aLocation);
     3083            Utf8Str destFName(destPath);
     3084            destFName.stripPath();
     3085
     3086            Utf8Str suffix(destFName);
    30873087            suffix.stripSuffix();
    30883088
    3089             if (suffix.equals(destMediumFileName) && !destMediumFileName.isEmpty())
     3089            if (suffix.equals(destFName) && !destFName.isEmpty())
    30903090            {
    30913091                /*
    3092                  * small trick. This case means target path has no filename at the end.
    3093                  * it will look like "/path/to/new/location" or just "newname"
    3094                  * there is no backslash in the end
    3095                  * or there is no filename with extension(suffix) in the end
     3092                 * The target path has no filename: Either "/path/to/new/location" or
     3093                 * just "newname" (no trailing backslash or there is no filename with
     3094                 * extension(suffix)).
    30963095                 */
    3097 
    3098                 /* case when new path contains only "newname", no path, no extension */
    3099                 if (destMediumPath.equals(destMediumFileName))
     3096                if (destPath.equals(destFName))
    31003097                {
    3101                     Utf8Str localSuffix = RTPathSuffix(sourceMediumFileName.c_str());
    3102                     destMediumFileName.append(localSuffix);
    3103                     destMediumPath = destMediumFileName;
     3098                    /* new path contains only "newname", no path, no extension */
     3099                    destFName.append(RTPathSuffix(sourceFName.c_str()));
     3100                    destPath = destFName;
    31043101                }
    31053102                else
    31063103                {
    31073104                    /* new path looks like "/path/to/new/location" */
    3108                     destMediumFileName.setNull();
    3109                     destMediumPath.append(RTPATH_SLASH);
     3105                    destFName.setNull();
     3106                    destPath.append(RTPATH_SLASH);
    31103107                }
    31113108            }
    31123109
    3113             if (destMediumFileName.isEmpty())
     3110            if (destFName.isEmpty())
    31143111            {
    31153112                /* No target name */
    3116                 destMediumPath.append(sourceMediumFileName);
     3113                destPath.append(sourceFName);
    31173114            }
    31183115            else
    31193116            {
    3120                 if (destMediumPath.equals(destMediumFileName))
     3117                if (destPath.equals(destFName))
    31213118                {
    31223119                    /*
    3123                      * the passed target path consist of only a filename without directory
    3124                      * next move medium within the source directory with the passed new name
     3120                     * The target path contains of only a filename without a directory.
     3121                     * Move the medium within the source directory to the new name
     3122                     * (actually rename operation).
     3123                     * Scratches sourcePath!
    31253124                     */
    3126                     destMediumPath = sourceMediumPath.stripFilename().append(RTPATH_SLASH).append(destMediumFileName);
     3125                    destPath = sourcePath.stripFilename().append(RTPATH_SLASH).append(destFName);
    31273126                }
    31283127                suffix = i_getFormat();
    3129 
    31303128                if (suffix.compare("RAW", Utf8Str::CaseInsensitive) == 0)
    31313129                {
     
    31403138                    }
    31413139                }
    3142                 /* set the target extension like on the source. Any conversions are prohibited */
     3140                /* Set the target extension like on the source. Any conversions are prohibited */
    31433141                suffix.toLower();
    3144                 destMediumPath.stripSuffix().append('.').append(suffix);
    3145             }
    3146 
    3147             if (i_isMediumFormatFile())
    3148             {
    3149                 /* Path must be absolute */
    3150                 char *pszAbs = RTPathAbsDup(destMediumPath.c_str());
    3151                 int iCmp = destMediumPath.compare(pszAbs, Utf8Str::CaseInsensitive);
    3152                 RTStrFree(pszAbs);
    3153                 if (iCmp)
    3154                 {
    3155                     rc = setError(VBOX_E_FILE_ERROR,
    3156                                   tr("The given target path '%s' is not absolute"),
    3157                                   destMediumPath.c_str());
    3158                     throw rc;
    3159                 }
    3160                 /* Check path for a new file object */
    3161                 rc = VirtualBox::i_ensureFilePathExists(destMediumPath, true);
    3162                 if (FAILED(rc))
    3163                     throw rc;
    3164             }
    3165             else
     3142                destPath.stripSuffix().append('.').append(suffix);
     3143            }
     3144
     3145            if (!i_isMediumFormatFile())
    31663146            {
    31673147                rc = setError(VERR_NOT_A_FILE,
    3168                            tr("Medium '%s' isn't a file object. \"Move\" operation isn't supported."),
    3169                            i_getLocationFull().c_str());
     3148                              tr("Medium '%s' isn't a file object. \"Move\" operation isn't supported."),
     3149                              i_getLocationFull().c_str());
    31703150                throw rc;
    31713151            }
     3152            /* Path must be absolute */
     3153            if (!RTPathStartsWithRoot(destPath.c_str()))
     3154            {
     3155                rc = setError(VBOX_E_FILE_ERROR,
     3156                              tr("The given path '%s' is not fully qualified"),
     3157                              destPath.c_str());
     3158                throw rc;
     3159            }
     3160            /* Check path for a new file object */
     3161            rc = VirtualBox::i_ensureFilePathExists(destPath, true);
     3162            if (FAILED(rc))
     3163                throw rc;
    31723164
    31733165            /* Set needed variables for "moving" procedure. It'll be used later in separate thread task */
    3174             rc = i_preparationForMoving(destMediumPath);
     3166            rc = i_preparationForMoving(destPath);
    31753167            if (FAILED(rc))
    31763168            {
     
    32093201                {
    32103202                    rc = setError(VERR_VM_UNEXPECTED_VM_STATE,
    3211                                   tr("At least VM '%s' to whom this medium '%s' attached has the opened session now. "
    3212                                      "Stop all needed VM before set a new location."),
     3203                                  tr("At least the VM '%s' to whom this medium '%s' attached has currently an opened session. Stop all VMs before relocating this medium"),
    32133204                                  id.toString().c_str(),
    32143205                                  i_getLocationFull().c_str());
     
    32793270    else
    32803271    {
    3281         if (pTask != NULL)
     3272        if (pTask)
    32823273            delete pTask;
    32833274    }
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