VirtualBox

Changeset 74646 in vbox for trunk/src


Ignore:
Timestamp:
Oct 6, 2018 9:03:45 PM (6 years ago)
Author:
vboxsync
Message:

IPRT: More adjustments to the LX and Mach-O loader code from kStuff. bugref:9232

Location:
trunk/src/VBox/Runtime
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/ldr/ldrLX.cpp

    r74645 r74646  
    213213    /* Verify the loader section. */
    214214    offEnd = Hdr.e32_objtab + Hdr.e32_ldrsize;
    215     if (Hdr.e32_objtab < sizeof(Hdr))
    216         return VERR_LDRLX_BAD_LOADER_SECTION;
     215    if (Hdr.e32_objtab < sizeof(Hdr) && Hdr.e32_objcnt)
     216        return RTErrInfoSetF(pErrInfo, VERR_LDRLX_BAD_LOADER_SECTION,
     217                             "Object table is inside the header: %#x", Hdr.e32_objtab);
    217218    off = Hdr.e32_objtab + sizeof(struct o32_obj) * Hdr.e32_objcnt;
    218219    if (off > offEnd)
    219         return VERR_LDRLX_BAD_LOADER_SECTION;
     220        return RTErrInfoSetF(pErrInfo, VERR_LDRLX_BAD_LOADER_SECTION,
     221                             "Object table spans beyond the executable: e32_objcnt=%u", Hdr.e32_objcnt);
    220222    if (    Hdr.e32_objmap
    221223        &&  (Hdr.e32_objmap < off || Hdr.e32_objmap > offEnd))
    222         return VERR_LDRLX_BAD_LOADER_SECTION;
     224        return RTErrInfoSetF(pErrInfo, VERR_LDRLX_BAD_LOADER_SECTION,
     225                             "Bad object page map table offset: %#x", Hdr.e32_objmap);
    223226    if (    Hdr.e32_rsrccnt
    224227        && (   Hdr.e32_rsrctab < off
    225228            || Hdr.e32_rsrctab > offEnd
    226229            || Hdr.e32_rsrctab + sizeof(struct rsrc32) * Hdr.e32_rsrccnt > offEnd))
    227         return VERR_LDRLX_BAD_LOADER_SECTION;
     230        return RTErrInfoSetF(pErrInfo, VERR_LDRLX_BAD_LOADER_SECTION,
     231                             "Resource table is out of bounds: %#x entries at %#x", Hdr.e32_rsrccnt, Hdr.e32_rsrctab);
    228232    if (    Hdr.e32_restab
    229233        &&  (Hdr.e32_restab < off || Hdr.e32_restab > offEnd - 2))
     
    510514    KLDRMODLX_ASSERT(!pModLX->pvMapping);
    511515
    512     int rc = VINF_SUCCESS;
    513     if (pModLX->Core.pReader)
    514     {
    515         rc = pModLX->Core.pReader->pfnDestroy(pModLX->Core.pReader);
    516         pModLX->Core.pReader = NULL;
    517     }
    518516    if (pModLX->pbNonResNameTab)
    519517    {
     
    526524        pModLX->pbFixupSection = NULL;
    527525    }
    528     pModLX->Core.u32Magic = 0;
    529     pModLX->Core.pOps = NULL;
    530     RTMemFree(pModLX);
    531     return rc;
     526    return VINF_SUCCESS;
    532527}
    533528
  • trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp

    r74643 r74646  
    199199
    200200    /** The image UUID, all zeros if not found. */
    201     uint32_t                abImageUuid[16];
     201    uint8_t                 abImageUuid[16];
    202202
    203203    /** The RVA of the Global Offset Table. */
     
    230230static int  kldrModMachOPreParseLoadCommands(uint8_t *pbLoadCommands, const mach_header_32_t *pHdr, PRTLDRREADER pRdr, RTFOFF   offImage,
    231231                                             uint32_t fOpenFlags, uint32_t *pcSegments, uint32_t *pcSections, uint32_t *pcbStringPool,
    232                                              bool *pfCanLoad, PRTLDRADDR pLinkAddress, uint8_t *puEffFileType);
     232                                             bool *pfCanLoad, PRTLDRADDR pLinkAddress, uint8_t *puEffFileType, PRTERRINFO pErrInfo);
    233233static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pThis, char *pbStringPool, uint32_t cbStringPool);
    234234
     
    344344    if (RT_SUCCESS(rc))
    345345        rc = kldrModMachOPreParseLoadCommands(pbLoadCommands, &s.Hdr32, pRdr, offImage, fOpenFlags,
    346                                               &cSegments, &cSections, &cbStringPool, &fCanLoad, &LinkAddress, &uEffFileType);
     346                                              &cSegments, &cSections, &cbStringPool, &fCanLoad, &LinkAddress, &uEffFileType,
     347                                              pErrInfo);
    347348    if (RT_FAILURE(rc))
    348349    {
     
    510511 * @param   fOpenFlags      RTLDR_O_XXX.
    511512 * @param   pcSegments      Where to store the segment count.
    512  * @param   pcSegments      Where to store the section count.
     513 * @param   pcSections      Where to store the section count.
    513514 * @param   pcbStringPool   Where to store the string pool size.
    514515 * @param   pfCanLoad       Where to store the can-load-image indicator.
     
    516517 *                          lowest segment address).
    517518 * @param   puEffFileType   Where to store the effective file type.
     519 * @param   pErrInfo        Where to return additional error info. Optional.
    518520 */
    519521static int kldrModMachOPreParseLoadCommands(uint8_t *pbLoadCommands, const mach_header_32_t *pHdr, PRTLDRREADER pRdr,
    520522                                            RTFOFF offImage, uint32_t fOpenFlags, uint32_t *pcSegments, uint32_t *pcSections,
    521523                                            uint32_t *pcbStringPool, bool *pfCanLoad, PRTLDRADDR pLinkAddress,
    522                                             uint8_t *puEffFileType)
     524                                            uint8_t *puEffFileType, PRTERRINFO pErrInfo)
    523525{
    524526    union
     
    598600
    599601                /* Validation code shared with the 64-bit variant. */
    600                 #define VALIDATE_AND_ADD_SEGMENT(a_cBits) \
     602#define VALIDATE_AND_ADD_SEGMENT(a_cBits) \
    601603                do { \
    602604                    bool fSkipSeg = !strcmp(pSrcSeg->segname, "__DWARF")   /* Note: Not for non-object files. */ \
     
    10051007                /** @todo valid command size. */
    10061008                if (!(fOpenFlags & RTLDR_O_FOR_DEBUG))
    1007                     KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNSUPPORTED_LOAD_COMMAND);
     1009                    KLDRMODMACHO_FAILED_RETURN(RTErrInfoSetF(pErrInfo, VERR_LDRMACHO_UNSUPPORTED_LOAD_COMMAND,
     1010                                                             "cmd=%#x", u.pLoadCmd->cmd));
    10081011                *pfCanLoad = false;
    10091012                break;
     
    10231026            case LC_PREBIND_CKSUM:
    10241027            case LC_SYMSEG:
    1025                 KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNSUPPORTED_LOAD_COMMAND);
     1028                KLDRMODMACHO_FAILED_RETURN(RTErrInfoSetF(pErrInfo, VERR_LDRMACHO_UNSUPPORTED_LOAD_COMMAND,
     1029                                                         "cmd=%#x", u.pLoadCmd->cmd));
    10261030
    10271031            default:
    1028                 KLDRMODMACHO_FAILED_RETURN(VERR_LDRMACHO_UNKNOWN_LOAD_COMMAND);
     1032                KLDRMODMACHO_FAILED_RETURN(RTErrInfoSetF(pErrInfo, VERR_LDRMACHO_UNKNOWN_LOAD_COMMAND,
     1033                                                         "cmd=%#x", u.pLoadCmd->cmd));
    10291034        }
    10301035    }
     
    14181423{
    14191424    PKLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, KLDRMODMACHO, Core);
    1420     int rc = VINF_SUCCESS;
    14211425    KLDRMODMACHO_ASSERT(!pThis->pvMapping);
    14221426
     
    14321436    }
    14331437
    1434     if (pThis->Core.pReader)
    1435     {
    1436         rc = pThis->Core.pReader->pfnDestroy(pThis->Core.pReader);
    1437         pThis->Core.pReader = NULL;
    1438     }
    1439     pThis->Core.u32Magic = 0;
    1440     pThis->Core.pOps = NULL;
    14411438    RTMemFree(pThis->pbLoadCommands);
    14421439    pThis->pbLoadCommands = NULL;
     
    14451442    RTMemFree(pThis->pvaSymbols);
    14461443    pThis->pvaSymbols = NULL;
    1447     RTMemFree(pThis);
    1448     return rc;
     1444
     1445    return VINF_SUCCESS;
    14491446}
    14501447
     
    22942291
    22952292#endif
    2296 
    2297 static int kldrModMachOQueryImageUuid(PKLDRMODMACHO pThis, const void *pvBits, void *pvUuid, size_t cbUuid)
    2298 {
    2299     RT_NOREF(pvBits);
    2300 
    2301     memset(pvUuid, 0, cbUuid);
    2302     if (memcmp(pvUuid, pThis->abImageUuid, sizeof(pThis->abImageUuid)) == 0)
    2303         return VERR_NOT_FOUND;
    2304 
    2305     memcpy(pvUuid, pThis->abImageUuid, sizeof(pThis->abImageUuid));
    2306     return VINF_SUCCESS;
    2307 }
    23082293
    23092294
     
    27482733 * @param   pbSectBits      Pointer to the section bits.
    27492734 * @param   pFixupSect      The section being fixed up.
     2735 * @param   paSyms          Pointer to the symbol table.
     2736 * @param   cSyms           Number of symbols.
    27502737 * @param   NewBaseAddress  The new base image address.
    27512738 */
     
    29492936 * @param   pbSectBits      Pointer to the section bits.
    29502937 * @param   pFixupSect      The section being fixed up.
     2938 * @param   paSyms          Pointer to the symbol table.
     2939 * @param   cSyms           Number of symbols.
    29512940 * @param   NewBaseAddress  The new base image address.
    29522941 */
     
    37763765    {
    37773766        case RTLDRPROP_UUID:
    3778             rc = kldrModMachOQueryImageUuid(pThis, pvBits, (uint8_t *)pvBuf, cbBuf);
    3779             if (RT_FAILURE(rc))
    3780                 return rc;
    3781             cbBuf = RT_MIN(cbBuf, sizeof(RTUUID));
     3767            Assert(cbBuf >= sizeof(pThis->abImageUuid));
     3768            if (!ASMMemIsZero(pThis->abImageUuid, sizeof(pThis->abImageUuid)))
     3769            {
     3770                *pcbRet = sizeof(pThis->abImageUuid);
     3771                memcpy(pvBuf, pThis->abImageUuid, sizeof(pThis->abImageUuid));
     3772                rc = VINF_SUCCESS;
     3773            }
     3774            else
     3775                rc = VERR_NOT_FOUND;
    37823776            break;
    37833777
     
    37873781
    37883782        default:
    3789             return VERR_NOT_FOUND;
    3790     }
    3791     if (pcbRet)
    3792         *pcbRet = cbBuf;
     3783            rc = VERR_NOT_FOUND;
     3784            break;
     3785    }
    37933786    RT_NOREF_PV(pvBits);
    3794     return VINF_SUCCESS;
     3787    return rc;
    37953788}
    37963789
  • trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp

    r69111 r74646  
    226226}
    227227
     228static uint32_t g_iSegNo = 0;
     229static DECLCALLBACK(int) testEnumSegment1(RTLDRMOD hLdrMod, PCRTLDRSEG pSeg, void *pvUser)
     230{
     231    if (hLdrMod != g_hLdrMod || pvUser != NULL)
     232        return VERR_INTERNAL_ERROR_3;
     233    RTPrintf("Seg#%02u: %RTptr LB %RTptr %s\n", g_iSegNo++, pSeg->RVA, pSeg->cbMapped, pSeg->pszName);
     234
     235    return VINF_SUCCESS;
     236}
     237
    228238
    229239/**
     
    239249static DECLCALLBACK(int) testEnumSymbol1(RTLDRMOD hLdrMod, const char *pszSymbol, unsigned uSymbol, RTUINTPTR Value, void *pvUser)
    240250{
    241     RT_NOREF2(hLdrMod, pvUser);
     251    if (hLdrMod != g_hLdrMod || pvUser != NULL)
     252        return VERR_INTERNAL_ERROR_3;
    242253    RTPrintf("  %RTptr %s (%d)\n", Value, pszSymbol, uSymbol);
    243254    return VINF_SUCCESS;
     
    354365                rcRet++;
    355366            }
     367
     368            /*
     369             * Query various properties.
     370             */
     371            union
     372            {
     373                char        szName[256];
     374                uint32_t    iImpModule;
     375                RTUUID      Uuid;
     376            } uBuf;
     377            rc = RTLdrQueryProp(g_hLdrMod, RTLDRPROP_INTERNAL_NAME, &uBuf, sizeof(uBuf));
     378            if (RT_SUCCESS(rc))
     379                RTPrintf("tstLdr-3: Internal name: %s\n", uBuf.szName);
     380            else if (rc != VERR_NOT_FOUND && rc != VERR_NOT_SUPPORTED)
     381            {
     382                RTPrintf("tstLdr-3: Internal name: failed - %Rrc\n", rc);
     383                rcRet++;
     384            }
     385
     386            uint32_t cImports = 0;
     387            rc = RTLdrQueryProp(g_hLdrMod, RTLDRPROP_IMPORT_COUNT, &cImports, sizeof(cImports));
     388            if (RT_SUCCESS(rc))
     389            {
     390                RTPrintf("tstLdr-3: Import count: %u\n", cImports);
     391                for (uint32_t i = 0; i < cImports; i++)
     392                {
     393                    uBuf.iImpModule = i;
     394                    rc = RTLdrQueryProp(g_hLdrMod, RTLDRPROP_IMPORT_MODULE, &uBuf, sizeof(uBuf));
     395                    if (RT_SUCCESS(rc))
     396                        RTPrintf("tstLdr-3: Import module #%u: %s\n", i, uBuf.szName);
     397                    else
     398                    {
     399                        RTPrintf("tstLdr-3: Import module #%u: failed - %Rrc\n", i, rc);
     400                        rcRet++;
     401                    }
     402                }
     403            }
     404            else if (rc != VERR_NOT_FOUND && rc != VERR_NOT_SUPPORTED)
     405            {
     406                RTPrintf("tstLdr-3: Import count: failed - %Rrc\n", rc);
     407                rcRet++;
     408            }
     409
     410            rc = RTLdrQueryProp(g_hLdrMod, RTLDRPROP_UUID, &uBuf.Uuid, sizeof(uBuf.Uuid));
     411            if (RT_SUCCESS(rc))
     412                RTPrintf("tstLdr-3: UUID: %RTuuid\n", uBuf.Uuid);
     413            else if (rc != VERR_NOT_FOUND && rc != VERR_NOT_SUPPORTED)
     414            {
     415                RTPrintf("tstLdr-3: UUID: failed - %Rrc\n", rc);
     416                rcRet++;
     417            }
     418
     419            /*
     420             * Enumerate segments.
     421             */
     422            RTPrintf("tstLdr-3: Segments:\n");
     423            rc = RTLdrEnumSegments(g_hLdrMod, testEnumSegment1, NULL);
     424            if (RT_FAILURE(rc))
     425            {
     426                RTPrintf("tstLdr-3: Failed to enumerate symbols: %Rra\n", rc);
     427                rcRet++;
     428            }
    356429        }
    357430    }
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