VirtualBox

Changeset 3017 in kBuild


Ignore:
Timestamp:
Jan 7, 2017 12:06:03 AM (8 years ago)
Author:
bird
Message:

dir-nt-bird.c/nt_fullpath_cached: Avoid components with spaces in them.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/dir-nt-bird.c

    r2948 r3017  
    456456
    457457
    458 /* duplicated in kWorker.c */
     458/* duplicated in kWorker.c
     459 * Note! Tries avoid to produce a result with spaces since they aren't supported by makefiles.  */
    459460void nt_fullpath_cached(const char *pszPath, char *pszFull, size_t cbFull)
    460461{
     
    471472                PKFSDIR pAncestor;
    472473
    473                 pszFull[off + pPathObj->cchName] = '\0';
     474                pszFull[offEnd] = '\0';
    474475                memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName);
    475476
     
    480481                    kHlpAssert(pAncestor->Obj.cchName > 0);
    481482                    pszFull[--off] = '/';
    482                     off -= pAncestor->Obj.cchName;
    483                     kHlpAssert(pAncestor->Obj.cchParent == off);
    484                     memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
     483#ifdef KFSCACHE_CFG_SHORT_NAMES
     484                    if (   pAncestor->Obj.pszName == pAncestor->Obj.pszShortName
     485                        || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)
     486#endif
     487                    {
     488                        off -= pAncestor->Obj.cchName;
     489                        kHlpAssert(pAncestor->Obj.cchParent == off);
     490                        memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
     491                    }
     492#ifdef KFSCACHE_CFG_SHORT_NAMES
     493                    else
     494                    {
     495                        /*
     496                         * The long name constains a space, so use the alternative name instead.
     497                         * Most likely the alternative name differs in length, usually it's shorter,
     498                         * so we have to shift the part of the path we've already assembled
     499                         * accordingly.
     500                         */
     501                        KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName;
     502                        if (cchDelta != 0)
     503                        {
     504                            if ((KSIZE)(offEnd + cchDelta) >= cbFull)
     505                                goto l_fallback;
     506                            memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off);
     507                            off    += cchDelta;
     508                            offEnd += cchDelta;
     509                        }
     510                        off -= pAncestor->Obj.cchShortName;
     511                        kHlpAssert(pAncestor->Obj.cchParent == off);
     512                        memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName);
     513                    }
     514#endif
    485515                }
    486516                kFsCacheObjRelease(g_pFsCache, pPathObj);
     
    492522            if ((size_t)pPathObj->cchName + 1 < cbFull)
    493523            {
     524                /* Assume no spaces here. */
    494525                memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
    495526                pszFull[pPathObj->cchName] = '/';
     
    502533
    503534        /* do fallback. */
     535#ifdef KFSCACHE_CFG_SHORT_NAMES
     536l_fallback:
     537#endif
    504538        kHlpAssertFailed();
    505539        kFsCacheObjRelease(g_pFsCache, pPathObj);
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