static int sd_recovernext_of(sriter *i, sdindexheader *next) { sdrecover *ri = (sdrecover*)i->priv; if (next == NULL) return 0; char *eof = (char*)ri->map.p + ri->map.size; char *start = (char*)next; /* eof */ if (srunlikely(start == eof)) { ri->v = NULL; return 0; } /* validate crc */ uint32_t crc = sr_crcs(i->r->crc, next, sizeof(sdindexheader), 0); if (next->crc != crc) { sr_malfunction(i->r->e, "corrupted db file '%s': bad index crc", ri->file->file); ri->corrupt = 1; ri->v = NULL; return -1; } /* check version */ if (! sr_versioncheck(&next->version)) return sr_malfunction(i->r->e, "bad db file '%s' version", ri->file->file); char *end = start + sizeof(sdindexheader) + next->size + next->total + next->extension + sizeof(sdseal); if (srunlikely((start > eof || (end > eof)))) { sr_malfunction(i->r->e, "corrupted db file '%s': bad record size", ri->file->file); ri->corrupt = 1; ri->v = NULL; return -1; } /* check seal */ sdseal *s = (sdseal*)(end - sizeof(sdseal)); int rc = sd_sealvalidate(s, i->r, next); if (srunlikely(rc == -1)) { sr_malfunction(i->r->e, "corrupted db file '%s': bad seal", ri->file->file); ri->corrupt = 1; ri->v = NULL; return -1; } ri->actual = next; ri->v = next; return 1; }
static inline int sl_iterprepare(sliter *i) { srversion *ver = (srversion*)i->map.p; if (! sr_versioncheck(ver)) return sr_malfunction(i->r->e, "bad log file '%s' version", i->log->file); if (ssunlikely(i->log->size < (sizeof(srversion)))) return sr_malfunction(i->r->e, "corrupted log file '%s': bad size", i->log->file); slv *next = (slv*)((char*)i->map.p + sizeof(srversion)); int rc = sl_iternext_of(i, next, 1); if (ssunlikely(rc == -1)) return -1; if (sslikely(i->next)) return sl_itercontinue_of(i); return 0; }