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; }
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; }