Example #1
0
static CDFstatus ValidateAEDR (struct CDFstruct *CDF, vFILE *fp, OFF_T offset,
                               Int32 num, Int32 maxEntry, Logical zEntry,
                               Logical debug)
{
    struct AEDRstruct64 AEDR;
    size_t nBytes;
    CDFstatus status;

    if (debug)
#if defined(win32) || defined(__MINGW32__)
        printf("  Checking AEDR...@%I64d\n", offset);
#else
        printf("  Checking AEDR...@%lld\n", offset);
#endif
    status = ReadAEDR64 (fp, offset,
                         AEDR_RECORD, &AEDR, NULL,
                         AEDR_NULL);
    if (status != CDF_OK) return status;
    if ((!zEntry && AEDR.RecordType != AgrEDR_) ||
            (zEntry && AEDR.RecordType != AzEDR_))
        return QuitCDF ("CDF(AEDR): record type is invalid ", offset,
                        4, 1, &(AEDR.RecordType), 0, debug);
    if (AEDR.RecordSize < AEDR_BASE_SIZE64)
        return QuitCDF ("CDF(AEDR): record size is invalid ", offset,
                        8, 1, &(AEDR.RecordSize), 0, debug);
    if (AEDR.AEDRnext < 0)
        return QuitCDF ("CDF(AEDR): offset to next AEDR is invalid ", offset,
                        8, 1, &(AEDR.AEDRnext), 0, debug);
    /*  Check for "AEDR.AttrNum != num" is not included as some CDFs fail this
        check. Don't know why.... */
    /*
      if (AEDR.AttrNum < 0 || AEDR.AttrNum > GDR.NumAttr)
        return QuitCDF ("CDF(AEDR): attribute number is invalid ", offset,
                        4, 2, &(AEDR.AttrNum), &(GDR.NumAttr), debug);
    */
    if (!ValidDataType(AEDR.DataType))
        return QuitCDF ("CDF(AEDR): data type is invalid ", offset,
                        4, 1, &(AEDR.DataType), 0, debug);
    if (AEDR.Num < 0 || AEDR.Num > maxEntry)
        return QuitCDF ("CDF(AEDR): entry number is invalid ", offset,
                        4, 2, &(AEDR.Num), &(maxEntry), debug);
    if (AEDR.AEDRnext < 0)
        return QuitCDF ("CDF(AEDR): next AEDR offset is invalid : ", offset,
                        8, 1, &(AEDR.AEDRnext), 0, debug);
    if (AEDR.NumElems < 1 ||
            (STRINGdataType(AEDR.DataType) &&
             AEDR.NumElems > (AEDR.RecordSize - AEDR_VALUE_OFFSET64)))
        return QuitCDF ("CDF(AEDR): number of elements is invalid ", offset,
                        4, 1, &(AEDR.NumElems), 0, debug);
    nBytes = (size_t) (CDFelemSize(AEDR.DataType) * AEDR.NumElems);
    if (nBytes < 1 ||
            nBytes > (AEDR.RecordSize - AEDR_VALUE_OFFSET64))
        return QuitCDF ("CDF(AEDR): entry value size is invalid ", offset,
                        4, 1, &nBytes, 0, debug);
    if (AEDR.RecordSize > (AEDR_MAX_SIZE64 + nBytes))
        return QuitCDF ("CDF(AEDR): record size is invalid ", offset,
                        8, 1, &(AEDR.RecordSize), 0, debug);
    return CDF_OK;
}
Example #2
0
CDFstatus ValidateAttributeEntryLink (struct CDFstruct *CDF, vFILE *fp,
                                      Int32 num, Logical zEntry, OFF_T EDRhead,
                                      Int32 numEntries, Int32 maxEntry,
                                      Logical debug)
{
    CDFstatus status;
    OFF_T offset, nextAEDR;
    Int32 entryNum, lastNum, *visits;
    int ix, iy;

    offset = EDRhead;
    lastNum = 0;
    visits = (Int32 *) cdf_AllocateMemory (numEntries * sizeof(Int32), NULL);
    if (visits == NULL) return BAD_MALLOC;
    for (ix = 0; ix < numEntries; ++ix)
        visits[ix] = 0;
    ix = 0;
    while (offset != 0) {
        status = ValidateAEDR (CDF, fp, offset, num, maxEntry, zEntry, debug);
        if (status != CDF_OK) {
            cdf_FreeMemory (visits, NULL);
            return status;
        }
        status = ReadAEDR64 (fp, offset,
                             AEDR_NUM, &entryNum,
                             AEDR_AEDRNEXT, &nextAEDR,
                             AEDR_NULL);
        if (ix > 0) {
            for (iy = 0; iy < ix; ++iy) {
                if (visits[iy] == entryNum) {
                    cdf_FreeMemory (visits, NULL);
                    return QuitCDF ("CDF: entry number is repeating in an attribute entry link: ",
                                    4, 1, &entryNum, 0, debug);
                }
            }
        }
        if (ix == (int) numEntries) {
            cdf_FreeMemory (visits, NULL);
            return QuitCDF ("CDF: number of entries is more than maximum in an attribute entry link: ",
                            4, 1, &ix, 0, debug);
        }
        visits[ix] = entryNum;
        ++ix;
        if (lastNum < entryNum) lastNum = entryNum;
        offset = nextAEDR;
    }
    if (lastNum != maxEntry) {
        cdf_FreeMemory (visits, NULL);
        return QuitCDF ("CDF: last entry number is not the maximum entry number in  an attribute entry link: ",
                        4, 2, &lastNum, &maxEntry, debug);
    }
    cdf_FreeMemory (visits, NULL);
    return CDF_OK;
}