VirtualBox

Changeset 95435 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 29, 2022 5:15:04 PM (3 years ago)
Author:
vboxsync
Message:

Runtime/isomaker.cpp: RRIP 1.12 mandates to set special flags in the NM entries for the current and parent directory, fixes the FreeBSD bootloader not being able to boot from re-mastered images

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/fs/isomaker.cpp

    r94291 r95435  
    642642/** Pointer to the instance data of an ISO maker output file. */
    643643typedef RTFSISOMAKEROUTPUTFILE *PRTFSISOMAKEROUTPUTFILE;
     644
     645
     646/**
     647 * Directory entry type.
     648 */
     649typedef enum RTFSISOMAKERDIRENTRY
     650{
     651    /** Invalid directory entry. */
     652    RTFSISOMAKERDIRENTRY_INVALID = 0,
     653    /** Entry for the current directory, aka ".". */
     654    RTFSISOMAKERDIRENTRY_CURRENT,
     655    /** Entry for the parent directory, aka "..". */
     656    RTFSISOMAKERDIRENTRY_PARENT,
     657    /** Entry for a regular directory entry. */
     658    RTFSISOMAKERDIRENTRY_OTHER
     659} RTFSISOMAKERDIRENTRY;
    644660
    645661
     
    58375853 *                          directory record (false).
    58385854 */
    5839 static void rtFsIosMakerOutFile_GenerateRockRidge(PRTFSISOMAKERNAME pName, uint8_t *pbSys, size_t cbSys, bool fInSpill)
     5855static void rtFsIosMakerOutFile_GenerateRockRidge(PRTFSISOMAKERNAME pName, uint8_t *pbSys, size_t cbSys, bool fInSpill,
     5856                                                  RTFSISOMAKERDIRENTRY enmEntry)
    58405857{
    58415858    /*
     
    59815998                pNM->Hdr.bVersion   = ISO9660RRIPNM_VER;
    59825999                pNM->fFlags         = cchThis == cchSrc ? 0 : ISO9660RRIP_NM_F_CONTINUE;
     6000                if (enmEntry == RTFSISOMAKERDIRENTRY_CURRENT)
     6001                    pNM->fFlags    |= ISO9660RRIP_NM_F_CURRENT;
     6002                else if (enmEntry == RTFSISOMAKERDIRENTRY_PARENT)
     6003                    pNM->fFlags    |= ISO9660RRIP_NM_F_PARENT;
    59836004                memcpy(&pNM->achName[0], pszSrc, cchThis);
    59846005                pbSys  += RT_UOFFSETOF(ISO9660RRIPNM, achName) + cchThis;
     
    61496170
    61506171        AssertReturn(cbToRead >= pChild->cbRockSpill, VERR_ISOMK_IPE_RR_READ);
    6151         rtFsIosMakerOutFile_GenerateRockRidge(pDir->pName, pbBuf, cbToRead, true /*fInSpill*/);
     6172        rtFsIosMakerOutFile_GenerateRockRidge(pDir->pName, pbBuf, cbToRead, true /*fInSpill*/, RTFSISOMAKERDIRENTRY_OTHER);
    61526173        cbToRead  -= pChild->cbRockSpill;
    61536174        pbBuf     += pChild->cbRockSpill;
     
    66586679 */
    66596680static uint32_t rtFsIsoMakerOutFile_GenerateDirRec(PRTFSISOMAKERNAME pName, bool fUnicode, uint8_t *pbBuf,
    6660                                                    PRTFSISOMAKERFINALIZEDDIRS pFinalizedDirs)
     6681                                                   PRTFSISOMAKERFINALIZEDDIRS pFinalizedDirs, RTFSISOMAKERDIRENTRY enmEntry)
    66616682{
    66626683    /*
     
    67336754            RT_BZERO(&pbSys[pName->cbRockInDirRec], cbSys - pName->cbRockInDirRec);
    67346755        if (pName->cbRockSpill == 0)
    6735             rtFsIosMakerOutFile_GenerateRockRidge(pName, pbSys, cbSys, false /*fInSpill*/);
     6756            rtFsIosMakerOutFile_GenerateRockRidge(pName, pbSys, cbSys, false /*fInSpill*/, enmEntry);
    67366757        else
    67376758        {
     
    67986819     * Normally there is just a single record without any zero padding.
    67996820     */
    6800     uint32_t cbReturn = rtFsIsoMakerOutFile_GenerateDirRec(pName, fUnicode, pbBuf, pFinalizedDirs);
     6821    uint32_t cbReturn = rtFsIsoMakerOutFile_GenerateDirRec(pName, fUnicode, pbBuf, pFinalizedDirs, RTFSISOMAKERDIRENTRY_OTHER);
    68016822    if (RT_LIKELY(pName->cbDirRecTotal == cbReturn))
    68026823        return cbReturn;
     
    68746895    uint8_t abTmpBuf[256];
    68756896    Assert(pName->cbDirRec <= sizeof(abTmpBuf));
    6876     uint32_t const cbOne = rtFsIsoMakerOutFile_GenerateDirRec(pName, fUnicode, abTmpBuf, pFinalizedDirs);
     6897    uint32_t const cbOne = rtFsIsoMakerOutFile_GenerateDirRec(pName, fUnicode, abTmpBuf, pFinalizedDirs, RTFSISOMAKERDIRENTRY_OTHER);
    68776898    Assert(cbOne == pName->cbDirRec);
    68786899    if (cbOne == pName->cbDirRecTotal)
     
    69937014    uint8_t abTmpBuf[256];
    69947015    Assert(off < pName->cbDirRec);
    6995     size_t cbToCopy = rtFsIsoMakerOutFile_GenerateDirRec(pName, fUnicode, abTmpBuf, pFinalizedDirs);
     7016    size_t cbToCopy = rtFsIsoMakerOutFile_GenerateDirRec(pName, fUnicode, abTmpBuf, pFinalizedDirs,
     7017                                                         bDirId == 0 ? RTFSISOMAKERDIRENTRY_CURRENT : RTFSISOMAKERDIRENTRY_PARENT);
    69967018    Assert(cbToCopy == pName->cbDirRec);
    69977019
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